Ho un file STL(stereolitography) che può essere ascii o binario che rappresentano delle semisfere in uno spazio 3D.
Ci sono tre semisfere posizionate a forma di triangolo.
Devo trovare il centro delle sfere che poi servirà ad uno per allineare la tac con questo file senza farlo a mano.
Ho scritto del codice che penso che serva solo per un oggetto. Bisognerebbe trovare il centro per ognuna. Non so se il codice è corretto in quanto non conosco benissimo il c++.
codice:
#include <iostream>
#include <stdio.h>
#include <sstream>
#include <fstream>
#include <cstdlib>
#include <string>
#include <stdlib.h>
using namespace std;
class data // i 3 vertici di ciascun triangolo
{
public:
float x1,y1,z1;
float x2,y2,z2;
float x3,y3,z3;
};
int main (int argc, char* argv[])
{
FILE *fileStl;
fileStl = fopen(argv[1], "rb");
// std::cout << "Inserisci un nome per un .stl file" <<std::endl;
unsigned char * pBuf[80];
uint32_t numTriangles;
fread(&numTriangles, 4, 1, fileStl);
// determina il numero dei triangoli che formano la semisfera dal file STL
numTriangles = *((uint32_t *)pBuf);
data * triangles = new data[numTriangles];
// riempi l'array triangles con i dati nel file STL
double totalVolume = 0, currentVolume;
double xCenter = 0, yCenter = 0, zCenter = 0;
//usa la formula matematica per trovare il centroide
for (int i = 0; i < numTriangles; i++)
{
totalVolume += currentVolume = (triangles[i].x1*triangles[i].y2*triangles[i].z3 - triangles[i].x1*triangles[i].y3*triangles[i].z2 - triangles[i].x2*triangles[i].y1*triangles[i].z3 + triangles[i].x2*triangles[i].y3*triangles[i].z1 + triangles[i].x3*triangles[i].y1*triangles[i].z2 - triangles[i].x3*triangles[i].y2*triangles[i].z1) / 6;
xCenter += ((triangles[i].x1 + triangles[i].x2 + triangles[i].x3) / 4) * currentVolume;
yCenter += ((triangles[i].y1 + triangles[i].y2 + triangles[i].y3) / 4) * currentVolume;
zCenter += ((triangles[i].z1 + triangles[i].z2 + triangles[i].z3) / 4) * currentVolume;
}
cout << endl << "Total Volume = " << totalVolume << endl;
cout << endl << "X center = " << xCenter/totalVolume << endl;
cout << endl << "Y center = " << yCenter/totalVolume << endl;
cout << endl << "Z center = " << zCenter/totalVolume << endl;
}