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

 效果如下:

 代码如下:


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.mzph.cn/web/69729.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ctfshow-36D杯

ctfshow-36D杯 给你shell ($obj[secret] ! $flag_md5 ) ? haveFun($flag) : echo "here is your webshell: $shell_path"; 这是个弱比较&#xff0c;输入?give_me_shell前三个是0说明二进制小于1000000就是ASCII的64&#xff0c; 0-32是不可见或非打印字符&…

Linux ARM64 将内核虚拟地址转化为物理地址

文章目录 前言一、通用方案1.1 kern_addr_valid1.2 __pa 二、ARM64架构2.1 AT S1E1R2.2 is_kernel_addr_vaild2.3 va2pa_helper 三、demo演示参考资料 前言 本文介绍一种通用的将内核虚拟地址转化为物理地址的方案以及一种适用于ARM64 将内核虚拟地址转化为物理地址的方案&…

单例模式和单例Bean

单例模式 定义&#xff1a;单例模式是一种软件设计模式&#xff0c;它确保一个类只有一个实例&#xff0c;并提供一个全局访问点来访问这个实例。 实现方式 饿汉式&#xff1a;在类加载时就立即创建单例实例&#xff0c;线程安全&#xff0c;调用效率高&#xff0c;但可能会造成…

全排列(力扣46)

这道题让我们求这个集合有多少种排列方式&#xff0c;那么与之前组合问题的不同就在于要考虑元素之间的顺序了&#xff0c;所以每一层递归的or循环的起始值无需变量控制&#xff0c;都从0开始。但是一个排列中不能出现相同元素&#xff0c;所以别忘了去重&#xff0c;这里的去重…

本地部署DeepSeek集成VSCode创建自己的AI助手

文章目录 安装Ollama和CodeGPT安装Ollama安装CodeGPT 下载并配置DeepSeek模型下载聊天模型&#xff08;deepseek-r1:1.5b&#xff09;下载自动补全模型&#xff08;deepseek-coder:1.3b&#xff09; 使用DeepSeek进行编程辅助配置CodeGPT使用DeepSeek模型开始使用AI助手 ✍️相…

云原生AI Agent应用安全防护方案最佳实践(上)

当下&#xff0c;AI Agent代理是一种全新的构建动态和复杂业务场景工作流的方式&#xff0c;利用大语言模型&#xff08;LLM&#xff09;作为推理引擎。这些Agent代理应用能够将复杂的自然语言查询任务分解为多个可执行步骤&#xff0c;并结合迭代反馈循环和自省机制&#xff0…

解锁云电脑爽玩TGA游戏,ToDesk、海马云等多款云电脑游戏横测

作为一名游戏爱好者&#xff0c;我深入研究了云电脑技术在游戏娱乐中的应用。通过对比传统游戏机与云电脑的成本效益&#xff0c;我发现云电脑以其低成本和灵活性脱颖而出。我以自身为例&#xff0c;分析了云电脑如何满足对游戏体验的高要求。在测评中&#xff0c;我选择了ToDe…

【Android开发】安卓手机APP使用机器学习进行QR二维码识别

前言:本项目是一个 Android 平台的二维码扫描应用,具备二维码扫描和信息展示功能。借助 AndroidX CameraX 库实现相机的预览、图像捕获与分析,使用 Google ML Kit 进行二维码识别。为方便大家了解项目全貌,以下将介绍项目核心代码文件 MainActivity.java 和 AndroidManifes…

uniapp中对于文件和文件夹的处理,内存的查询

目录 移动文件到指定文件夹 新增本地文件夹 设定本地文件过期时间&#xff0c;清除超时文件&#xff0c;释放内存 操作本地文件之----删除 uniapp获取设备剩余存储空间的方法 读取本地文件夹下的文件 移动文件到指定文件夹 function moveTempFile(tempFilePath, targetFo…

qt widget和qml界面集成到一起

将 Qt Widgets 和 QML 界面集成在一起可以利用 QQuickWidget 或 QQuickView。以下是基本步骤: 使用 QQuickWidget 创建 Qt Widgets 项目: 创建一个基于 Widgets 的应用程序。添加 QQuickWidget: 在你的窗口或布局中添加 QQuickWidget。 例如,可以在 QMainWindow 中使用: …

HTML之JavaScript使用JSON

HTML之JavaScript使用JSON JSON(JavaScript Object Notation)是一种轻量级的数据交换格式&#xff0c;易于人阅读和编写&#xff0c;同时也易于机器解析和生成。JSON是JavaScript对象的字符串表示法&#xff0c;它使用文本表示一个js对象的信息&#xff0c;可以将json字符串转换…

新数据结构(4)——Java继承

基本概念 继承的本质&#xff1a;重复使用已经定义好的方法和域&#xff0c;实现代码的重复利用。 使用继承之后&#xff0c;创建的子类可以方便地调用父类中已经定义的方法。 一个继承的例子&#xff1a; 重载和重写 重载 重载&#xff1a;发生在同一个类里&#xff0c;指…

VMware Workstate 的 Ubuntu18 安装 vmware tools(不安装没法共享)

在共享主机路径后&#xff0c;可以在&#xff1a; /mnt/hgfs/下方找到共享的文件。但没有安装vmware tool时是没法共享的。 如何安装vmware tool&#xff0c;网上版本很多。这里记录一下&#xff1a; VMware Workstation 17 Pro&#xff0c;版本&#xff1a;17.6.0 虚拟机系统…

【每日一题 | 2025】2.3 ~ 2.9

个人主页&#xff1a;GUIQU. 归属专栏&#xff1a;每日一题 文章目录 1. 【2.3】P8784 [蓝桥杯 2022 省 B] 积木画2. 【2.4】P8656 [蓝桥杯 2017 国 B] 对局匹配3. 【2.5】[ABC365D] AtCoder Janken 34. 【2.6】P8703 [蓝桥杯 2019 国 B] 最优包含5. 【2.7】P8624 [蓝桥杯 2015…

ARM Cortex-M3/M4 权威指南 笔记【二】架构

一、架构 1.1 架构简介 Cortex-M3/M4 处理器都基于 ARMv7-M 架构。最初的 ARMv7-M 架构是随着 Cortex-M3 处理器一同引入的&#xff0c;而在 Cortex-M4 发布时&#xff0c;架构中又额外增加了新的指令和特性&#xff0c;改进后的架构有时也被称为 ARMV7E-M。要了解 ARM7-M 和…

Java进阶14 TCP日志枚举

Java进阶14 TCP&日志&枚举 一、网络编程TCP Java对基于TCP协议得网络提供了良好的封装&#xff0c;使用Socket对象来代表两端的通信端口&#xff0c;并通过Socket产生IO流来进行网络通信。 1、TCP协议发数据 1.1 构造方法 方法 说明 Socket(InetAddress address…

【学习笔记】vue-cli中组件间传参的方式

一、父子组件传参 首先创建子组件,子组件的名字为component1.vue <template><div class""><div class""><span>接受父组件:{{name}}</span><el-button type"primary" click"Forward()">打印父组…

jenkins备份还原配置文件

下载ThinBackup插件 方式1 从插件市场直接下载 Manage Jenkins->Manage Plugins->可选插件搜索 注意&#xff1a;有时可能因为网络或者版本问题下载不了&#xff0c;好像是默认下载最新版本&#xff0c;可选择手动安装&#xff01; 方式二 手动安装插件 点击查看手…

剑指 Offer II 019. 最多删除一个字符得到回文

comments: true edit_url: https://github.com/doocs/leetcode/edit/main/lcof2/%E5%89%91%E6%8C%87%20Offer%20II%20019.%20%E6%9C%80%E5%A4%9A%E5%88%A0%E9%99%A4%E4%B8%80%E4%B8%AA%E5%AD%97%E7%AC%A6%E5%BE%97%E5%88%B0%E5%9B%9E%E6%96%87/README.md 剑指 Offer II 019. 最…

基于单片机的电子式单项智能电表设计(论文+源码)

1. 系统整体方案设计 本课题为基于单片机的电子式单项智能电表&#xff0c;在此设计如图2.1所示的系统总体架构&#xff0c;其采用STM32单片机作为主控制器&#xff0c;搭配外设HLW8032模块实现对电压&#xff0c;电流&#xff0c;功率因数&#xff0c;电能消耗等参数进行检测…