ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

【计算几何】闵可夫斯基差演示

【计算几何】闵可夫斯基差演示 本文涉及知识点数学 几何演示工具演示工具基于Cad支持Cad2013及更高版本。亲士库版本2026.9.4Cliper库版本2.0.0.0点击下载亲士数学演示工具箱相关定义闵可夫斯基和数学定义A ⊕ B { a b ∣ a ∈ A , b ∈ B } A \oplus B \{ab \mid a \in A,b \in B \}A⊕B{ab∣a∈A,b∈B}直观理解将B的副本放置到A的每个点上取并集。形态学膨胀腐蚀、开闭操作)和集合论的闵可夫斯基差和计算几何机器人学)的闵可夫斯基差不同。计算几何的闵可夫斯基差A ⊖ B { a − b ∣ a ∈ A , b ∈ B } A \ominus B\{a - b \mid a\in A,b\in B\}A⊖B{a−b∣a∈A,b∈B}。主要用途临界多边形(NFP)–排样算法的核心N F P ( P , Q ) P ⊕ ( − Q ) NFP(P,Q)P\oplus (-Q)NFP(P,Q)P⊕(−Q)。它表示零件P绕着Q滑动时参考点的轨迹。碰撞检测配置空间障碍)A ⊕ ( − B ) A \oplus (-B)A⊕(−B)定义了配置空间的障碍物区域。多边形偏移对多边形膨胀(向外偏移)本质求P ⊖ 圆盘。 P \ominus 圆盘。P⊖圆盘。操作说明一选择闵可夫斯基差的被减数(模板图像)。二选择闵可夫斯基的减数。注意只能选择多义线无论多义线是否闭合都当闭合处理。三计算出闵可夫斯基差。四将闵可夫斯基差的结果转成闭合多义线逆时针红色顺时针黄色。代码usingSystem;usingSystem.Collections.Generic;usingAutodesk.AutoCAD.ApplicationServices;usingAutodesk.AutoCAD.DatabaseServices;usingAutodesk.AutoCAD.EditorInput;usingAutodesk.AutoCAD.Geometry;usingAutodesk.AutoCAD.Runtime;usingClipper2Lib;usingQinShiZACad;usingQinShiMath;usingQinShiBase;[CommandMethod(MinkowskiDiff)]publicvoidMinkowskiDiff(){Minkowski(闵可夫斯基差,(p1,p2)Clipper.MinkowskiDiff(p1,p2,true));}[CommandMethod(MinkowskiSum)]publicvoidMinkowskiSum(){Minkowski(闵可夫斯基和,(p1,p2)Clipper.MinkowskiSum(p1,p2,true));}voidMinkowski(stringstrName,MinkowskiFunfun){QinShiZACad.CSelAEntitysel1newCSelAEntity($请选择一个多义线做为{strName}的被减数(模板图像)\n);varpr1sel1.Sel();if(pr1.Status!PromptStatus.OK){return;}QinShiZACad.CSelAEntitysel2newCSelAEntity($请选择一个多义线做为{strName}的减数\n);varpr2sel2.Sel();if(pr2.Status!PromptStatus.OK){return;}Polylinepl1,pl2;using(vartrCadBase.GetDefaultDatabase().TransactionManager.StartTransaction()){pl1tr.GetObject(pr1.ObjectId,OpenMode.ForRead)asPolyline;pl2tr.GetObject(pr2.ObjectId,OpenMode.ForRead)asPolyline;}if(nullpl1){return;}if(nullpl2){return;}PathDpath1PolylineToPath(pl1);PathDpath2PolylineToPath(pl2);PathsDpath3fun(path1,path2);PathDPolylineToPath(Polylinepl){PathDpathnewPathD();for(inti0;ipl.NumberOfVertices;i){varptpl.GetPoint2dAt(i);path.Add(newPointD(pt.X,pt.Y));}returnpath;}varplspath3.ToPolylines();for(inti0;iMath.Min(7,pls.Count);i){doubleareaClipper.Area(path3[i]);intiColor0;if(Math.Abs(area)1e-9){//退化情况iColor0;}elseif(area0){iColor1;}else{iColor2;}pls[i].ColorIndexiColor;//外边界红色孔洞黄色}CadBase.AddEnitys(pls.ToArray(),0,CadBase.GetDefaultDatabase());}delegatePathsDMinkowskiFun(PathDpath1,PathDpath2);publicstaticclassPolylineExtensions2{/// summary/// PathD 转回 Polyline不关联数据库/// /summarypublicstaticPolylineToPolyline(thisPathDpath,doubletolerance1e-4){PolylineplnewPolyline();for(inti0;ipath.Count;i){PointDptpath[i];pl.AddVertexAt(i,newPoint2d(pt.x,pt.y),0,0,0);}// 如果 PathD 首尾点足够接近差值小于容差则认为它是闭合的if(path.Count1){PointDfirstpath[0];PointDlastpath[path.Count-1];//if (Math.Abs(first.x - last.x) tolerance // Math.Abs(first.y - last.y) tolerance)//{// pl.Closed true;//}// 只有至少3个点且面积非零的路径才视为有效闭合多边形if(path.Count3Math.Abs(Clipper.Area(path))1e-6){pl.Closedtrue;}}returnpl;}/// summary/// 将 PathsD 转换为 Polyline 列表/// /summarypublicstaticListPolylineToPolylines(thisPathsDpaths){varpolylinesnewListPolyline();foreach(varpathinpaths){// 调用已有的单个 PathD → Polyline 扩展方法polylines.Add(path.ToPolyline());}returnpolylines;}}错误解法直接通过前三个点的差乘判断是逆时针或顺序时针是错误的一三点共线。二可能是凹角。用clipper库的有向面积判断更合理。查看视频https://edu.csdn.net/course/detail/41418如果视频审核中可以看图。将原点和被减数一起平移原点在闵可夫斯基差上则被减数和减数相切。边长100的正方形左下角是圆点作为模板图像(被减数)下面部分闵可夫斯基差的颜色不对工具是正确的。矩形原图效果图黄色是结果凹多边形原图效果图黄色是结果凸多边形原图效果图红色黄色是结果正100多边形模拟圆作为模板图像多边形是否重叠如果两个多边形P、Q重叠则其闵可夫斯基差D必定包括原点。如果两个多边形不重叠则P与Q最小距离等于原点到D的最小距离。扩展阅读计算几何为骨排样优化为魂作品亲士CAD工具箱经典文章推荐二维排样万物皆数学查阅鄙人的博文请点击博文下载学院导航活到老学到老。明朝中后期大约50%的进士能当上堂官(副部及更高)能当上堂官的举人只有十余人。子墨子言之事无终始无务多业。也就是我们常说的专业的人做专业的事。测试环境操作系统win7 开发环境 VS2019C17或者 操作系统win10 开发环境 VS2022C17如无特殊说明本算法用**C**实现。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进