求平面连接线段组成的所有最小闭合区间

这个功能确实非常实用,我在过去开发地面分区编辑器时就曾应用过这一算法。最近,在新产品的开发中再次遇到了类似的需求。尽管之前已经实现过,但由于长时间未接触,对算法的具体细节有所遗忘,导致重新编写时耗费了不少时间。

起初,我尝试采用广度优先搜索来解决问题,却发现这种方法需要遍历所有可能性以找到最小面积的解,性能上显得过于低下。经过一番考量后,最终决定回归之前所用的更为高效的算法。这种算法不仅能够满足性能要求,还能有效减少开发时间和资源消耗。

如下图示例:

想要求出图中所有闭合区域,首先要收集这些线段,并绑定他们的关系。

cs 复制代码
 private static Dictionary<Vector3, HashSet<Vector3>> BuildAdjacencyList(List<LineSegment> segments)
    {
        var graph = new Dictionary<Vector3, HashSet<Vector3>>();

        foreach (var segment in segments)
        {
            AddVertexToGraph(segment.Start, graph);
            AddVertexToGraph(segment.End, graph);
            graph[segment.Start].Add(segment.End);
            graph[segment.End].Add(segment.Start);
        }
        RemoveSingletonVertices(ref graph);
        return graph;
    }

如上,构建无向图邻接表。将顶点收集并绑定相邻的顶点。我们要移除那些顶点相邻顶点只有一个的数据。他是组成不了闭合区间的。

接下来,我们需要分别计算出最小闭合区间和最大闭合区间。核心算法如下:

  1. 选择起始顶点

    • 选出一个 x 值最小的顶点作为第一个顶点。
    • 如果有多个顶点的 x 值相同,则选择 y 值最小的顶点。
  2. 逆时针选择顶点

    • 从选定的起始顶点开始,沿着逆时针方向选择下一个顶点。
    • 重复此过程,直到找出的顶点和第一个顶点相同,形成最小闭合区间。
  3. 计算最大闭合区间

    • 最大闭合区间算法与最小闭合区间相似。也是逆时针选出。但是从第三个点开始选最外围的也就是夹角最大的顶点。注意:需要用叉乘判断是凸角还是凹角。若是凹角,则角度=360-夹角。
  4. 移除边缘顶点

    • 遍历最小闭合区间的顶点,检查每个顶点的相邻顶点数是否为 2。
    • 如果某个顶点的相邻顶点数为 2,并且该顶点同时存在于最大闭合区间中,则将其视为边缘顶点并移除。
    • 移除顶点的同时,解除其他顶点与该顶点的相邻关系。
  5. 循环操作

    • 重复上述步骤,直到所有顶点都被移除。

通过这些步骤,我们就可以找出最小闭合区间啦。

相关推荐
RReality2 天前
【Unity Shader URP】视差贴图 实战教程
ui·平面·unity·游戏引擎·图形渲染·贴图
老歌老听老掉牙3 天前
空间点到平面的距离:几何意义与计算方法
python·平面
思茂信息3 天前
CST可重构雷达吸波器设计与仿真
网络·算法·平面·智能手机·重构·cst·电磁仿
Evand J8 天前
【MATLAB绘图教程】空间误差场图的概念及其应用,附代码
matlab·平面·绘图·定位
charlie11451419111 天前
通用GUI编程技术——图形渲染实战(四十)——深度缓冲与3D变换:从平面到立体
开发语言·c++·平面·3d·图形渲染·win32
Elastic 中国社区官方博客12 天前
通过受管控的控制平面加速商品陈列优化
大数据·数据库·人工智能·elasticsearch·搜索引擎·平面·ai
FakeOccupational16 天前
【电路笔记 电源模块】“桥接”布局法+电源隔离+GND隔离+统一地平面防干扰
笔记·平面
Evand J16 天前
【MATLAB程序】基于RSSI的RFID二维轨迹定位仿真介绍,EKF滤波增加轨迹定位精度。附下载链接
开发语言·matlab·平面·滤波·定位·导航
Evand J19 天前
【代码介绍】二维平面上的雷达跟踪与UKF(无迹卡尔曼滤波),高精度估计目标轨迹,输出真值、估计值、误差特性等
matlab·平面·雷达·滤波·定位·导航·跟踪
bcbobo21cn19 天前
Three.js绘制三角形网格平面
前端·javascript·平面·三角形面·基础材质