【问题标题】:Sorting and grouping points排序和分组点
【发布时间】:2016-07-20 15:52:16
【问题描述】:

我有一个相当简单的对象,其形状由 12 个顶点定义。在对这个对象进行隐藏线计算时(我正在使用 Cad Control 来执行此操作),它返回组成形状的线条集合,通常远远超过绘制这种形状的最小线条数,请参见附图:

点之间的每一段都是一条线。我想删除以红色标记的点,只留下绘制形状所需的最小计数(黄色十字)。

一种方法是将它们顺时针排序,然后循环遍历它们,检查列表中三个相邻点的叉积是否为零,然后删除中间的点。不幸的是,无法预测点将如何排序,因此这不是一个选项。

第二种方法是循环遍历 cad 控件提供的线集合,并找到同一线上的所有点,对它们进行排序(pointsLineA、pointsLineB、pointsLineC 等)从那里开始会容易得多。

到目前为止,我已经完成了循环遍历行集合(获取每个行的点)并在嵌套循环中循环遍历同一个集合(它的副本)以检查集合中任何随机行的点是否位于与第一个循环的线中的点相同的线。这涉及两个循环并在运行时修改集合。简而言之,这是一个混乱。如果您想查看代码示例,请告诉我。 为了确保一切都清楚 - 我的第一个目标是将点分组,以便在每个组中出现仅属于一条线的点。有什么建议?

【问题讨论】:

  • 你能展示你必须使用的 CAD 数据吗? (对于上述形状)
  • 无法找到对齐的点。在您的示例中,最左边的四个黄色十字对齐但不属于单行。
  • 在图片上,我们可以看到无关的顶点,但我们看不到线段是什么。它们可能重叠。
  • @YvesDaoust 是的,当然,我没有意识到这些点也是对齐的!是的,我发现有时线段也是重叠的。我想这会带来新的问题。现在我完全迷失了。
  • @erotavlas 唯一可用的数据是 segment2D 的集合,其中包含每个 segment2D 的 startPoint、endPoint、midPoint、长度和法线。这就是我所拥有的。

标签: c# sorting computational-geometry


【解决方案1】:

如果有 12 个顶点(或数百个顶点),我不会进行空间分区(我正在考虑自适应四叉树、二维树(kd-tree with k=2))。 我会为每个顶点存储它所属的线(更容易为每个顶点和线分配一个 ID,而不是每次比较顶点的坐标)。

vertex(1)=(2.5,3.97)  <- vertex coordinates
vertex(2)=( 13.453 , 24.687 ) 

lines_for_Vertex(1)= {1,5} if vertex 1 is member of lines 1 and 5
lines_for_Vertex(3)={2,5,7} if vertex 3 is member of lines 2,5 and 7
lines_for_vertex(9)={4} if vertex 9 is member of line 4 (edge or segment not connected)
lines_for_vertex(3)={} if vertex 3 is not connected (not member of any segment)
(maybe some cases are impossible for you)

您可以将 ID 分配给在您的行集合中具有位置的行。

在任何情况下,如果您这样做会更改或保留行集合,则在嵌套循环内,您必须收集要删除的点的信息,而无需更改任何内容。 所以不要这样做:

if vertices are aligned then remove the vertex in the middle

您使用此信息填写列表“to_remove”:

to_remove.add(vertex in the middle)         <- with the ID is easier

那么当两个循环结束时,就可以移除列表中收集到的所有顶点了。如果您有数组 'lines_for_vertex',很容易找到要折叠为一个的两个线段(例如,如果要删除的顶点为 1,则折叠线为 1 和 5)。

如果你甚至为线构建一个结构,参考其顶点的 ID

e.g. line(5)={1,3} if line with ID=5 connects vertices 1 and 3 

(与上面的lines_for_vertex相比),更容易知道如何折叠线条。

【讨论】:

    【解决方案2】:

    您需要检索多边形的拓扑。在闭环中重新排列顶点的方法。通过比较端点坐标,可以找到匹配的,得到端点之间有边,端点合并的图。

    从此表示中,您可以轻松检测并删除对齐方式。

    【讨论】:

      猜你喜欢
      • 2020-05-16
      • 2021-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-21
      • 2020-04-16
      • 2016-04-27
      相关资源
      最近更新 更多