AutoCAD C# 判断多边形与点的位置关系

书上说,射线法和叉乘法感觉都不完整

 

下面我分享我写的基于AutoCAD BREP算法

 

 var ed = acApp.Application.DocumentManager.MdiActiveDocument.Editor;
 var peo = new PromptEntityOptions("Select a PolyLine : ");
 peo.SetRejectMessage("Only PolyLine");
 peo.AddAllowedClass(typeof(Polyline), true);
 var per = ed.GetEntity(peo);
 if (per.Status != PromptStatus.OK) return;
 var ppo = new PromptPointOptions("指定测试点");
 var ppr = ed.GetPoint(ppo);
 if (ppr.Status != PromptStatus.OK) return;
 var rtn = "无法检测";
 using (var tr = per.ObjectId.Database.TransactionManager.StartTransaction())
 {
     var poly = tr.GetObject(per.ObjectId, OpenMode.ForRead) as Polyline;//一定要读,不要写
     //看点是否在曲线上/
     var ptOnPolyline = poly.GetClosestPointTo(ppr.Value, false);
     if (ptOnPolyline.DistanceTo(ppr.Value) < 0.001)
     {
         acApp.Application.ShowAlertDialog(PointContainment.OnBoundary.ToString());
         return;
     }
     var pts = Enumerable .Range(0, poly.NumberOfVertices) .Select(i => poly.GetPoint3dAt(i));
     if (!poly.Closed && ! pts.FirstOrDefault().IsEqualTo(pts.LastOrDefault(),new Tolerance(0.0001,0.0001)))
     {
         acApp.Application.ShowAlertDialog("多段线不封闭无法检测");
         return;
     }
     //转为面域
     var reg = Autodesk.AutoCAD.DatabaseServices.Region.CreateFromCurves(new DBObjectCollection { poly }).Cast<Autodesk.AutoCAD.DatabaseServices.Region>().FirstOrDefault();
     using (var brep = new Brep(reg))
     {
         if (brep != null)
         {
             using (var ent = brep.GetPointContainment(ppr.Value, out PointContainment resultt))
             {
                 rtn = ent is Autodesk.AutoCAD.BoundaryRepresentation.Face ? PointContainment.Inside.ToString() : resultt.ToString();
             }
         }
     }
 }
 acApp.Application.ShowAlertDialog(rtn);

 

posted @ 2024-09-16 09:21  南胜NanSheng  阅读(54)  评论(0编辑  收藏  举报