Bladeren bron

mxg:修正射线与多个连续点平行判定错误bug

mengxiangge 6 jaren geleden
bovenliggende
commit
e6068973e9
2 gewijzigde bestanden met toevoegingen van 46 en 22 verwijderingen
  1. 28 10
      MBI/SAGA.DotNetUtils/Geometry/Geometry2d.cs
  2. 18 12
      MBI/SAGA.MBI/ToolCommand.cs

+ 28 - 10
MBI/SAGA.DotNetUtils/Geometry/Geometry2d.cs

@@ -747,6 +747,7 @@ namespace SAGA.DotNetUtils.Geometry
             l1.Start = q;
             l1.End = new PointD(INFCONST, q.Y);
             n = polygon.Length;
+            PointD originStart = null;
             for (i = 0; i < n; i++)
             {
                 var start = polygon[i];
@@ -757,16 +758,33 @@ namespace SAGA.DotNetUtils.Geometry
                 l2.End = end;
                 if (Online(l2, q))
                     return 1; // 如果点在边上,返回1 
-                if (IntersectA(l1, l2) || // 相交且不在端点 
-                    Online(l1, end) && // 第二个端点在射线上 
-                    (!Online(l1, end2) && /* 前一个端点和后一个端点在射线两侧 */
-                     Multiply(start, end, l1.Start) *
-                     Multiply(end, end2, l1.Start) > 0 ||
-                     Online(l1, end2) && /* 下一条边是水平线,前一个端点和后一个端点在射线两侧  */
-                     Multiply(start, end2, l1.Start) * 
-                     Multiply(end2,end3, l1.Start) > 0
-                    )
-                ) c++;
+                if (IntersectA(l1, l2)) // 相交且不在端点 
+                {
+                    c++;
+                }
+                else if(Online(l1, end))// end点在射线上 
+                {
+                    //判断下一个点end2是否在射线上
+                    if (Online(l1, end2))
+                    {
+                        /* 下一条边是水平线,前一个端点和后一个端点在射线两侧  */
+                        originStart = originStart ?? start;
+                        var multiplyresult = Multiply(originStart, end2, l1.Start) *
+                                         Multiply(end2, end3, l1.Start);
+                        if (multiplyresult > 0)
+                        {
+                            c++;
+                            originStart = null;
+                        }
+                    }
+                    else
+                    {
+                        /* 前一个端点和后一个端点在射线两侧 */
+                        if (Multiply(start, end, l1.Start) *
+                            Multiply(end, end2, l1.Start) > 0)
+                            c++;
+                    }
+                }
             }
             if (c % 2 == 1)
                 return 0;

+ 18 - 12
MBI/SAGA.MBI/ToolCommand.cs

@@ -131,22 +131,28 @@ namespace SAGA.MBI
                 newPoints.Add(new Geometry2D.PointD(200, 200));
                 newPoints.Add(new Geometry2D.PointD(0, 400));
 
-                //外点
+                //外点 ==2
                 var testPoint = new Geometry2D.PointD(-100, 200);
-                int flag = Geometry2D.InSidePolygon( newPoints.ToArray(),testPoint ); ;
-
+                int flag = Geometry2D.InSidePolygon( newPoints.ToArray(),testPoint ); 
+                //==0
                 var testPoint2 = new Geometry2D.PointD(50, 200);
                 int flag2 = Geometry2D.InSidePolygon(newPoints.ToArray(), testPoint2);
 
-                List<Geometry2D.PointD> newPoints2 = new List<Geometry2D.PointD>();
-                newPoints.Add(new Geometry2D.PointD(0, 0));
-                newPoints.Add(new Geometry2D.PointD(400, 0));
-                newPoints.Add(new Geometry2D.PointD(400, 400));
-                newPoints.Add(new Geometry2D.PointD(200, 600));
-                newPoints.Add(new Geometry2D.PointD(0, 400));
-                //外点
-                var testPoint3 = new Geometry2D.PointD(-100, 600);
-                int flag3 = Geometry2D.InSidePolygon(newPoints.ToArray(), testPoint); ;
+                List<Geometry2D.PointD> newPoints3 = new List<Geometry2D.PointD>();
+                newPoints3.Add(new Geometry2D.PointD(0, 0));
+                newPoints3.Add(new Geometry2D.PointD(400, 0));
+                newPoints3.Add(new Geometry2D.PointD(400, 200));
+                newPoints3.Add(new Geometry2D.PointD(200, 200));
+                newPoints3.Add(new Geometry2D.PointD(150, 200));
+                newPoints3.Add(new Geometry2D.PointD(100, 200));
+                newPoints3.Add(new Geometry2D.PointD(50, 200));
+                newPoints3.Add(new Geometry2D.PointD(0, 400));
+                //内点==0
+                var testPointI3 = new Geometry2D.PointD(25, 200);
+                int flagI3 = Geometry2D.InSidePolygon(newPoints3.ToArray(), testPointI3);
+                //外点==2
+                var testPointO3 = new Geometry2D.PointD(-25, 200);
+                int flagO3 = Geometry2D.InSidePolygon(newPoints3.ToArray(), testPointO3);
 
                 var fi = commandData.Application.PickElement("请选择图元") as FamilyInstance;
                 if (fi == null) return Result.Succeeded;