Как найти область нарезки в STL-модели

Я реализовал следующий код для поиска и поиска вершин в поперечном сечении STL-модели. Поскольку используемые мной модели обычно содержат более миллиона узлов (вершин), было бы неэффективно, если бы я действительно искал все узлы (вершины) и проверил, находятся ли они в области поперечного сечения. Поэтому, как только первые узлы найдены, я просто проверяю соседние узлы, чтобы найти следующий граничный узел. И продолжайте, чтобы достичь первого узла, который я нашел.

Я хочу составить список всех вершин blude в разделе обрезки модели:введите описание изображения здесь

void findCroppingPoints()
{
unsigned int i, f;
int iFirst, k, kOld, p, cnt= 0;
bool isEdge1, isEdge2, isEdge3;

for (i = 0; i < (m_FacetList.size()); i++)
{
isEdge1 = isEdge2 = isEdge3 = false;

//check the three edges of the triange i to see if they are on the cross-section.
isEdge1 = isEdgeVertex(i, 1);
isEdge2 = isEdgeVertex(i, 2);
isEdge3 = isEdgeVertex(i, 3);

if (isEdge1 || isEdge2 || isEdge3)
{
iFirst = i;
saveFacet:
if (cnt == 0)
if (isEdge1 = true)
p = 0;
else if (isEdge2 = true)
p = 1;
else
p = 2;
m_EdgePointList.push_back(m_FacetList[i]->vertex[p]);
cnt++;

for (f = 0; f < m_FacetList.size(); f++)
{
isEdge1 = isEdge2 = isEdge3 = false;
if (f != iFirst)
for (k = 0; k < 3; k++)
{
if (m_FacetList[i]->vertex[p] == m_FacetList[f]->vertex[k]) // Search for the triangle, whiche contains the p (the edge, which has found before)
{
switch (k) // check, which of the two connected edges on this point is on the cross-section
{
case 0:
if (i != f || kOld != 1)
if (isEdgeVertex(f, 1))
{
isEdge1 = true;
p = 1;
kOld = k;
i = f; // Spring to the new-found triangle
goto saveFacet;
}
if (i != f || kOld != 2)
if (isEdgeVertex(f, 3))
{
isEdge3 = true;
p = 2;
kOld = k;
i = f; // Spring to the new-found triangle
goto saveFacet;
}
break;
case 1:
if (i != f || kOld != 0)
if (isEdgeVertex(f, 1))
{
isEdge1 = true;
p = 0;
kOld = k;
i = f; // Spring to the new-found triangle
goto saveFacet;
}
if (i != f || kOld != 2)
if (isEdgeVertex(f, 2))
{
isEdge2 = true;
p = 2;
kOld = k;
i = f; // Spring to the new-found triangle
goto saveFacet;
}
break;
case 2:
if (i != f || kOld != 1)
if (isEdgeVertex(f, 2))
{
isEdge2 = true;
p = 1;
kOld = k;
i = f; // Spring to the new-found triangle
goto saveFacet;
}
if (i != f || kOld != 0)
if (isEdgeVertex(f, 3))
{
isEdge3 = true;
p = 0;
kOld = k;
i = f; // Spring to the new-found triangle
goto saveFacet;
}
break;
}
}
}
}
break;
}
}
}

Вот как я проверяю, представляет ли ребро треугольника ребро сечения:

bool CSTLModel::isEdgeVertex(unsigned int FacetNum, int VertexNum)
{
bool isEdge;
unsigned int f1, f2, f3;
int k1, k2, p1, p2;

switch (VertexNum)
{
case 1:
p1 = 0;
p2 = 1;
break;
case 2:
p1 = 1;
p2 = 2;
break;
case 3:
p1 = 2;
p2 = 0;
break;
}
for (f1 = 0 ; f1 < m_FacetList.size(); f1++)
{
if (f1 != FacetNum)
{
isEdge = true;
for (k1 = 0; k1 < 3; k1++)
if (m_FacetList[FacetNum]->vertex[p1] == m_FacetList[f1]->vertex[k1])
for (k2 = 0; k2 < 3; k2++)
if (m_FacetList[FacetNum]->vertex[p2] == m_FacetList[f1]->vertex[k2])
{
isEdge = false;
goto endLoop;
}
}
}
endLoop:
return isEdge;
}

Но это не сработает, если в модели несколько разделов обрезки, я не могу перейти к следующему разделу без необходимости искать во всех узлах.

Знаете ли вы какой-нибудь другой более простой алгоритм для поиска участков обрезки в модели STL? Или какое-либо решение проблемы выше?

0

Решение

Я нашел ответ, используя карту классов stl (St. Lib.). Таким образом, я мог сохранить все базы модели в виде вектора или координат, а затем в качестве «ключа» карты и вершин на каждой базе в качестве значения вместе с ключом:

    findCroppingPoints()
{
long int oldMapSize = 0;
unsigned char p1, p2;
std::map<std::vector<double>, Coordinate<double>> baseMap;
std::vector<double> baseVector;
for (int i = 0; i < m_FacetList.size(); ++i)
{
for (unsigned char j = 0; j < 6; ++j)
{
switch (j)
{
case 0:
p1 = 0;
p2 = 1;
break;
case 1:
p1 = 0;
p2 = 2;
break;
case 2:
p1 = 1;
p2 = 0;
break;
case 3:
p1 = 1;
p2 = 2;
break;
case 4:
p1 = 2;
p2 = 0;
break;
case 5:
p1 = 2;
p2 = 1;
break;
default:
throw ErrorObj("Unknown_flag.");
}
baseVector.push_back(m_FacetList[i]->vertex[p1].x());
baseVector.push_back(m_FacetList[i]->vertex[p1].y());
baseVector.push_back(m_FacetList[i]->vertex[p1].z());
baseVector.push_back(m_FacetList[i]->vertex[p2].x());
baseVector.push_back(m_FacetList[i]->vertex[p2].y());
baseVector.push_back(m_FacetList[i]->vertex[p2].z());

Всякий раз, когда размер карты не изменяется, это означает, что последний ключ (вектор) уже существует и, следовательно, не является краевой базой.

oldMapSize = baseMap.size();
baseMap[baseVector] = m_FacetList[i]->vertex[p1];
if (oldMapSize == baseMap.size())
{
baseMap.erase(baseVector);
}
baseVector.clear();
}
}
std::map<std::vector<double>, Coordinate<double>>::iterator it = baseMap.begin();
while (it != baseMap.end())
{
m_EdgePointList.push_back(it->second);
++it;
}
baseMap.clear();
}

Точно так же я мог найти все граничные основания, не проверяя это свойство (будучи краевым основанием) для каждой отдельной базы.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector