我的问题很奇怪,在寻找答案时我没有看到类似的东西。我已经从Delaunay三角剖分中制作了一个Voronoi图,并且大部分时间它工作正常,但偶尔也会在图中间缺少一个随机多边形。这是我在三角测量中的Voronoi图的代码。
public void gon() {
for(Node n : nodes) { // step through all the nodes which make up the triangulation
ArrayList<Triangle> centers = new ArrayList<Triangle>();
for(Triangle t:tri) {
if((t.ax == n.x && t.ay == n.y)||(t.bx == n.x && t.by == n.y)||(t.cx == n.x && t.cy == n.y)) {
centers.add(t);
}
}
if(centers.size() != 0) { // as long as there are triangles in the list that will make up a polygon
ArrayList<Triangle> orderPoly = order(centers);
int[] x = new int[orderPoly.size()];
int[] y = new int[orderPoly.size()];
Cell cell = new Cell(orderPoly.size());
orderPoly = order(centers);
for(int i = 0; i < orderPoly.size(); i++) {
x[i] = orderPoly.get(i).circumCenter.x;
y[i] = orderPoly.get(i).circumCenter.y;
}
cell.x=x;
cell.y=y;
cell.check();
cells.add(cell);
}
}
}
这里的代码遍历构成三角剖分的点,获取使用该点的所有三角形,对点(下面的代码)进行排序,然后继续将它们添加到Voronoi单元类,其中包含用于绘制的多边形目的,然后将该细胞添加到细胞Arraylist。
public ArrayList<Triangle> order(ArrayList<Triangle> centers){
ArrayList<Triangle> orderPoly = new ArrayList<Triangle>();
orderPoly.add(centers.get(0));
Triangle temp = orderPoly.get(0);
for(Triangle t : centers) {
for(Triangle p : centers) {
if(shareSide(p,temp) && !orderPoly.contains(p)) {
orderPoly.add(p);
temp = p;
break;
}
}
}
return orderPoly;
}
这适用于绝大多数细胞,但偶尔也会缺少细胞。我相信单元格存在,但是因为多边形自相交而没有被绘制。我已经使用种子随机生成器进行了大量调试,这似乎是问题所在。这让我相信我的细胞生成必定存在缺陷。有人有什么建议或看错了吗?
如果有人需要,我可以为我的任何课程发布更多代码。