日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

将*.STL转换成顶点索引格式

發(fā)布時間:2024/6/3 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 将*.STL转换成顶点索引格式 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

將*.STL轉(zhuǎn)換成頂點索引格式

*.stl的格式很簡單,某一個片斷如下:

solid ascii
? facet normal 0.000000e+000 0.000000e+000 1.000000e+000
??? outer loop
????? vertex?? 4.104528e+002 6.994522e+002 0.000000e+000
????? vertex?? 3.895472e+002 6.994522e+002 0.000000e+000
????? vertex?? 4.309017e+002 6.951057e+002 0.000000e+000
??? endloop
? endfacet
? facet normal 0.000000e+000 0.000000e+000 1.000000e+000
??? outer loop
????? vertex?? 4.309017e+002 6.951057e+002 0.000000e+000
????? vertex?? 3.895472e+002 6.994522e+002 0.000000e+000
????? vertex?? 3.690983e+002 6.951057e+002 0.000000e+000
??? endloop
? endfacet
endsolid

可以看出,每個面都是一個三角形,有三個頂點。相鄰的面有重復(fù)的頂點。若不消除重復(fù)的頂點,索引格式實現(xiàn)起來很簡單,只需把所有面的頂點取出來,然后分配面的索引即可。若需要消除重復(fù)的頂點,那么確定面的頂點索引將十分麻煩。因此,在次將不消除重復(fù)的頂點,并忽略面的法向量。。

分析過程分兩步:

1)讀取頂點數(shù)據(jù)

2)生成索引式

Point3DList m_PointsList;
POINT3D??m_minPoint;???
POINT3D??m_maxPoint;
POINT3D??m_size;

bool ReadSTL(const char* stlFileName)
{
?FILE*? pSTLFile = fopen(stlFileName, "rt");
?if(NULL == pSTLFile)
??return false;

?m_PointsList.clear();
?m_minPoint.x = m_minPoint.y = m_minPoint.z = 10000;
?m_maxPoint.x = m_maxPoint.y = m_maxPoint.z = -10000;
?
?char strBuffer[BUF_SIZ];
?POINT3D?? pointTemp;
?char strTemp[BUF_SIZ];
?int? nPtCount = 0;
?//---------------------------
?// read from stl file
?//---------------------------
?while(fgets(strBuffer, BUF_SIZ, pSTLFile) != NULL)
?{
??memset(strTemp, 0, BUF_SIZ);
??int rlt = sscanf(strBuffer, "%s %lf %lf %lf",
???strTemp, &pointTemp.x, &pointTemp.y, &pointTemp.z);

??if(EOF != rlt)
??{
???if(0 == strcmp(strTemp, "vertex"))
???{
????// min
????if(pointTemp.x < m_minPoint.x)
????{
?????m_minPoint.x = pointTemp.x;
????}

????if(pointTemp.y < m_minPoint.y)
????{
?????m_minPoint.y = pointTemp.y;
????}

????if(pointTemp.z < m_minPoint.z)
????{
?????m_minPoint.z = pointTemp.z;
????}
????
????// max
????if(pointTemp.x > m_maxPoint.x)
????{
?????m_maxPoint.x = pointTemp.x;
????}

????if(pointTemp.y > m_maxPoint.y)
????{
?????m_maxPoint.y = pointTemp.y;
????}

????if(pointTemp.z > m_maxPoint.z)
????{
?????m_maxPoint.z = pointTemp.z;
????}

????nPtCount++;
????m_PointsList.push_back(pointTemp);
????if(nPtCount % 3 == 0)
?????m_PointsList.push_back(pointTemp);
???}
???else
???{
????continue;
???}
??}
?}
?fclose(pSTLFile);
?
?// compute size
?m_size.x = m_maxPoint.x - m_minPoint.x;
?m_size.y = m_maxPoint.y - m_minPoint.y;
?m_size.z = m_maxPoint.z - m_minPoint.z;
?if(m_size.x < 1.000000E-10)
??m_size.x = 1.000000E-10;
?if(m_size.y < 1.000000E-10)
??m_size.y = 1.000000E-10;
?if(m_size.z < 1.000000E-10)
??m_size.z = 1.000000E-10;
?
?return true;
}

bool WritePhonDat(const char* dataFileName)
{
?//-----------------------------------
?// write phon data file
?//-----------------------------------
?FILE* pOut = fopen(dataFileName, "wt");
?if(pOut == NULL)
??return false;
?
?char strTemp[BUF_SIZ];

?// position
?memset(strTemp, 0, BUF_SIZ);
?_snprintf(strTemp, BUF_SIZ, " POSITION,? %.6E,? %.6E,? %.6E/n",
??m_minPoint.x, m_minPoint.y, m_minPoint.z);
?fputs(strTemp, pOut);

?// size
?memset(strTemp, 0, BUF_SIZ);
?_snprintf(strTemp, BUF_SIZ, "SIZE??? ,? %.6E,? %.6E,? %.6E/n",
??m_size.x, m_size.y , m_size.z);
?fputs(strTemp, pOut);

?// vertex number
?int nVerNum = m_PointsList.size();
?memset(strTemp, 0, BUF_SIZ);
?_snprintf(strTemp, BUF_SIZ, "%6d/n", nVerNum);
?fputs(strTemp, pOut);
?
?// vertex
?Point3DList::iterator it = m_PointsList.begin();
?Point3DList::iterator itEnd = m_PointsList.end();
?for(; it != itEnd; ++it)
?{
??memset(strTemp, 0, BUF_SIZ);
??_snprintf(strTemp, BUF_SIZ, "%.6E %.6E %.6E/n",
???((*it).x - m_minPoint.x)/m_size.x,
???((*it).y - m_minPoint.y)/m_size.y,
???((*it).z - m_minPoint.z)/m_size.z);
??fputs(strTemp, pOut);
?}

?// faces number
?memset(strTemp, 0, BUF_SIZ);
?_snprintf(strTemp, BUF_SIZ, "%6d/n", nVerNum/3);
?fputs(strTemp, pOut);

?// faces index
?for(int i=1; i <= nVerNum; i=i+3)
?{;
??memset(strTemp, 0, BUF_SIZ);
??_snprintf(strTemp, BUF_SIZ, "%6d %6d %6d/n", i, i+1, i+2t);
??fputs(strTemp, pOut);
?}
?
?// end
?
?fclose(pOut);?
?return true;
}

轉(zhuǎn)載于:https://www.cnblogs.com/aiwz/archive/2005/09/20/6333175.html

總結(jié)

以上是生活随笔為你收集整理的将*.STL转换成顶点索引格式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。