有没有办法找到给定顶点的 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。