给定一个三维三角网格,如何确定它是凸的还是凹的?是否有一种算法可以检查这个问题?如果有,定义一个容差范围以忽略小的凹陷将会很有用。
给定一个三维三角网格,如何确定它是凸的还是凹的?是否有一种算法可以检查这个问题?如果有,定义一个容差范围以忽略小的凹陷将会很有用。
一个凸多面体可以定义为有限数量半空间的交集。这些半空间实际上是定义面的半空间。
编辑:假设您的网格实际上定义了一个多面体(即存在“内部”和“外部”)
您可以像这样执行操作(伪代码):
for each triangle
p = triangle plane
n = normal of p (pointing outside)
d = distance from the origin of p
//Note: '*' is the dot product.
//so that X*N + d = 0 is the plane equation
//if you write a plane equation like (X-P)*n = 0 (where P is any point which lays in the plane), then d = -P*n (it's a scalar).
for each vertex v in the mesh
h = v*N + d
if (h > Tolerance) return NOT CONVEX
//Notice that when v is a vertex of the triangle from which n and d come from,
//h is always zero, so the tolerance is required (or you can avoid testing those vertices)
end
end
return CONVEX
p * n + d = 0
。难道一个平面不是由(x - p) * n = 0
定义的吗?d
是向量还是标量?你所说的p = triangle plane
是指p
是原点向量吗?顺便说一下,容差在你的算法中并不是必需的,因为允许非凹多边形网格包含共线顶点。但在我的情况下,拥有容差范围很好。 - danijarX * N - d = 0
吗?而不是加号?我理解浮点数精度的问题。 - danijar对于您所描述的简单多边形,您可以检查每个顶点处的每个内角,并检查角度是否低于180度。如果是,则它不可能是凹多边形。如果单个顶点超过180°,则它是凹多边形。
编辑:对于3D网格,相同的想法适用,但您必须在每个顶点上测试每个三角形与彼此之间的角度是否高于或低于180°。