凸包算法—— cad c#二次开发

embedded/2025/2/13 20:47:55/

 效果如下:

 代码如下:


using IfoxDemo;
//[assembly: CommandClass(typeof(IFoxDemo.凸包class))]//只允许此类快捷键命令
namespace IFoxDemo
{public class 凸包class{public static class 凸包助手{/// <summary>/// 计算点集的凸包并返回多段线/// </summary>/// <param name="pts">点集合</param>/// <returns>凸包多段线</returns>public static Polyline 计算凸包(List<Point2d> pts){if (pts == null || pts.Count < 3){throw new ArgumentException("至少需要三个点来计算凸包。");}// 计算凸包点集List<Point2d> convexHullPoints = 筛选凸包点(pts);// 创建多段线Polyline convexHullPolyline = new Polyline();for (int i = 0; i < convexHullPoints.Count; i++){convexHullPolyline.AddVertexAt(i, convexHullPoints[i], 0, 0, 0);}// 闭合多段线convexHullPolyline.AddVertexAt(convexHullPoints.Count, convexHullPoints[0], 0, 0, 0);convexHullPolyline.Closed = true;return convexHullPolyline;}/// <summary>/// 使用 Andrew's monotone chain 算法计算凸包/// </summary>/// <param name="points">输入点集</param>/// <returns>凸包点集</returns>private static List<Point2d> 筛选凸包点(List<Point2d> points){// 按 X 坐标排序,如果 X 相同则按 Y 排序points.Sort((a, b) => a.X == b.X ? a.Y.CompareTo(b.Y) : a.X.CompareTo(b.X));List<Point2d> hull = new List<Point2d>();// 构建下凸包foreach (var pt in points){while (hull.Count >= 2 && Cross(hull[hull.Count - 2], hull[hull.Count - 1], pt) <= 0){hull.RemoveAt(hull.Count - 1);}hull.Add(pt);}// 构建上凸包int lowerHullCount = hull.Count + 1;for (int i = points.Count - 1; i >= 0; i--){var pt = points[i];while (hull.Count >= lowerHullCount && Cross(hull[hull.Count - 2], hull[hull.Count - 1], pt) <= 0){hull.RemoveAt(hull.Count - 1);}hull.Add(pt);}// 移除最后一个点,因为它是第一个点的重复hull.RemoveAt(hull.Count - 1);return hull;}/// <summary>/// 计算叉积/// </summary>/// <param name="O">起点</param>/// <param name="A">点 A</param>/// <param name="B">点 B</param>/// <returns>叉积值</returns>private static double Cross(Point2d O, Point2d A, Point2d B){return (A.X - O.X) * (B.Y - O.Y) - (A.Y - O.Y) * (B.X - O.X);}}public class 凸包Demo类{[CommandMethod("tub")]public void 凸包Demo(){Document doc = Application.DocumentManager.MdiActiveDocument;Database db = doc.Database;Editor ed = doc.Editor;var pts = new List<DBPoint>();if  (! ed.GetEntities(out pts ,"") ) return;//List<Point2d> points = new List<Point2d>();//foreach (DBPoint p in pts)//{//    points.Add(new Point2d(p.Position.X,p.Position.Y));//}下面为lambda等效写法List<Point2d> points = pts.Select(p => new Point2d(p.Position.X, p.Position.Y)).ToList();#region获取点集合(这里假设用户已经选择了一些点)//PromptPointOptions ppo = new PromptPointOptions("\n选择点: ");//ppo.AllowNone = false;//ppo.Keywords.Add("Done");//List<Point2d> points = new List<Point2d>();//while (true)//{//    PromptPointResult ppr = ed.GetPoint(ppo);//    if (ppr.Status == PromptStatus.Keyword && ppr.StringResult == "Done")//    {//        break;//    }//    points.Add(new Point2d(ppr.Value.X, ppr.Value.Y));//}//if (points.Count < 3)#endregionif (points.Count < 3){ed.WriteMessage("\n至少需要三个点来计算凸包。");return;}// 计算凸包Polyline pl = 凸包助手.计算凸包(points);// 将多段线添加到当前图形#region//using (Transaction tr = db.TransactionManager.StartTransaction())//{//    BlockTable bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;//    BlockTableRecord btr = tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;//    btr.AppendEntity(convexHullPolyline);//    tr.AddNewlyCreatedDBObject(convexHullPolyline, true);//    tr.Commit();//}#endregionusing var dbtrans = new DBTrans();dbtrans.CurrentSpace.AddEntity(pl);ed.WriteMessage("\n凸包多段线已创建。");}}public class 产生随机点{[CommandMethod("cssjd")]public void CreateRandomPoints(){Document doc = Application.DocumentManager.MdiActiveDocument;Database db = doc.Database;Editor ed = doc.Editor;// 提示用户输入点的数量PromptIntegerOptions pio = new PromptIntegerOptions("\n请输入要创建的点数量: ");pio.AllowNegative = false;pio.AllowZero = false;pio.DefaultValue = 10;PromptIntegerResult pir = ed.GetInteger(pio);if (pir.Status != PromptStatus.OK){ed.WriteMessage("\n用户取消操作。");return;}int pointCount = pir.Value;// 提示用户输入随机点的范围PromptPointOptions ppo = new PromptPointOptions("\n指定随机点的范围(左下角点): ");PromptPointResult ppr1 = ed.GetPoint(ppo);if (ppr1.Status != PromptStatus.OK){ed.WriteMessage("\n用户取消操作。");return;}ppo.Message = "\n指定随机点的范围(右上角点): ";PromptPointResult ppr2 = ed.GetPoint(ppo);if (ppr2.Status != PromptStatus.OK){ed.WriteMessage("\n用户取消操作。");return;}Point3d lowerLeft = ppr1.Value;Point3d upperRight = ppr2.Value;// 创建随机点Random random = new Random();using (Transaction tr = db.TransactionManager.StartTransaction()){BlockTable bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;BlockTableRecord btr = tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;for (int i = 0; i < pointCount; i++){double x = lowerLeft.X + (upperRight.X - lowerLeft.X) * random.NextDouble();double y = lowerLeft.Y + (upperRight.Y - lowerLeft.Y) * random.NextDouble();Point2d randomPoint2d = new Point2d(x, y);Point3d randomPoint3d = new Point3d(randomPoint2d.X, randomPoint2d.Y, 0);// 创建点实体DBPoint dbPoint = new DBPoint(randomPoint3d);btr.AppendEntity(dbPoint);tr.AddNewlyCreatedDBObject(dbPoint, true);}tr.Commit();}ed.WriteMessage($"\n成功创建 {pointCount} 个随机点。");}}}
}

逆时针最小夹角

 cad 二次开发、插件代写↓↓↓


http://www.ppmy.cn/embedded/161961.html

相关文章

第一天:爬虫介绍

每天上午9点左右更新一到两篇文章到专栏《Python爬虫训练营》中&#xff0c;对于爬虫有兴趣的伙伴可以订阅专栏一起学习&#xff0c;完全免费。 键盘为桨&#xff0c;代码作帆。这趟为期30天左右的Python爬虫特训即将启航&#xff0c;每日解锁新海域&#xff1a;从Requests库的…

【React】如何画一个箭头

下载 react-xarrows&#xff0c;官方文档地址 npm i react-xarrows基本使用 <Xarrow start"box1" end"box2" /> <Xarrow start"box2" end"box3" />基本属性 <Xarrowstart"box1"end"box2"headSi…

使用sunshine和moonlight串流时的音频输出问题

设备&#xff1a;电脑和平板串流&#xff0c;把平板当副屏使用 1.如果启用安装steam音频驱动程序&#xff0c;则平板有声&#xff0c;电脑无声&#xff0c;在moonlight端可以设置平板和电脑同时发声&#xff0c;但是有点卡 2.只想电脑发声&#xff0c;平板无声 禁用安装steam…

数字孪生遭遇 “DeepSeek 之问”:谁在批量制造昂贵玩具?

“如果数字孪生不能预判设备故障&#xff0c;和 3D 动画有什么区别&#xff1f;”DeepSeek 技术总监的犀利发问&#xff0c;揭开了行业的遮羞布。某券商研报显示&#xff0c;2023 年数字孪生项目平均 ROI&#xff08;投资回报率&#xff09;仅为 0.7&#xff0c;这意味着多数企…

PostCSS和PurgeCSS如何具体应用于我的项目?

在你的项目中应用 PostCSS 和 PurgeCSS 可以显著提高 CSS 的性能和可维护性。以下是如何具体在 React 项目中使用这两个工具的步骤。 1. 使用 PostCSS 安装 PostCSS 及插件 首先,你需要安装 PostCSS 和相关的插件。使用以下命令安装: npm install postcss postcss-loader…

从零开始认识大语言模型(LLM)

“AI小美好——聚焦科技、商业、职场。前沿资讯&#xff0c;实用干货&#xff0c;邂逅更美好的自己&#xff01;” 在当今数字化时代&#xff0c;语言不仅是人类交流的工具&#xff0c;更是信息传递的核心。随着人工智能技术的飞速发展&#xff0c;大语言模型逐渐走进了我们的…

云原生周刊:DeepSeek 颠覆人工智能

开源项目推荐 Ollama Ollama 是一个开源的 AI 工具&#xff0c;旨在为用户提供简单而强大的本地部署语言模型解决方案。它支持直接在本地计算机上运行多个预训练的语言模型&#xff0c;能够提供与云端类似的体验&#xff0c;但无需依赖外部服务器或网络连接。 Ollama 的主要…

17.垃圾回收器

GC分类与性能指标 垃圾收集器没有在规范中进行过多的规定&#xff0c;可以由不同的厂商、不同版本的JVM来实现。 由于JDK的版本处于高速迭代过程中&#xff0c;因此Java发展至今已经衍生了众多的GC版本。 从不同角度分析垃圾收集器&#xff0c;可以将GC分为不同的类型。 Jav…