現在、Canvasに含まれるPolylineと引数で指定したPolylineの交差する座標の取得をしたいと思っています。
しかし、明らかに交差してないときにも座標値が複数取得されてしまいます。
アルゴリズムは線分の交差のアルゴリズムを使っています。
コードはこれでよいのでしょうか?やはりスクリーン座標からデカルト座標への変換が必要なのでしょうか?数学に疎いので難航しております。
ちなみにコードは下の通りです。
C#
1List<Point> Intersect(Canvas canvas, Polyline eraser) 2{ 3 List<Point> intersections = new List<Point>(); 4 5 foreach (Polyline target in canvas.Children) 6 { 7 for (int i = 0; i < target.Points.Count - 1; i++) 8 { 9 for (int j = 0; j < eraser.Points.Count - 1; j++) 10 { 11 Point p1, p2, p3, p4; 12 p1 = target.Points[i]; 13 p2 = target.Points[i + 1]; 14 p3 = eraser.Points[j]; 15 p4 = eraser.Points[j + 1]; 16 17 double d = (p2.X - p1.X) * (p4.Y - p3.Y) - (p2.Y - p1.Y) * (p4.X - p3.X); 18 19 //2つの線分が平行 20 if (d == 0) 21 continue; 22 23 double r = ((p4.Y - p3.Y) * (p3.X - p1.X) - (p4.X - p3.X) * (p3.Y - p1.Y) )/ d; 24 25 double s = ((p2.Y - p1.Y) * (p3.X - p1.X) - (p2.X - p1.X) * (p3.Y - p1.Y)) / d; 26 27 if (r < 0.0 || r > 1.0) 28 continue; 29 if (s < 0.0 || s > 1.0) 30 continue; 31 32 double x, y; 33 34 x = p1.X + r * (p2.X - p1.X); 35 y = p1.Y + r * (p2.Y - p1.Y); 36 37 intersections.Add(new Point(x, y)); 38 } 39 } 40 } 41 return intersections; 42}

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/02/18 03:47