Voronoi图 | 泰森多边形

概念

Voronoi图,又叫泰森多边形、沃罗诺伊图或Dirichlet图,是一个关于空间划分的基础数据结构。
它是由一组由连接两邻点直线的垂直平分线组成的连续多边形组成。
N个在平面上有区别的点,按照最邻近原则划分平面;每个点与它的最近邻区域相关联。Delaunay三角形是由与相邻Voronoi多边形共享一条边的相关点连接而成的三角形。Delaunay三角形的外接圆圆心是与三角形相关的Voronoi多边形的一个顶点。

应用

Voronoi图的应用非常广泛。在计算几何中,重心Voronoi图(CVT)方法被用来优化网格,可以使种子点变得更加均匀。在网络通讯中,利用加权Voronoi图设计中继站的位置可以提高利用率,降低成本。

在几何形体重构中的应用

  • Anton等应用Voronoi图来实现数字地貌模型(DTM)的生成,已知数据可以包括采样点。

在计算机图形学、图像处理与模式识别中的应用

  • Voronoi 图还被用来获得图像中形体的边界轮廓线。

在物理、化学和分子生物学中的应用

  • Defabritiis 等[37]应用Voronoi图来模拟包含聚合物大分子的复杂流体的动力学行为。

在机器人运动规划中的应用。

  • 如果障碍物可以近似成质点,那么机器人沿着障碍物的Voronoi图的边行走是最安全的。

其他应用

  • 数学规划、天体动力学等

总结

  • 把 Voronoi 图作为表示各种元素之间关系的一个结构,通过这个结构可以提取出重要信息。这样的实例多见于用Voronoi 图研究自然界物质结构的性质
  • 把Voronoi 图作为一个辅助数据结构,通过这个数据结构可以完成许多关于物体形态或邻近关系的计算任务。
  • 把 Voronoi 图作为提高某些几何算法运算速度的重要手段。一般来说,二维的Voronoi图可以在O(nlogn)时间内获得,三维的Voronoi图可以在O(n2)时间内获得。Voronoi 图的性质决定了它与许多其他几何结构具有内在关系,通过Voronoi 图许多几何算法可以得到快速运算。

[1]刘金义, 刘爽. Voronoi图应用综述[J]. 图学学报, 2004(02):131-138.

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
很抱歉,我是一名自然语言处理模型,无法提供完整的编程代码。但我可以给您提供一份基于C#语言实现的泰森多边形算法的基本思路和步骤,希望能对您有所帮助。 1. 首先,需要生成一组随机的点集,作为泰森多边形算法的输入。 2. 然后,需要根据这些点,构建出一颗 Voronoi ,该由一些 Voronoi 单元组成,每个 Voronoi 单元都代表了一个点集中的点与其周围其他点之间的分割线段。 3. 接下来,需要对 Voronoi 进行剖分,将每个 Voronoi 单元剖分成若干个三角形,这些三角形就是泰森多边形的组成部分。 4. 最后,需要对这些三角形进行分类和筛选,只保留与输入点集中的点相关的三角形,从而得到最终的泰森多边形。 以下是一份简单的示例代码,仅供参考: ```csharp // 生成随机点集 int numPoints = 50; List<Vector2> points = new List<Vector2>(); for (int i = 0; i < numPoints; i++) { points.Add(new Vector2(UnityEngine.Random.Range(0, Screen.width), UnityEngine.Random.Range(0, Screen.height))); } // 构建 Voronoi Voronoi voronoi = new Voronoi(points); List<GraphEdge> voronoiEdges = voronoi.VoronoiDiagram(); // 对 Voronoi 进行剖分 List<Triangle> triangles = new List<Triangle>(); foreach (GraphEdge edge in voronoiEdges) { if (edge.IsPartOfConvexHull) { continue; } Vector2 p1 = new Vector2((float)edge.X1, (float)edge.Y1); Vector2 p2 = new Vector2((float)edge.X2, (float)edge.Y2); Vector2 midPoint = (p1 + p2) / 2f; List<Vector2> connectedPoints = new List<Vector2>(); foreach (GraphEdge connectedEdge in edge.Edges) { if (connectedEdge != edge) { Vector2 connectedPoint = new Vector2((float)connectedEdge.X1, (float)connectedEdge.Y1); if (connectedPoint == p1 || connectedPoint == p2) { connectedPoint = new Vector2((float)connectedEdge.X2, (float)connectedEdge.Y2); } connectedPoints.Add(connectedPoint); } } foreach (Vector2 connectedPoint in connectedPoints) { Triangle triangle = new Triangle(p1, p2, connectedPoint); triangles.Add(triangle); } } // 筛选与输入点集相关的三角形 List<Triangle> relevantTriangles = new List<Triangle>(); foreach (Triangle triangle in triangles) { bool isRelevant = false; foreach (Vector2 point in points) { if (triangle.ContainsPoint(point)) { isRelevant = true; break; } } if (isRelevant) { relevantTriangles.Add(triangle); } } // 输出泰森多边形 foreach (Triangle triangle in relevantTriangles) { Debug.DrawLine(triangle.p1, triangle.p2, Color.red); Debug.DrawLine(triangle.p2, triangle.p3, Color.red); Debug.DrawLine(triangle.p3, triangle.p1, Color.red); } ``` 希望这份代码能对您有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

撼沧

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值