午後わてんのブログ

ベランダ菜園とWindows用アプリ作成(WPFとC#)

区間ごとの描画で頂点追加場所判定が正確になった複数の画像を並べて重ねて1枚の画像にするPixtack紫陽花2.4.21.106

前回、2015/01/04は1日前
 
 
線上に頂点の追加時の誤判定が無くなったはず、実際に線を描いて判定するようにした
閉じた曲線で頂点数が3の時に頂点を消去した場合エラーになっていたのを修正
 
 
頂点の追加時の判定をより正確に
イメージ 4
今までは各頂点とクリックした座標の角度で判定していたけど
実際に1本1本線を描いてクリックした座標の色の有無で判定するようにした
 
イメージ 5
ベジェ曲線に最低限必要な頂点数は4つで
それ以上のときは3の倍数+1が必要
それ以外の時は線が描画されない
線の上になる頂点の番号は0から数えるとちょうど3の倍数になるみたい
 
 
頂点の追加の判定
イメージ 2
0-1区間、1-2区間、2-3区間の3つをそれぞれ色を付けて描画して
クリックした座標と合わせてみて色がついていればその区間に新頂点を追加すればいい、っていう判定方法
区間ごとの描画は直線なら単純で0-1区間ならそのまま0-1だし
1-2区間なら1を引いて0-1、2-3区間なら2を引いて0-1にって順番にするだけ
問題は曲線
曲線は隣の頂点の影響を受ける
イメージ 1
1-2区間の画像がほしい時でもその隣の0と3の座標によって変化するので
0と3も必要になる
けど
必要なのは1-2区間だけで0-1区間と2-3区間には描画したくない
この要求をかなえるのがVBにはちゃんと用意されていた
DrawCurve(Pen、Point、offset、NumberOfSegments)
普通の曲線の描画に使うDrawCurveでOffsetとNumberOfSegmentsっていう
引数を渡せば必要な区間以外も考慮した必要な区間だけ曲線を描画しれくれる、便利
Offsetがどこから描画するかの指定
NumberOfSegmentsがOffsetから描画する区間の指定
 
今回使うのは必ず1区間だけだからNumberOfSegmentsは必ず1になる
描画に必要な頂点数は開いた線なら3、閉じた線なら4のどちらかだから3か4で固定して
そうするとOffsetは0か1になるとか始点終点の関係とか順番とか考えて
イメージ 3
まとめたらこうなった
意外だったのが頂点数が3しか無い図形もそれ以上の場合と同じだったこと
 
直線の場合
 
直線以外の場
必要頂点数は3
  開いた線でOffsetが始点の場合
開いた線でSegmentsが終点の場合
それ以外の場合
必要頂点数は4
Segmentsに始点終点が無くて開いた線の場合
それ以外の場合
Offsetが始点の場合
Offsetが終点の場合
終点から始点の場合
それ以外の場合
 
これで欲しい区間の画像が得られるので
あとはできあがった画像(Bitmap)に対してGetPixel(クリックした座標)で
色が付いているかどうかがわかるので、これで判定
線の上に頂点を追加するのはこれで出来た、複数の線が重なっている場合は
頂点番号が小さいほうが優先される
 
出来上がってみて思ったのは今までの角度からの判定より簡単だった
それもDrawCurveに区間指定の描画があったからこそ
これで線の上での角度による頂点追加判定は必要なくなったんだけど
線以外の追加では今までどおり角度判定なので誤判定が出る
今回追加したベジェ曲線は一個追加するごとに3つ増えることにしないとつじつまが合わないし、その増えた2点は曲がり具合も見ないとおかしくなりそう
 
 
ダウンロード先
 
ヤフーボックス
テスト05-2パネル追加_20150105.zip
 
次回、2015/01/06は1日後