ベジェ曲線の長さ測定できた、C#とWPF
の続きで今度は曲線Pathの長さを測る
GetFlattenedPathGeometryとGetPointAtFractionLengthを使って測る
今回のアプリのダウンロード先
半径50の円周で確認
円周は2*パイ*半径なので
2*3.14*50=314になればいい
結果は314.2、小数点2桁目で四捨五入しているからこれであっている
ベジェ曲線の長さ測定
水色の線の長さは
966.3と測定された
だいたいあっているはず
公差と分割数
GetFlattenedPathGeometryに渡すTolerance(公差)が102の場合
得られる近似直線は雑になる(細い青線)
なのでこれを細かく測定しても
いい結果は得られない
公差0で丁寧な近似直線でも分割数が少ないと
これもかなり不正確
測定値は赤の直線の長さの合計
より正確に測るには
GetFlattenedPathGeometryに渡す引数Tolerance(公差)は0を指定して
分割数を増やしてGetPointAtFractionLengthで細かく測定する
分割数をより増やしてみたら
972まで増やしたら966.7になった
200のときでも966.3だったので、あんまり変わらない
もっと長く複雑な曲線なら増やしたほうが良さそうだけど
この程度の曲線なら200で十分かな
デザイン画面
C#コード
もっと正確に測りたいときはGetFlattenedPathGeometryで得た近似直線のPathGeometryから直接測ればいいけど、めんどくさそう
これを計算すればかなり正確になるんだろうけど多すぎるw
だったら公差の値を大きくすればいいけどそれなら分割数で指定しても同じかなと
それに今回はPolyLineSegmentで得られたけど、元のPathによってはLineSegmentとかになることもあったり、同じ座標が何回も出てきたりすることもあったので、近似直線のPathGeometryから直接測定するのはめんどくさそうだったので、やっぱりGetPointAtFractionLengthで分割がラクでいいかなあ
Segment数が9でこの中にPolyLineSegmentとLineSegmentが交互に混じっていたはず
パスマークアップ構文で円を描く
半径50の円の場合は
PathGeometry Figures="M100,100 A50,50 0 1 1 100,200 A50,50 0 1 1 100,100"
パスマークアップ構文に円はないので、円弧を2つ組み合わせて書く
"M100,100 A50,50 0 1 1 100,200"
Mは始点、Aからが円弧で
50,50が半径のx,y
0 回転角度
1 よくわからんけど1か0を指定する
1 よくわからん
100,200 終点のx,y
これで右半分描けたので
左半分を足して
"M100,100 A50,50 0 1 1 100,200 A50,50 0 1 1 100,100"
左半分は終点が100,100になるだけで右半分と同じでいいみたい
これで円になる
なった
→なかった
23時09分追記
PathGeometryクラスのCreateFromGeometryメソッドを使えば
var ellipsePath = new Path();
ellipsePath.Data = new EllipseGeometry(new Point(100, 100), 50, 50);
PathGeometry pg = PathGeometry.CreateFromGeometry(ellipsePath.Data);
または
var pg = PathGeometry.CreateFromGeometry(new EllipseGeometry(new Point(100, 100), 50, 50));
とか
これでEllipseGeometryをPathGeometryに変換できたからGetFlattenedPathGeometry使える、また余計なことしてたわw
参照したところ
GetPointAtFractionLength – digitalnetbizz's WebLog
https://blogs.msdn.microsoft.com/digitalnetbizz/2007/04/05/getpointatfractionlength/
C#のWPFでWaitingCircleコントロールを作る - Ararami Atudioパスマークアップ構文で円を描くのはここがわかりやすかった
https://araramistudio.jimdo.com/2016/11/24/wpf%E3%81%A7waitingcircle%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%AB%E3%82%92%E4%BD%9C%E3%82%8B/
コード
関連記事
2018/6/14は4日前
曲線Pathを近似の直線PathにするGetFlattenedPathGeometry使ってみた ( ソフトウェア ) - 午後わてんのブログ - Yahoo!ブログ
https://blogs.yahoo.co.jp/gogowaten/15549065.html
2018/6/15は3日前
Pathを等分したところに印と角度を表示してみた、GetPointAtFractionLength ( ソフトウェア ) - 午後わてんのブログ - Yahoo!ブログ
https://blogs.yahoo.co.jp/gogowaten/15550562.html
2018/6/16はおととい
GetPointAtFractionLengthで分割した座標からのPathの長さ測定の確認 ( ソフトウェア ) - 午後わてんのブログ - Yahoo!ブログ
https://blogs.yahoo.co.jp/gogowaten/15551929.html