voronoi 图   (泰森多边形)  Georgy Voronoi

这里是维诺图的解释,因为我之前用的是egret写的一个三国游戏,对地图进行维诺图划分势力,所以用的文中最后一个Js的库。在游戏中引入了维诺图。

http://baike.baidu.com/view/6090879.htm

https://zh.wikipedia.org/wiki/%E6%B2%83%E7%BD%97%E8%AF%BA%E4%BC%8A%E5%9B%BE

http://baike.baidu.com/item/voronoi

又叫冯洛诺伊图(Voronoi diagram) 泰森多边形

问题:给定平面中N个点,对于每个点Pi,平面中距离Pi点比距离其它点更近的点的区域是什么?即区域内的任意一点(x,y),距Pi比距离平面中的其它点都近。

平面绘制

在平面上,绘制沃罗诺伊图的过程,只要将胞点连起来构成许多三角形,利用中垂线找外心,再将所有外心相连即可。

Delaunay三角剖分算法

点集的三角剖分(Triangulation),对数值分析(比如有限元分析)以及图形学来说,都是极为重要的一项预处理技术。尤其是Delaunay三角剖分,由于其独特性,关于点集的很多种几何图都和Delaunay三角剖分相关,如Voronoi图,EMST树,Gabriel图等。Delaunay三角剖分有最大化最小角,“最接近于规则化的“的三角网和唯一性(任意四点不能共圆)两个特点。

偶图(bigraph)是有两个相互独立的位置图和连接图构成。偶图的概念是由图灵奖获得者Milner提出的,其目的为普适计算提供统一的元模型。
若无向图G = <V,E>的结点集V能够划分为两个子集V1,V2,满足V1∩V2 = F(空集),且V1∪V2 = V(全集),使得G中任意一条边的两个端点,一个属于V1,另一个属于V2,则称G为偶图(Bipartite Graph)或二分图(Bigraph)。V1和V2称为互补结点子集,偶图也可记为G = <V1,E,V2>

相关有用的博客

http://blog.sina.com.cn/s/blog_5c9288aa010144c7.html

http://www.csie.ntnu.edu.tw/~u91029/VoronoiDiagram.html

http://blog.sina.com.cn/s/blog_5fe823a50100dun6.html

http://www.tuicool.com/articles/YZV7ji

java 算法
http://www.cs.cornell.edu/Info/People/chew/Delaunay.html

c语言实现
http://blog.csdn.net/vernice/article/details/46558823

最靠谱
http://www.itdadao.com/articles/c15a224768p0.html
http://blog.csdn.net/k346k346/article/details/52244123

如何生成
http://blog.csdn.net/gdut2015go/article/details/48208983

生成维诺图的两种方式: 适量法,栅格生成法
http://blog.sina.com.cn/s/blog_a46817ff0101awtq.html
http://www.cppblog.com/eryar/archive/2014/04/30/206781.html

方法:
常见的有分治法、扫描线算法和Delaunay三角剖分算法。

  1. Delaunay 的三角分割法
    http://www.itdadao.com/articles/c15a224768p0.html

git hub上的一个生成方式 js
https://github.com/rjanicek/voronoi-map-js

https://github.com/gorhill/Javascript-Voronoi (我用这个实现了)

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值