【发布时间】:2015-11-21 19:23:54
【问题描述】:
我在二维空间中有一个点数组。我正在尝试从这些点创建尽可能多的三角形,但是:
- 所有三角形都必须有效(a
- 任何三角形都不能包含一个点(只有它们的顶点)
- 任何三角形都不能与任何其他三角形相交
我所说的交点是指一个三角形不能在另一个三角形内,一个三角形的边不能与另一个三角形相交(但它们可以共享一条边)。
我认为我的算法没有问题(为简单起见伪):
newTriangles := false
do:
newTriangles := false
for a in points:
for b in points:
if b = a:
continue
for c in points:
if c = a or c = b:
continue
// So now we have every combination of a, b and c
// Now the tests
if not valid_triangle(a, b, c) then continue
containsPoint := false
for p in points:
if p = a or p = b or p = c:
continue
if contains(a, b, c, p):
containsPoint := true // first 3 params are the vertices of the triangle, the 4th is the point for test
if containsPoint:
continue
// Now the last test, the existing triangle intersection
intersects := false
for triangle in triangles:
if intersects(triangle, a, b, c):
intersects := true
// It passed every test, it can be a triangle
if not intersects:
triangles.add(new triange(a, b, c))
newTriangles := true
while newTriangles
这连接了一些三角形,但每个三角形都与其他三角形相互隔离。我猜交叉点检查返回true。现在更好地说明我的问题:
所以第一步发生了,但第二步不会,它使每个三角形(有时是单个点)都是孤立的。但是,如果我更改我的交叉路口检查代码,那么此代码将永远不会停止。有什么解决办法?
编辑:
这是我的相交算法(这是真正的 Java 代码):
public static boolean intersects(Vector2f a, Vector2f b, Vector2f c, Triangle other) {
boolean x = (Line.segmentIntersects(a, b, other.a, other.b) || Line.segmentIntersects(b, c, other.a, other.b)) ||
(Line.segmentIntersects(a, b, other.a, other.b) || Line.segmentIntersects(a, c, other.a, other.b)) ||
(Line.segmentIntersects(a, c, other.a, other.b) || Line.segmentIntersects(b, c, other.a, other.b));
boolean y = (Line.segmentIntersects(a, b, other.b, other.c) || Line.segmentIntersects(b, c, other.b, other.c)) ||
(Line.segmentIntersects(a, b, other.b, other.c) || Line.segmentIntersects(a, c, other.b, other.c)) ||
(Line.segmentIntersects(a, c, other.b, other.c) || Line.segmentIntersects(b, c, other.b, other.c));
boolean z = (Line.segmentIntersects(a, b, other.a, other.c) || Line.segmentIntersects(b, c, other.a, other.c)) ||
(Line.segmentIntersects(a, b, other.a, other.c) || Line.segmentIntersects(a, c, other.a, other.c)) ||
(Line.segmentIntersects(a, c, other.a, other.c) || Line.segmentIntersects(b, c, other.a, other.c));
return (x || y || z ||
other.contains(a) || other.contains(b) || other.contains(c));
}
段相交是:
public static boolean segmentIntersects(Vector2f ps1, Vector2f pe1, Vector2f ps2, Vector2f pe2) {
return (Line2D.linesIntersect(ps1.x, ps1.y, pe1.x, pe1.y, ps2.x, ps2.y, pe2.x, pe2.y));
}
并包含:
private static float sign(Vector2f p1, Vector2f p2, Vector2f p3) {
return (p1.x - p3.x) * (p2.y - p3.y) - (p2.x - p3.x) * (p1.y - p3.y);
}
public static boolean contains(Vector2f a, Vector2f b, Vector2f c, Vector2f p) {
boolean b1, b2, b3;
b1 = sign(p, a, b) < 0.0f;
b2 = sign(p, b, c) < 0.0f;
b3 = sign(p, c, a) < 0.0f;
return ((b1 == b2) && (b2 == b3));
}
【问题讨论】:
-
我猜你的“intersects”函数并没有像你想象的那样做。如果将其添加到您的帖子中,我们可能会知道。
-
谷歌
point cloud triangulation也许?或者甚至Delaunay triangulation? -
@n.m.我会检查一下(我不知道大多数事情的英语表达,因为我的语言没有太多文档)
标签: algorithm intersection triangulation