如何判断由3个或更多线段组成的列表是否构成封闭区域(在3D中)?

本文关键字:是否 3D 列表 区域 段组成 判断 何判断 3个 | 更新日期: 2023-09-27 18:10:24

好了,这是我目前看到的:

假设:你至少有3个共面线段

  1. 按起始点的x坐标排序

  2. 遍历列表,查看line2的起始点是否在line1的结束点,以此类推

  3. 如果最后一个的终点在第一个的起点上,那么我知道它是一个封闭区域

我该如何在C-Sharp中实现它呢?你觉得这能行吗?如果是,我应该使用什么排序算法?

如何判断由3个或更多线段组成的列表是否构成封闭区域(在3D中)?

假设线段表示如下:

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);

这没有考虑AB相同的段的简并情况。您可以很容易地添加它,并自行决定在这种情况下要做什么。