如何判断由3个或更多线段组成的列表是否构成封闭区域(在3D中)?
本文关键字:是否 3D 列表 区域 段组成 判断 何判断 3个 | 更新日期: 2023-09-27 18:10:24
好了,这是我目前看到的:
假设:你至少有3个共面线段
-
按起始点的x坐标排序
-
遍历列表,查看line2的起始点是否在line1的结束点,以此类推
-
如果最后一个的终点在第一个的起点上,那么我知道它是一个封闭区域
我该如何在C-Sharp中实现它呢?你觉得这能行吗?如果是,我应该使用什么排序算法?
假设线段表示如下:
class Segment
{
public Point A { get; set; }
public Point B { get; set; }
}
class Point
{
public double X { get; set; }
public double Y { get; set; }
public double Z { get; set; }
}
设segments
是包含3个线段的IEnumerable<Segment>
。然后你可以检查这三个线段是否形成一个封闭的三角形,如下所示。
bool closed = segments
.SelectMany(segment => new[] { segment.A, segment.B })
.GroupBy(point => new { point.X, point.Y, point.Z })
.All(group => group.Count() == 2);
这没有考虑A
和B
相同的段的简并情况。您可以很容易地添加它,并自行决定在这种情况下要做什么。