首页 > 解决方案 > 如何像 Voronoi 图/泰森多边形那样生成多边形并获取每个多边形的节点?

问题描述

我希望能够生成一组多边形,我可以在其中提取每个多边形的所有节点。例如:

Polygon 1 - (0, 0),(0,2),(2,0)
Polygon 2 - (0, 2),(2,2),(2,0)
Polygon 3 - (0, 2),(5,5),(8,5),(8,0),(2,0)
And so on...

在此处输入图像描述

我对可用的工具不感兴趣,因为这只是项目的一部分。我希望能够插入随机点来生成这个带有多边形及其节点坐标的随机数据集。

我从哪说起呢?有没有我可以用编程语言实现的算法?顺便说一句:数据应该在 PostgreSQL 数据库中用作几何图形。我想使用的语言是 Java。

标签: javaalgorithmgispolygonvoronoi

解决方案


Tinfour 项目有一个名为 BoundedVoronoiDiagram 的 Java 类,它可能对您有用,可以作为灵感来源,请参阅Tinfour.org。有一个名为 ExampleVoronoi 的示例应用程序,我使用(稍作修改)从 10 个顶点生成以下图片: 在此处输入图像描述

将以下代码添加到演示的末尾会生成一个多边形列表及其顶点。该代码将多边形标识为开放(无界)或封闭(有界和有限):

List<ThiessenPolygon> polygons = diagram.getPolygons();
for (ThiessenPolygon p : polygons) {
    Vertex v = p.getVertex(); // defining vertex for polygon
    String openString = p.isOpen() ? "open  " : "closed";
    double area = p.getArea();
    System.out.format("Vertex %2d, polygon is %s, area=%5.2f%n",
            v.getIndex(), openString, area);
    List<IQuadEdge> edges = p.getEdges();
    for (IQuadEdge e : edges) {
        Vertex a = e.getA(); // first point in edge
        System.out.format("   %12.6f, %12.6f%n", a.getX(), a.getY());
    }
}

例如:

Vertex  9, polygon is closed, area= 0.09
       0.358217,     0.496937
       0.625090,     0.764692
       0.454992,     0.887576
       0.181977,     0.854051

推荐阅读