cad生成最小包围盒lisp_cad.net 葛立恒凸包算法和面积最小包围盒

本文介绍了使用葛立恒凸包算法求解CAD中的最小包围盒问题。首先,讲解了凸包的定义和如何找到最靠近x轴的点,然后通过排序和叉积判断构建凸包。接着,文章提供了C#代码实现,包括葛立恒求凸包、曲线采样和包围盒的计算。最后,提到了有向包围盒的计算方法,以及如何找到面积最小的包围盒。
摘要由CSDN通过智能技术生成

凸包

参考

分治法(其中nfox的项目实现的是分治法)

定义

凸包又叫凸多边形,本篇文章可能混用两种说法,

形象的理解就是一些点(点集)用一根橡皮筋紧紧地包裹外边点.

如果知道了这个定义,那么还有:

用一个保鲜膜裹着三维点,求膜上点集.

用一个最小的球裹着三维点,求球球的中心点和直径.

这样就进入了一个叫拓扑学的学科上.......我的老天鹅.

我竟然搜了半天没看到可以直接拿来用的c#代码,还是小轩轩给我的....

葛立恒凸包

注意一下,如果点集形成的是正交矩形的情况时,

算出来的凸包会多一个点,可以进行后处理.

(你会发现代码实际上是右上角最大点开始的,其他的教程说明从最小点开始算,

这需要知道的是最小最大都是边界点,边界点必然是凸包的边点,用谁起算都可以)

391fe6bbc6e4fd2a971e149d34d2553e.png

运行命令test_gra

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

#if !HC2020

usingAutodesk.AutoCAD.ApplicationServices;usingAutodesk.AutoCAD.DatabaseServices;usingAutodesk.AutoCAD.EditorInput;usingAutodesk.AutoCAD.Geometry;usingAutodesk.AutoCAD.Runtime;#else

usingGrxCAD.DatabaseServices;usingGrxCAD.EditorInput;usingGrxCAD.Geometry;usingGrxCAD.ApplicationServices;usingGrxCAD.Runtime;usingGrxCAD.Colors;usingGrxCAD.GraphicsInterface;using Viewport =GrxCAD.DatabaseServices.Viewport;#endif

usingSystem.Collections.Generic;usingSystem.Linq;

namespaceJoinBox.src.数学操作

{public classGraham

{/*视频参考:https://www.bilibili.com/video/BV1v741197YM相关学习:https://www.cnblogs.com/VividBinGo/p/11637684.html① 找到所有点中最左下角的点_p0(按 x 升序排列,如果 x 相同,则按 y 升序排列)

② 以_p0为基准求所有点的极角,并按照极角排序(按极角升序排列,若极角相同,则按距离升序排列),设这些点为p1,p2,……,pn-1

③ 建立一个栈,_p0,p1进栈,对于P[2..n-1]的每个点,利用叉积判断,

若栈顶的两个点与它不构成"向左转(逆时针)"的关系,则将栈顶的点出栈,直至没有点需要出栈以后,将当前点进栈

④ 所有点处理完之后栈中保存的点就是凸包了。*/

///

///最靠近x轴的点(必然是凸包边界的点)///

privatePoint2d _p0;///

///角度p0和pn的角度///

///

///

private doubleCosine(Point2d pn)

{double d =_p0.GetDistanceTo(pn);//距离是相同返回1.0表示true:那么求角度(高/斜)==sin(角度)

return d == 0.0 ? 1.0 : (pn.Y - _p0.Y) /d;

}///

///叉乘,顺时针方向为真,表示要剔除///

///

///

///

///

private boolClockwise(Point2d n, Point2d a, Point2d b)

{return ((a.X - b.X) * (a.Y - n.Y) - (a.X - n.X) * (a.Y - b.Y)) > -1e-6;

}///

///葛立恒求凸包///

///

///

private Point2d[] ConvexHull(Listpts)

{

//消重

pts = pts.Distinct().ToList();//靠近x轴的点

_p0 = pts.OrderBy(p => p.X).ThenBy(

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值