admin 发表于 2024-3-21 20:14:41

一个正十二面体的基本顶点集合

#include <cmath>
#include <vector>

struct Point3D {
    double x, y, z;
};

// 初始十二个顶点坐标,它们是单位半径球面上正十二面体的顶点
std::vector<Point3D> initialVertices = {
    { 0.0, 0.0, 1.0 }, // North pole
    { 0.8944271909999159, 0.0, -0.4472135954999579 }, // Equatorial vertices
    {-0.8944271909999159, 0.0, -0.4472135954999579 },
    { 0.2763932022500212, 0.8506508083520399, -0.4472135954999579 },
    { 0.2763932022500212, -0.8506508083520399, -0.4472135954999579 },
    {-0.7236067977499788, 0.5257311121191336, -0.4472135954999579 },
    {-0.7236067977499788, -0.5257311121191336, -0.4472135954999579 },
    { 0.7236067977499788, 0.5257311121191336, 0.4472135954999579 },
    { 0.7236067977499788, -0.5257311121191336, 0.4472135954999579 },
    {-0.2763932022500212, 0.8506508083520399, 0.4472135954999579 },
    {-0.2763932022500212, -0.8506508083520399, 0.4472135954999579 }
};

void subdivide(std::vector<Point3D>& vertices, std::vector<std::array<int, 3>>& faces) {
    std::vector<Point3D> newVertices;
    std::vector<std::array<int, 3>> newFaces;

    for (const auto& face : faces) {
      // 中心点索引
      int centerIndex = vertices.size();

      // 计算三角形中心点
      Point3D center = {
            (vertices].x + vertices].x + vertices].x) / 3.0,
            (vertices].y + vertices].y + vertices].y) / 3.0,
            (vertices].z + vertices].z + vertices].z) / 3.0
      };
      // 投影到单位球面上
      double length = std::sqrt(center.x * center.x + center.y * center.y + center.z * center.z);
      if (length > 1e-6) {
            center.x /= length;
            center.y /= length;
            center.z /= length;
      }

      // 添加新的顶点
      vertices.push采用back(center);

      // 创建四个新的面
      newFaces.push采用back({ face, centerIndex, face });
      newFaces.push采用back({ face, centerIndex, face });
      newFaces.push采用back({ face, centerIndex, face });
      newFaces.push采用back({ centerIndex, face, face });

      // 移除旧的面
    }
   
    // 替换旧的面和顶点数据
    faces.swap(newFaces);
}

int main() {
    // 初始化基本的正十二面体顶点和面片
    std::vector<Point3D> vertices(initialVertices.begin(), initialVertices.end());
    std::vector<std::array<int, 3>> faces; // 填充正十二面体的各个面

    // 对初始网格进行多次细分以得到更细密的网格
    for (int i = 0; i < desiredSubdivisionLevels; ++i) {
      subdivide(vertices, faces);
    }

    // 输出最终的网格顶点和面信息
    // ...

    return 0;
}
页: [1]
查看完整版本: 一个正十二面体的基本顶点集合