本日は、C#の記事です。
点のパスが自己交差しているか、判定したい場面がでてきました。
例えば
①のパスは、自己交差していないが
②のパスは、自己交差しています。
以下のようなやり方で判定しました。
CombinedGeometryをGeometryCombineMode.Intersectを利用します。
Intersectで結合させると、混ざっている結合部分だけを、抜きだします。
①、②それぞれの図形で、その図形を含む、大きな四角形と結合させます。
Intersectの結合結果に対してGetFlattenedPathGeometryで何個の多角形が
できているかを判定します。
1つだった場合、自己交差なし。
2つ以上だった場合、自己交差しているとなります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
PathFigure exteriorFigure = new PathFigure(); exteriorFigure.StartPoint = new Point(0, 0); exteriorFigure.Segments.Add(new LineSegment(new Point(0,1000),true)); exteriorFigure.Segments.Add(new LineSegment(new Point(1000, 1000), true)); exteriorFigure.Segments.Add(new LineSegment(new Point(1000, 0), true)); PathGeometry exteriorGeometry = new PathGeometry(); exteriorGeometry.Figures.Add(exteriorFigure); PathFigure testFigureA = new PathFigure(); testFigureA.StartPoint = new Point(50, 50); testFigureA.Segments.Add(new LineSegment(new Point(50, 100), true)); testFigureA.Segments.Add(new LineSegment(new Point(200, 100), true)); testFigureA.Segments.Add(new LineSegment(new Point(200, 50), true)); PathGeometry testAGeometry = new PathGeometry(); testAGeometry.Figures.Add(testFigureA); CombinedGeometry cg = new CombinedGeometry(); cg.GeometryCombineMode = GeometryCombineMode.Intersect; cg.Geometry1 = testAGeometry; cg.Geometry2 = exteriorGeometry; PathGeometry intersectGeometory = cg.GetFlattenedPathGeometry(); if(intersectGeometory.Figures.Count == 1) { Debug.WriteLine("自己交差していない");//こちらに判定されます } else { Debug.WriteLine("自己交差している"); } PathFigure testFigureB = new PathFigure(); testFigureB.StartPoint = new Point(50, 50); testFigureB.Segments.Add(new LineSegment(new Point(200, 100), true)); testFigureB.Segments.Add(new LineSegment(new Point(50, 100), true)); testFigureB.Segments.Add(new LineSegment(new Point(200, 50), true)); PathGeometry testBGeometry = new PathGeometry(); testBGeometry.Figures.Add(testFigureB); CombinedGeometry cg2= new CombinedGeometry(); cg2.GeometryCombineMode = GeometryCombineMode.Intersect; cg2.Geometry1 = testBGeometry; cg2.Geometry2 = exteriorGeometry; PathGeometry intersectGeometory2 = cg2.GetFlattenedPathGeometry(); if (intersectGeometory2.Figures.Count == 1) { Debug.WriteLine("自己交差していない"); } else { Debug.WriteLine("自己交差している");//こちらに判定されます } |
このようなコードになります。参考になる部分がありましたら。
ちよっと休憩時間にどうでしょうか・・・
Android 無料 ゲーム
落とし系ゲーム「スプーンで落とせ! (動物のジャングルレストラン)」
回転するテーブル上に食べ物がのっていて、ボタンを押すとスプーンがクレーンのように動き出します。タイミングよく、食べものをお皿に落としてください。
動物のお客様が順番に訪れます。動物たちのご注文に答えることができると、コインを獲得できます。
たとえば、おサルがお客さんの時はバナナが注文されるので、バナナを落とせるように頑張りましょう!