// 如果没有找到d:
// 将di设置为vertices的大小
// 将d添加到vertices中
if(!d_found) {
  di = vertices.size();
  vertices.push_back(d);
}
// 如果没有找到e:
// 将ei设置为vertices的大小
// 将e添加到vertices中
if(!e_found) {
  ei = vertices.size();
  vertices.push_back(e);
}
// 如果没有找到f:
// 将fi设置为vertices的大小
// 将f添加到vertices中
if(!f_found) {
  fi = vertices.size();
  vertices.push_back(f);
}

// 将ai添加到triangles中
// 将di添加到triangles中
// 将fi添加到triangles中
triangles.push_back(ai);
triangles.push_back(di);
triangles.push_back(fi);

// 将di添加到triangles中
// 将bi添加到triangles中
// 将ei添加到triangles中
triangles.push_back(di);
triangles.push_back(bi);
triangles.push_back(ei);

// 将fi添加到triangles中
// 将ei添加到triangles中
// 将ci添加到triangles中
triangles.push_back(fi);
triangles.push_back(ei);
triangles.push_back(ci);

// 将fi添加到triangles中
// 将di添加到triangles中
// 将ei添加到triangles中
triangles.push_back(fi);
triangles.push_back(di);
triangles.push_back(ei);
}
}

// 使向量成为非定向的和独特的
void Sphere::makeUnique(){
  for(unsigned int i = 0; i < vertices.size(); i++) {
    if(vertices[i].z < 0) { // 使半球
      vertices.erase(vertices.begin() + i);

      // 删除所有包含顶点i的三角形
      int t = 0;
      for(std::deque<unsigned int>::iterator it = triangles.begin();
          it != triangles.end();) {
        if(triangles[t] == i || triangles[t + 1] == i ||
           triangles[t + 2] == i) {
          it = triangles.erase(it);
          it = triangles.erase(it);
          it = triangles.erase(it);
        } else {
          ++it;
          ++it;
          ++it;
          t += 3;
        }
      }
      // 更新三角形中的索引
      for(unsigned int j = 0; j < triangles.size(); j ++) {
        if(triangles[j] > i) {
          triangles[j]--;
        }
      }

      i--;
    } else if(vertices[i].z == 0) { // 使赤道向量独特
      if(vertices[i].x < 0) {
        vertices.erase(vertices.begin() + i);
        // 删除所有包含顶点i的三角形
        int t = 0;
        for(std::deque<unsigned int>::iterator it = triangles.begin();
            it != triangles.end();) {
          if(triangles[t] == i || triangles[t + 1] == i ||
             triangles[t + 2] == i) {
            it = triangles.erase(it);
            it = triangles.erase(it);
            it = triangles.erase(it);
          } else {
            ++it;
            ++it;
            ++it;
            t += 3;
          }
        }
        // 更新三角形中的索引
        for(unsigned int j = 0; j < triangles.size(); j ++) {
          if(triangles[j] > i) {
            triangles[j]--;
          }
        }
        i--;
      } else if(vertices[i].x == 0 && vertices[i].y == -1) {
        vertices.erase(vertices.begin() + i);
        // 删除所有包含顶点i的三角形
        int t = 0;
        for(std::deque<unsigned int>::iterator it = triangles.begin();
            it != triangles.end();) {
          if(triangles[t] == i || triangles[t + 1] == i ||
             triangles[t + 2] == i) {
            it = triangles.erase(it);
            it = triangles.erase(it);
            it = triangles.erase(it);
          } else {
            ++it;
            ++it;
            ++it;
            t += 3;
          }
        }
        // 更新三角形中的索引
        for(unsigned int j = 0; j < triangles.size(); j ++) {
          if(triangles[j] > i) {
            triangles[j]--;
          }
        }
        i--;
      }
    }
  }
}
C++ Sphere 类 - 去除重复顶点并使三角形唯一

原文地址: https://www.cveoy.top/t/topic/mcun 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录