我正在尝试获取一组顶点(vi = xi,yi,zi)并从中创建一个实体对象。为了绘制对象,我使用三角形,所以我需要找到一组三角形t = v1,v2,v3,它们形成一个固体表面。
我知道如果我从顶点构造每个可能的三角形,我会看到一个坚固的表面,但这会浪费在隐藏在对象内部的三角形上的大量资源,并计算它们的所有成本O(N ^ 3)其中N是顶点数。如何仅在外部找到三角形?
这是我的代码(java),用于生成具有随机顶点的对象中的所有三角形。
public class myObject {
public ArrayList<float[]> Vertex_Coords;
ArrayList<float[]> Vertex_Colors;
ArrayList<int[]> triangles;
public myObject() {
Vertex_Colors = new ArrayList<float[]>();
Vertex_Coords = new ArrayList<float[]>();
triangles = new ArrayList<int[]>();
addball(20);
}
public void addvertex() {
float[] coords = new float[3];
float[] colors = new float[4];
int i;
for (i = 0; i < 3; i++)
coords[i] = maxModelSize * ((float) Math.random()-0.5f);
for (i = 0; i < 4; i++)
colors[i] = (float) Math.random();
Vertex_Coords.add(coords);
Vertex_Colors.add(colors);
}
public void addball(int numpoints)
{
int i;
for(i = 0;i<numpoints;i++)
{
addvertex(false,true);
}
connectalltriangles();
}
public void connectalltriangles()
{
int i,j,k;
int [] tri;
for(i=0;i<Vertex_Coords.size();i++)
for(j=i+1;j<Vertex_Coords.size();j++)
for(k=j+1;k<Vertex_Coords.size();k++)
{
tri = new int[3];
tri[0]=i;
tri[1]=j;
tri[2]=k;
triangles.add(tri);
}
}
}
答案 0 :(得分:1)
如果您确定几何体是否始终是凸的,那么您真正需要的是凸壳算法。
Convex Hull:此算法通过仅连接3d空间中给定点集的最外侧顶点来创建网格。显然,您将松开凸结构内部的顶点,不会在任何三角形中使用。这仅适用于凸形。
以下是凸壳结构的一个很好的例子。
有许多库实现了Convex脱壳算法。例如:CGAL,BulletPhysics和OpenMesh。如果您正在寻找快速建造凸壳的方法,QuickHull是最好的选择。 http://www.qhull.org