C++ Sphere 类 - 去除重复顶点并使三角形唯一
// 如果没有找到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--;
}
}
}
}
原文地址: https://www.cveoy.top/t/topic/mcun 著作权归作者所有。请勿转载和采集!