【RTK22】グラフをクリックして元データを逆引きした<ややこしい>

前回は、XYグラフを拡大縮小したのですが、拡大した座標の速度データをみたいので
クリックしたら、その点での速度値を表示する機能を追加しました。
、拡大縮小表示より複雑なプログラムになって、アイデア含めて2週間がかりでした。
時系列グラフのカーソル同期とクリックしたポイントの範囲も拡大縮小表示します。

●逆引き原理
①グラフをプロットするときに、ソースBITMAPにプロットするのですが、その時のプロット座標px,pyを
データ配列の行番号とリンクさせる配列 prownx[rowNo]=pxとprowny[rpwNo]=pyを作成しておきます。

②拡大したグラフpictureBox3内でクリックされた座標を、ソースBTIMAP座標に変換して、(src_cp3x,src_cp3y)を
計算します。

③表示しているブロック内の全データをforループで、回しながら、プロット座標(prownx[i],prowny[i])と
クリック座標(src_cp3x,src_cp3y)の距離を計算して、最小距離のプロット座標のデータ番号を求めます。

●グラフテクニック 備忘録
①クリック逆引きで得られたデータを時系列グラフにカーソルと同期させる
最初に時系列グラフとXYグラフのソースビットマップを作っておきます。
時系列ソースから指定ブロックのデータをプロットします。
カーソルを逆引きデータ番号に従って、プロットします。
時系列グラフのpictureBox1は、大きいので、小さな時系列グラフpictureBox4を作って、
pictureBox1に書き込むときに同時にpictureBox4にも縮小書き込みしておきます。

②クリックして拡大した範囲枠を表示する機能
pictureBox2で、ブロック全体を表示して、拡大したい部分をクリックすると、白い拡大枠を表示します。
マウスホイールで指定した拡大縮小率に合わせた枠のサイズになるので、所望の範囲をクリックとホイールで
選定できます。

※白い枠を毎回消す方
クリック毎に、枠の位置が変わるので、元データに戻してから再度新たな枠を描画します。
そのために、クリック枠専用のビットマップp2wBitmapを用意します。
クリックされたときは、毎回更新します。

//———-クリック枠表示——————-
if(wakuflag==1)
{p2wBitmap = new Bitmap(p2sBitmap);//p2Bitmapをコピー
Graphics g2w = Graphics.FromImage(p2wBitmap);double scale_xy2 = (double)( xyBitmap.Width/p2Bitmap.Width );
int wakuw =(int)( magniw / scale_xy2);
int wakuh= (int)(magnih / scale_xy2);
int wakutopx = (int)(cp2x – wakuw / 2);
int wakutopy = (int)(cp2y – wakuh / 2);g2w.DrawRectangle(p,wakutopx,wakutopy,wakuw,wakuh);
pictureBox2.Image = p2wBitmap;
}

※全プログラムGISTにアップしておきます。https://gist.github.com/dj1711572002/e4da54cb5af1f2782d5a7f8f358c4afa

●DrawImage拡大手法の欠点の対策
右の拡大画像で改良点に気づきました。DrawImageを使って拡大しているのですが、全体を表示するグラフでは
ポイントのサイズを大きくしないと、見えないので、FillEllipseサイズを16ドットにしてありますが、これを
拡大するとドットが大きすぎて、ドットがつながってしまって、グラフが見えなくなってしまいます。
そこで、FillEllipseサイズを1ドットにすると全体グラフが描画されないので、拡大用に1ドットサイズに描画する新たなBitmapを用意してそれを拡大用に使うことにしました。

●以後
本来の目的は、F9Pの遅い周期をM9Nの25Hz速度データを積分して位置を補間プロットすることです。
次回、ようやくM9Nのデータもプロットして、F9Pとの補間の実験結果を解析します。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です