找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 185|回复: 0

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

[复制链接]

1

主题

0

回帖

35

积分

管理员

积分
35
发表于 2024-3-21 20:14:41 | 显示全部楼层 |阅读模式
  1. #include <cmath>
  2. #include <vector>
  3. struct Point3D {
  4.     double x, y, z;
  5. };
  6. // 初始十二个顶点坐标,它们是单位半径球面上正十二面体的顶点
  7. std::vector<Point3D> initialVertices = {
  8.     { 0.0, 0.0, 1.0 }, // North pole
  9.     { 0.8944271909999159, 0.0, -0.4472135954999579 }, // Equatorial vertices
  10.     {-0.8944271909999159, 0.0, -0.4472135954999579 },
  11.     { 0.2763932022500212, 0.8506508083520399, -0.4472135954999579 },
  12.     { 0.2763932022500212, -0.8506508083520399, -0.4472135954999579 },
  13.     {-0.7236067977499788, 0.5257311121191336, -0.4472135954999579 },
  14.     {-0.7236067977499788, -0.5257311121191336, -0.4472135954999579 },
  15.     { 0.7236067977499788, 0.5257311121191336, 0.4472135954999579 },
  16.     { 0.7236067977499788, -0.5257311121191336, 0.4472135954999579 },
  17.     {-0.2763932022500212, 0.8506508083520399, 0.4472135954999579 },
  18.     {-0.2763932022500212, -0.8506508083520399, 0.4472135954999579 }
  19. };
  20. void subdivide(std::vector<Point3D>& vertices, std::vector<std::array<int, 3>>& faces) {
  21.     std::vector<Point3D> newVertices;
  22.     std::vector<std::array<int, 3>> newFaces;
  23.     for (const auto& face : faces) {
  24.         // 中心点索引
  25.         int centerIndex = vertices.size();
  26.         // 计算三角形中心点
  27.         Point3D center = {
  28.             (vertices[face[0]].x + vertices[face[1]].x + vertices[face[2]].x) / 3.0,
  29.             (vertices[face[0]].y + vertices[face[1]].y + vertices[face[2]].y) / 3.0,
  30.             (vertices[face[0]].z + vertices[face[1]].z + vertices[face[2]].z) / 3.0
  31.         };
  32.         // 投影到单位球面上
  33.         double length = std::sqrt(center.x * center.x + center.y * center.y + center.z * center.z);
  34.         if (length > 1e-6) {
  35.             center.x /= length;
  36.             center.y /= length;
  37.             center.z /= length;
  38.         }
  39.         // 添加新的顶点
  40.         vertices.push采用back(center);
  41.         // 创建四个新的面
  42.         newFaces.push采用back({ face[0], centerIndex, face[2] });
  43.         newFaces.push采用back({ face[1], centerIndex, face[0] });
  44.         newFaces.push采用back({ face[2], centerIndex, face[1] });
  45.         newFaces.push采用back({ centerIndex, face[1], face[2] });
  46.         // 移除旧的面
  47.     }
  48.    
  49.     // 替换旧的面和顶点数据
  50.     faces.swap(newFaces);
  51. }
  52. int main() {
  53.     // 初始化基本的正十二面体顶点和面片
  54.     std::vector<Point3D> vertices(initialVertices.begin(), initialVertices.end());
  55.     std::vector<std::array<int, 3>> faces; // 填充正十二面体的各个面
  56.     // 对初始网格进行多次细分以得到更细密的网格
  57.     for (int i = 0; i < desiredSubdivisionLevels; ++i) {
  58.         subdivide(vertices, faces);
  59.     }
  60.     // 输出最终的网格顶点和面信息
  61.     // ...
  62.     return 0;
  63. }
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|膜结构网

GMT+8, 2025-1-1 17:01 , Processed in 0.141015 second(s), 23 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表