« ◇原発ロボットの謎 | トップページ | なぜ無いJavaのStringの==比較をエラーとするモード »

◇数式をグラフ化してcanvasに描画する

メモ:万能ではなくてもメモがあれば心理的壁が低くなる

 数式をグラフ化してcanvasに表示する

前の記事 ★星は暗いのではなく小さいのです-4 で数式をグラフ化してcanvas上に表示しました。

こんな感じのものです。

グラフ-1

軸スケール表示をn倍ベースにもできます (この例ではX軸表示を63241で1光年としています、Y軸は計算式で対数としています)。

グラフ-2

上のグラフは次のコードで表示しています。

Canvasにグラフを描画するhiGraphクラス(後述)を作り、 パラメタにCanvasと領域サイズを設定し、数式を与え、表示しています。
「像の明るさ(5mm)」などの文字列はhiGraphとは別に描画しています。

 hiGraphクラスの使い方

hiGraphは次のAPIを持ちます。全てstaticメソッドです。

// 領域をクリアし縦軸、横軸を表示する
hiGraph.axis(param_:hiGraph_Param
            ,clear_  :boolean     // 領域をクリアする
                                  // 省略時 true
            ,x_color_:string      // 横軸色
                                  // 省略時 "black"
            ,y_color_:string      // 縦線色
                                  // 省略時 "black"
            );
// X軸スケール(縦線と値)を描く
hiGraph.xScale(param_:hiGraph_Param
              ,start_     :number // 開始値
              ,step_      :number // ステップ値
              ,unit_start_:number // 値文字表示の開始値
                                  // 省略時 start_
              ,unit_step_ :number // 値文字表示のステップ値
                                  // 省略時 step_
              ,unit_str_  :string // 値文字表示の単位名
                                  // 省略時 ""
              );
// Y軸スケール(横線と値)を描く
hiGraph.yScale(param_:hiGraph_Param
              ,start_     :number // 開始値
              ,step_      :number // ステップ値
              ,unit_start_:number // 値文字表示の開始値
                                  // 省略時 start_
              ,unit_step_ :number // 値文字表示のステップ値
                                  // 省略時 step_
              ,unit_str_  :string // 値文字表示の単位名
                                  // 省略時 "
              );
// 式の値をグラフに表示する
hiGraph.calc(param:hiGraph_Param
            ,式_    :any          // y=式_(x,arg) の形の式
                                  // 式はxがstart_からend_までstep_単位で
                                  // 変化しながら繰り返し呼ばれる
            ,color_ :string       // 色
                                  // 省略時 black
            ):hiGraph_Point[];
// 式の値をグラフに表示する
hiGraph.draw(param:hiGraph_Param
            ,式_    :any          // y=式_(x,arg) の形の式
                                  // 式はxがstart_からend_までstep_単位で
                                  // 変化しながら繰り返し呼ばれる
            ,arg_   :any          // 式(x,arg_)で渡す
                                  // 省略時 undefinedが式に渡る
            ,color_ :string       // 色
                                  // 省略時 black
            ,start_ :number       // 開始x値
                                  // 省略時 param_.range_x_s
            ,end_   :number       // 終了x(含む)
                                  // 省略時 param_.rabge_x_e
            ,step_  :number       // ステップ
                                  // 省略時 param_から計算
            ):hiGraph_Point[];
// X軸スケール(縦線と値)を利用者のヒント関数を用いて表示する
hiGraph.xScaleWithFunc(param_ :hiGraph_Param
                      ,func_  :any // ヒント関数(index,値配列,オプション)
                          // 戻り値 { x_        :number, // x値
                          //          text_     :string, // 表示する文字列
                          //          line_color:string, // 文字列の色
                          //          text_color:string} // テキストの色
                          //  null:表示しない
                          //    text_     =null        : テキストを表示しない
                          //    line_color="#00000000" : 線を表示しない
                      ,values_:Array // 値の並び
                      ,option_:any
                      );
// y軸スケール(横線と値)を利用者のヒント関数を用いて表示する
hiGraph.yScaleWithFunc(param_ :hiGraph_Param
                      ,func_  :any // ヒント関数(index,値配列,オプション)
                          // 戻り値 { y_        :number, // x値
                          //          text_     :string, // 表示する文字列
                          //          line_color:string, // 文字列の色
                          //          text_color:string} // テキストの色
                          //  null:表示しない
                          //    text_     =null        : テキストを表示しない
                          //    line_color="#00000000" : 線を表示しない
                      ,values_:Array // 値の並び
                      ,option_:any
                      );
----
hiGraph.drawの戻り値は次の型の配列です。実際に表示した位置情報が入ります。
class hiGraph_Point {
   value:number;  // 値
   x:number;      // canvas内横表示位置(pix)
   y:number;      // canvas内縦表示位置(pix) 上から下
   }

第一引数のparamで領域の定義を行います。

class hiGraph_Param {
   // 利用者設定情報
   canvas   :HTMLCanvasElement;    // canvas
   margin_x :number; // 左右のマージン(pix)
   margin_y :number; // 上下のマージン(pix)
   offset_x :number; // X軸の位置(pix:左から)
   offset_y :number; // Y軸の位置(pix:下から)
   cut_x    :number; // X終端側カット(pix:省略可)
   cut_y    :number; // Y終端側カット(pix:省略可)
   range_x_s:number; // Xの開始値 
   range_y_s:number; // Yの開始値
   range_x_e:number; // Xの終了値
   range_y_e:number; // Yの終了値 
   font_size:number; // フォントサイズ(pix) 省略可
   clone():hiGraph_Param{..} // データ複製
   }

offset_xが負の値の場合、右からのオフセットとなり、軸も右に置かれます。
cut_xは正負は無視されます。

offset_yが負の値の場合、上からのオフセットとなり、軸も上に置かれます。
cut_yは正負は無視されます。

 数式の代わりに値配列を表示する例

ここでは数式による数値生成ではなく、予め配列に入れられた数値を表示する例を載せます。

draw()メソッドに値配列を指定すれば、 利用者定義の「式」には引数として値配列が渡されます。

 2値表示

左にスケールを置くグラフと右にスケールを置くグラフ2つ同位置に重ね合わせ2値グラフを作ってみました。

2重グラフ

このグラフでは、目盛を利用者関数を使って出しています。詳細説明は今後追加します。

コードを載せます。

 hiGraphのTypeScript版

当初、javascriptで作成してありましたが、APIの互換をほぼ保ったまま、TypeScript化しました。
calcを純粋に数式表示のcalcと値配列によるグラフ表示を行うdrawに分離しました。drawに関してはcolor引数と値配列引数の順番を入れ替えました。
この例では省いていますが、typeDoc用の記述も追加されました。

 ダウンロード

TypeScriptコードとビルド用バッチおよびビルド結果のjavascriptが次の場所からダウンロード出来ます。
二値グラフサンプルも入っています。

higraphsrc.zip

次のものから構成されます。

・A00_clean.bat     : 二次ファイルを削除する
・A01_hi_build.bat  : hiGraph.jsをビルドする
・hiGraph.ts        : ソース
・hiGraph.js        : 生成されたjavascript
・hiGraph.d.ts      : 他のTypeScriptから呼び出すための定義

・A02_bi_build.bat  : biValGraph.js(二値グラフサンプル)をビルドする
・biValGraph.ts     : 二値グラフサンプル
・biValGraph.js     : 生成されたjavascript
・biValGraph.htm    : 二値グラフ表示html

|

« ◇原発ロボットの謎 | トップページ | なぜ無いJavaのStringの==比較をエラーとするモード »

トラックバック


この記事へのトラックバック一覧です: ◇数式をグラフ化してcanvasに描画する:

« ◇原発ロボットの謎 | トップページ | なぜ無いJavaのStringの==比較をエラーとするモード »