2015-10-14 89 views
1

我想將座標矢量中的數據寫入二進制.stl三維幾何文件。在C++中編寫二進制.stl文件

我需要有一個80位標題,24位數的三角形。 每個三角形都應該由3個點和一個法線來定義,每個三角形的座標值都是32位。此外,每個三角形可以有一個屬性,我想讓它保持空白。 (見wiki

我想我仍然對字符和二進制模式有誤解。

是最終產生的文件的大小與我的原始文件相同,但不能由圖形程序讀取,所以需要有一個邏輯錯誤,還是......

我點座標是雙價值鑄造之前char *,這可以這麼做嗎?

line out of the binary file

我的代碼:

void write_stl(std::string filename, std::vector<tri> triangles){ 

//binary file 
std::string header_info = "solid " + filename + "-output"; 
char head[80]; 
std::strncpy(head,header_info.c_str(),sizeof(head)-1); 
char attribute[2] = "0"; 
unsigned long nTriLong = triangles.size() ; 

std::ofstream myfile; 

myfile.open((Filename + "-out.stl").c_str(), std::ios::out | std::ios::binary); 
myfile.write(head,sizeof(head)); 
myfile.write((char*)&nTriLong,4); 

    //write down every triangle 
for (std::vector<tri>::iterator it = triangles.begin(); it!=triangles.end(); it++){ 
    //normal vector coordinates 

    myfile.write((char*)&it->m_n.m_x, 4); 
    myfile.write((char*)&it->m_n.m_y, 4); 
    myfile.write((char*)&it->m_n.m_z, 4); 

    //p1 coordinates 
    myfile.write((char*)&it->m_p1.m_x, 4); 
    myfile.write((char*)&it->m_p1.m_y, 4); 
    myfile.write((char*)&it->m_p1.m_z, 4); 

    //p2 coordinates 
    myfile.write((char*)&it->m_p2.m_x, 4); 
    myfile.write((char*)&it->m_p2.m_y, 4); 
    myfile.write((char*)&it->m_p2.m_z, 4); 

    //p3 coordinates 
    myfile.write((char*)&it->m_p3.m_x, 4); 
    myfile.write((char*)&it->m_p3.m_y, 4); 
    myfile.write((char*)&it->m_p3.m_z, 4); 

    myfile.write(attribute,2); 
} 

myfile.close(); 

}

哪裏tri僅僅是包含3點的三角形的結構,並且正常爲 「3D矢量」(即,與x結構,y,z,value)...

+0

32位= 4字節 – AnatolyS

+0

_「頭需要在ASCII模式被寫入」 _野應這就是爲什麼使用'的sizeof(變量名) –

回答

5

write()的size參數是以字節爲單位的大小,而不是位數。你是一個float經過32時,你應該通過4

+3

'是建議的方法 – NathanOliver

+0

謝謝!我看到......實際上我沒有使用尺寸,因爲我預計尺寸要比寫作時需要填充的實際空間更小。如果我不使用確切的字節,則以後無法正確讀取文件。 – Rea