C# CAD2016 多边形顶点按方向重新排序

  多边形顶点按方向重新排序

  1. 初始化多边形顶点集合 outerPoints

    • 创建一个名为 outerPoints 的 List<Point2d>,用于存储多边形的所有顶点坐标。
  2. 计算多边形顶点集合的边界框(BoundingBox)

    • 使用LINQ的Aggregate方法遍历整个outerPoints列表,并逐个更新最小X、最大X、最小Y和最大Y值。
    • 初始化匿名对象,其中包含四个属性:MinX、MaxX、MinY、MaxY,分别设置为double的最大值和最小值。
    • 对于列表中的每个顶点,将当前顶点的X和Y坐标与匿名对象中对应的最小值或最大值进行比较并更新。
  3. 找到左上角(候选西北角)

    • 根据计算得到的边界框信息,创建一个新的Point2d对象topLeftCorner,其坐标分别为边界框的最小X值和最大Y值。这个点位于多边形顶点集合的左上角,作为候选的西北方向起始点。
  4. 查找最接近左上角(西北方向)的顶点索引

    • outerPoints中的所有顶点按照它们到左上角顶点的距离平方进行排序,距离越近排在越前面。
    • 调用IndexOf方法找出排序后序列的第一个元素(即最接近左上角的顶点)在原列表中的索引位置,赋值给变量startVertexIndex

这样,通过以上步骤,我们找到了一个多边形的一个候选起始顶点(可能位于西北方向),并且已经获取了该多边形的边界框信息,这些信息对于后续判断顶点排列顺序及处理其他相关问题具有重要意义。

示例代码一 

假设您已经有了一个outerPolyline对象(或类似的多边形表示方式),其中包含了多边形的顶点。以下是一个完整的示例代码片段:

 

using System;
using System.Collections.Generic;
using Autodesk.AutoCAD.Geometry; // 假设使用AutoCAD Geometry库

// 初始化多边形顶点集合
List<Point2d> outerPoints = new List<Point2d>();
for (int i = 0; i < outerPolyline.NumberOfVertices; i++)
{
    Point2d point = outerPolyline.GetPoint2dAt(i);
    outerPoints.Add(point);
}

// 计算多边形顶点集合的边界框
var boundingBox = outerPoints.Aggregate(
    new { MinX = double.MaxValue, MaxX = double.MinValue, MinY = double.MaxValue, MaxY = double.MinValue },
    (a, b) =>
    {
        return new
        {
            MinX = Math.Min(a.MinX, b.X),
            MaxX = Math.Max(a.MaxX, b.X),
            MinY = Math.Min(a.MinY, b.Y),
            MaxY = Math.Max(a.MaxY, b.Y)
        };
    });

// 找到左上角的顶点作为候选西北角
Point2d topLeftCorner = new Point2d(boundingBox.MinX, boundingBox.MaxY);

// 找到最接近左上角(西北方向)的顶点索引
int startVertexIndex = outerPoints.IndexOf(outerPoints.OrderBy(p => Math.Pow(p.X - topLeftCorner.X, 2) + Math.Pow(p.Y - topLeftCorner.Y, 2)).First());

// 示例:打印出找到的起始顶点和边界框信息
Console.WriteLine($"西北角候选顶点坐标: ({topLeftCorner.X}, {topLeftCorner.Y})");
Console.WriteLine($"最接近西北角的顶点索引: {startVertexIndex}");
Console.WriteLine($"多边形边界框信息: 最小X={boundingBox.MinX}, 最大X={boundingBox.MaxX}, 最小Y={boundingBox.MinY}, 最大Y={boundingBox.MaxY}");

示例代码二

完整地处理八个方向(东北、东南、西南、西北、北、南、东、西),我们可以创建一个方法来获取多边形相对于给定点的最近顶点及其对应的方向。以下是一个示例代码:

using System;
using System.Collections.Generic;
using Autodesk.AutoCAD.Geometry; // 假设使用AutoCAD Geometry库

public enum Direction
{
    North,
    South,
    East,
    West,
    Northeast,
    Northwest,
    Southeast,
    Southwest
}

public static (Point2d, Direction) GetNearestVertexAndDirection(Point2d referencePoint, List<Point2d> polygonVertices)
{
    double minDistanceSquared = double.MaxValue;
    Point2d nearestVertex = new Point2d();
    Direction direction = Direction.North;

    foreach (var vertex in polygonVertices)
    {
        double dx = vertex.X - referencePoint.X;
        double dy = vertex.Y - referencePoint.Y;
        double distanceSquared = dx * dx + dy * dy;

        if (distanceSquared < minDistanceSquared)
        {
            minDistanceSquared = distanceSquared;
            nearestVertex = vertex;

            // 根据坐标判断方向
            if (dx == 0 && dy > 0) direction = Direction.South;
            else if (dx == 0 && dy < 0) direction = Direction.North;
            else if (dy == 0 && dx > 0) direction = Direction.West;
            else if (dy == 0 && dx < 0) direction = Direction.East;
            else if (dx > 0 && dy > 0) direction = Direction.Northeast;
            else if (dx < 0 && dy > 0) direction = Direction.Southeast;
            else if (dx < 0 && dy < 0) direction = Direction.Southwest;
            else if (dx > 0 && dy < 0) direction = Direction.Northwest;
        }
    }

    return (nearestVertex, direction);
}

// 使用示例
List<Point2d> outerPoints = ... // 初始化或从外部获取多边形顶点集合
Point2d referencePoint = new Point2d(10.0, 10.0); // 假设参考点坐标为(10, 10)

var (nearestVertex, direction) = GetNearestVertexAndDirection(referencePoint, outerPoints);
Console.WriteLine($"最近顶点坐标: ({nearestVertex.X}, {nearestVertex.Y})");
Console.WriteLine($"最近顶点方向: {direction}");

//感谢大家的点赞,收藏,转发,关注 
//附送AI 图片无版权 随意用 龙年大吉大利
通义万相        阿里最新推出的A绘画创作模型

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/385727.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于Zigbee的智能温室大棚系统(附详细使用教程+完整代码+原理图+完整课设报告)

🎊项目专栏:【Zigbee课程设计系列文章】(附详细使用教程+完整代码+原理图+完整课设报告) 前言 👑由于无线传感器网络(也即是Zigbee)作为🌐物联网工程的一门必修专业课,具有很强的实用性,因此很多院校都开设了zigbee的实训课程;👑同时最近很多使用了我的单片机课…

计算机网络——10FTP

FTP FTP&#xff1a;文件传输协议 向远程主机上传输文件或从远程主机接收文件客户/服务器模式 客户端&#xff1a;发起传输的一方服务器&#xff1a;远程主机 ftp:RFC 959ftp服务器&#xff1a;端口号为21 FTP&#xff1a;控制连接与数据连接分开 控制连接 FTP客户端与FTP服…

[FFmpeg学习]从视频中获取图片

从视频中获取图片是一个比较直观的例子&#xff0c;这里从一个基础的例子来查看FFmpeg相关api的使用&#xff0c;从mp4文件中获取一帧图像&#xff0c;保存为jpeg格式图片&#xff0c;mp4文件比较好准备&#xff0c;一般手机录屏文件就是mp4格式。 原理还是比较清楚&#xff0…

【杂谈】扣子(Coze) 初体验

扣子(Coze)是什么 官方原文如下&#xff1a; 扣子&#xff08;coze.cn&#xff09;是一款用来开发新一代 AI Chat Bot 的应用编辑平台&#xff0c;无论你是否有编程基础&#xff0c;都可以通过这个平台来快速创建各种类型的 Chat Bot&#xff0c;并将其发布到各类社交平台和通…

B2084 质因数分解

题目描述 已知正整数 n 是两个不同的质数的乘积&#xff0c;试求出较大的那个质数。 输入格式 输入只有一行&#xff0c;包含一个正整数 n&#xff08;6<n<&#xff09;。 输出格式 输出只有一行&#xff0c;包含一个正整数 p&#xff0c;即较大的那个质数。 输入输…

Java 基于 SpringBoot+Vue 的社区医院系统

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

《Java 简易速速上手小册》第8章:Java 性能优化(2024 最新版)

文章目录 8.1 性能评估工具 - 你的性能探测仪8.1.1 基础知识8.1.2 重点案例&#xff1a;使用 VisualVM 监控应用性能8.1.3 拓展案例 1&#xff1a;使用 JProfiler 分析内存泄漏8.1.4 拓展案例 2&#xff1a;使用 Gatling 进行 Web 应用压力测试 8.2 JVM 调优 - 魔法引擎的调校8…

根据Ruoyi做二开

Ruoyi二开 前言菜单代码生成总结 前言 之前写过一篇文章&#xff0c;若依微服务版本搭建&#xff0c;超详细&#xff0c;就介绍了怎么搭建若依微服务版本&#xff0c;我们使用若依就是为了简化我们的开发&#xff0c;减少开发周期的&#xff0c;这篇文章就会介绍怎么使用若依进…

大型社区门口适合开什么店?商业趋势与消费需求分析

作为一名资深的鲜奶吧创业者&#xff0c;我在这个行业已经摸爬滚打了五年。期间&#xff0c;我见证了社区商业的蓬勃发展&#xff0c;也深刻体会到了选址对于店铺经营的重要性。 这篇文章&#xff0c;我和大家分享一下我的见解&#xff0c;探讨一下大型社区门口适合开什么店&a…

软件实例分享,茶楼收银软件管理系统,支持计时计费商品销售会员管理定时语音提醒功能

软件实例分享&#xff0c;茶楼收银软件管理系统&#xff0c;支持计时计费商品销售会员管理定时语音提醒功能 一、前言 以下软件教程以 佳易王茶社计时计费管理系统软件V18.0为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 问&#xff1a;这个软…

AI绘画作品的展示和变现-2

4.7 制作红包封面 中国的节日和传统文化元素仍然可以成为创作者们的创作灵感&#xff0c;创造出更多的变现机会。比如元宵节&#xff0c;可以制作大型元宵图案&#xff0c;进行引流并卖出元宵。 而春分、谷雨等节气也可以成为创作的灵感来源&#xff0c;创作出与之相关的图案&…

Java实现音乐平台 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示 四、核心代码4.1 查询单首音乐4.2 新增音乐4.3 新增音乐订单4.4 查询音乐订单4.5 新增音乐收藏 五、免责说明 一、摘要 1.1 项目介绍 基于微信小程序JAVAVueSpringBootMySQL的音乐平台&#xff0c;包含了音乐…

Go+:一种简单而强大的编程语言

Go是一种简单而强大的编程语言&#xff0c;它是在Go语言之上构建的&#xff0c;旨在提供更加强大、灵活和易于使用的编程体验。Go与Go语言共享大部分语法和语义&#xff0c;因此Go开发人员可以很快上手Go&#xff0c;同时也可以使用Go来编写更加简洁和高效的代码。在本文中&…

蓝桥杯嵌入式第11届真题(完成) STM32G431

蓝桥杯嵌入式第11届真题(完成) STM32G431 题目 代码 程序和之前的大同小异&#xff0c;不过多解释 main.c /* USER CODE BEGIN Header */ /********************************************************************************* file : main.c* brief :…

Windows搭建docker+k8s

安装Docker Desktop 从官网下载&#xff0c;然后直接安装即可&#xff0c;过程很简单&#xff0c;一直Next就行。 有一点需要注意就是要看好对应的版本&#xff0c;因为后边涉及到版本的问题。 https://www.docker.com/products/docker-desktop 安装完成&#xff0c;双击图…

Golang中的fmt包:格式化输入输出的利器

Golang中的fmt包&#xff1a;格式化输入输出的利器 在软件开发的世界里&#xff0c;fmt包就像是一位忠实的伙伴&#xff0c;始终陪伴着开发人员。它简化了格式化输入输出的过程&#xff0c;让打印和扫描数据变得轻松自如。无论是向控制台输出简单的消息&#xff0c;还是处理复杂…

【深度学习】S2 数学基础 P1 线性代数(上)

目录 基本数学对象标量与变量向量矩阵张量降维求和非降维求和累计求和 点积与向量积点积矩阵-向量积矩阵-矩阵乘法 深度学习的三大数学基础 —— 线性代数、微积分、概率论&#xff1b; 自本篇博文以下几遍博文&#xff0c;将对这三大数学基础进行重点提炼。 本节博文将介绍线…

涛哥聊Python | pymunk,一个强大的 Python 库!

本文来源公众号“涛哥聊Python”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;pymunk&#xff0c;一个强大的 Python 库&#xff01; 大家好&#xff0c;今天为大家分享一个强大的 Python 库 - pymunk。 Github地址&#xff1a;…

计算机二级C语言的注意事项及相应真题-4-程序修改

目录&#xff1a; 31.逐个比较p、q所指两个字符串对应位置中的字符&#xff0c;把ASCII值大或相等的字符依次存放到c所指数组中&#xff0c;形成一个新的字符串32.求矩阵&#xff08;二维数组)a[N][N]中每行的最小值&#xff0c;结果存放到数组b中33.将一个十进制整数转换成r(二…

Vulnhub靶场 DC-9

目录 一、环境搭建 二、信息收集 1、主机发现 2、指纹识别 三、漏洞复现 1、dirsearch目录探测 2、sqlmap注入测试 3、文件包含漏洞 4、Knockd敲门服务 5、ssh爆破 ​​​​​​​6、提权 四、提取flag 一、环境搭建 Vulnhub靶机下载&#xff1a; 官网地址&#xff1a;https://…