【问题标题】:planar graph with fixed maximum length of edges具有固定最大边长的平面图
【发布时间】:2011-05-13 18:06:27
【问题描述】:

我想在二维空间中生成随机点,这些点将是平面图的节点(使用 Gabriel graph 算法或 RNG 构建)。

我写了java代码来做这件事,但是我有两个难题要解决。

1) 我需要图形的所有边不超过给定阈值

2) 在我想知道图形的面之后,面是由边连接的节点的集合。一个面不包含其他节点。在下图中,人脸由标签 (F1, F2...) 签名

这两件事怎么做?一些算法?有一些已知的方法吗?

下面是我必须创建的图表示例

http://imageshack.us/photo/my-images/688/immagineps.png/

【问题讨论】:

  • 你能进一步定义“面孔”吗?从图片上看,它看起来像是一组点的凸包。
  • 面是由边连接的节点的集合。一个面不包含其他节点。在图像中,人脸由标签 (F1, F2...) 签名,也许人脸只能是凸的,这个属性可能是由 Gabriel Graph 的构造造成的,但我不确定。

标签: algorithm graph network-programming geometry planar-graph


【解决方案1】:
  1. 如果您可以容忍点数的一些变化,那么您可以将 Gabriel 图算法修改为增量(大部分工作将是使您的 Delaunay 算法增量),然后每当边太长时,在以该边为直径的圆中插入一个随机点。

  2. 平面图最方便的数据结构是以边为中心的:例如,doubly-connected edge listquad-edge 表示。如果您还没有在 Delaunay 步骤中使用这种类型的数据结构(我无法想象为什么您不会这样做),您可以按角度对每个顶点的传出连接进行排序。从那里,很容易实现一个函数,该函数采用半边并以逆时针顺序返回同一面上的下一个半边。现在遍历所有半边,并且对于尚未访问的每个半边,围绕面部进行迭代,直到返回到开始的位置。将内部迭代中的所有半边标记为一个面。

【讨论】:

  • 我解决了第一步,对我的代码进行了少量更改,但我没有使用 Delaunay 创建 Gabriel Graph。您能解释一下如何找到共享同一点的边的逆时针顺序吗?我的数据结构由边向量组成,每条边包含两个点。如果共享一个点,则两条边相连。
  • 这个解决方案+1。 @tulkas85,在大多数语言中,您可以使用 atan2() 之类的东西来确定向量相对于 X 轴的角度。然后按角度对具有公共顶点的所有边进行排序。
  • @tulkas85 "但我不使用 Delaunay 创建 Gabriel Graph" -> 如何在没有 Delaunay 的情况下创建图形?我确实使用了 Delaunay,但宁愿不用。即使我不确定我的图表是否正确。我通过检查 Delaunay 三角形中三个点的条件 (a, b) is gabriel pair if d^2 (a, b) <= d^2 (a, c) + d^2 (b, c) 来创建它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-02
相关资源
最近更新 更多