有没有办法找到给定顶点的 3D 形状的所有边?
Is there a way to find all the edges of a 3D shape given its vertices?
我有一个简单的 3D 形状的顶点列表,例如金字塔、立方体或十二面体,是否有算法可以找到构成面的“外部顶点”之间的所有连接?
面是规则的 2d 形状(正方形代表立方体,三角形代表金字塔......)
例如,一旦将金字塔投影到 2D,我有一个矩阵,每个顶点有 8 个坐标 x,y:int[] coords = new int [8][2]
并想出了这种计算方法
for(int i = 0; i<4; i++){
for(int a = 1; a<=4; a++){
if(i+a!=3){
if(a>i){
edges.add(new Line( coords[i][0] * GROWTH + displacement ,
coords[i][1] * GROWTH + displacement,
coords[a][0] * GROWTH + displacement,
coords[a][1] * GROWTH + displacement));
}
}
}
}
这仅适用于金字塔,我想知道是否有一种方法可以计算给定的 [n][2] 组坐标的所有边,这些坐标表示投影的 3D 形状。
来自一组顶点的面
如果你有边列表,你可以应用 the graph algorithm for faces,但我试着猜了一点。
如果你的形状是凸的,你可以 find the convex hull 个顶点。
如果你的形状不是凸的,而且你的网格足够“精细”
您可以推动边缘遍历 V * (V - 1) / 2
对按距离递增排序的顶点对列表;如果 (1) 它不创建新面或 (2) none 在新创建的面中使用的边将在两个以上面的轮廓中,则将顶点添加到网格中。
球体的边
您的问题没有唯一答案,请检查Four ways to crate a mesh for a sphere
这里翻译第一种方法,类似地理坐标,基于经纬度
for(int i = 0; i<num_parallels; i++){
for(int a = 1; a<=4; num_meridians++){
double y1 = PI * i / num_parallels;
double y2 = l1 + PI / num_parallels;
double x1 = 2.0 * PI * i / num_meridians;
double x2 = x1 + 2.0 * PI / num_meridians;
add_sphere_line(x1, y1, x1, y2); // a parallel
add_sphere_line(x1, y1, x2, y1); // a meridian
}
}
添加球线的函数
void add_sphere_line(double x1, double y1, double x2, double y2){
add_3d_line(
// starting point in 3D coordinates
Math.cos(x1) * Math.sin(y1), Math.cos(y1), Math.sin(x1) * Math.sin(y1),
// end point in 3D coordinates
Math.cos(x2) * Math.sin(y2), Math.cos(y2), Math.sin(x2) * Math.sin(y2)
);
}
既然你提到你将金字塔投影到 2D,我想你也可以将这些任意线投影到 2D。
我有一个简单的 3D 形状的顶点列表,例如金字塔、立方体或十二面体,是否有算法可以找到构成面的“外部顶点”之间的所有连接? 面是规则的 2d 形状(正方形代表立方体,三角形代表金字塔......)
例如,一旦将金字塔投影到 2D,我有一个矩阵,每个顶点有 8 个坐标 x,y:int[] coords = new int [8][2]
并想出了这种计算方法
for(int i = 0; i<4; i++){
for(int a = 1; a<=4; a++){
if(i+a!=3){
if(a>i){
edges.add(new Line( coords[i][0] * GROWTH + displacement ,
coords[i][1] * GROWTH + displacement,
coords[a][0] * GROWTH + displacement,
coords[a][1] * GROWTH + displacement));
}
}
}
}
这仅适用于金字塔,我想知道是否有一种方法可以计算给定的 [n][2] 组坐标的所有边,这些坐标表示投影的 3D 形状。
来自一组顶点的面
如果你有边列表,你可以应用 the graph algorithm for faces,但我试着猜了一点。
如果你的形状是凸的,你可以 find the convex hull 个顶点。
如果你的形状不是凸的,而且你的网格足够“精细”
您可以推动边缘遍历 V * (V - 1) / 2
对按距离递增排序的顶点对列表;如果 (1) 它不创建新面或 (2) none 在新创建的面中使用的边将在两个以上面的轮廓中,则将顶点添加到网格中。
球体的边
您的问题没有唯一答案,请检查Four ways to crate a mesh for a sphere
这里翻译第一种方法,类似地理坐标,基于经纬度
for(int i = 0; i<num_parallels; i++){
for(int a = 1; a<=4; num_meridians++){
double y1 = PI * i / num_parallels;
double y2 = l1 + PI / num_parallels;
double x1 = 2.0 * PI * i / num_meridians;
double x2 = x1 + 2.0 * PI / num_meridians;
add_sphere_line(x1, y1, x1, y2); // a parallel
add_sphere_line(x1, y1, x2, y1); // a meridian
}
}
添加球线的函数
void add_sphere_line(double x1, double y1, double x2, double y2){
add_3d_line(
// starting point in 3D coordinates
Math.cos(x1) * Math.sin(y1), Math.cos(y1), Math.sin(x1) * Math.sin(y1),
// end point in 3D coordinates
Math.cos(x2) * Math.sin(y2), Math.cos(y2), Math.sin(x2) * Math.sin(y2)
);
}
既然你提到你将金字塔投影到 2D,我想你也可以将这些任意线投影到 2D。