#include #include #include #include #include #include #include #include Objet3D::Objet3D(QString name) { nom = name; nbsommets=0; nbfaces=0; id=0; smooth = false; } Objet3D::Objet3D(const Objet3D& C) { nom = C.nom; nbsommets=C.nbsommets; nbfaces=C.nbfaces; lpoints = C.lpoints; lfaces = C.lfaces; //ne pas recopier les normal lpointsnormales = C.lpointsnormales ; lfacesnormales = C.lfacesnormales; smooth =C.smooth; min = C.min; max = C.max; centroid = C.centroid; } bool Objet3D::charger_Off(QString objet){ nom = objet.split('/').last().split('.').first(); QFile file(objet); if(!file.open(QIODevice::ReadOnly)) { QMessageBox::information(0, "error Ouverture fichier", file.errorString()); return false; } QTextStream in(&file); int lin=-1; while(!in.atEnd()) { QString line = in.readLine(); QStringList list_value; line = line.simplified(); if((line != "OFF")&& lin ==-1) // controle header { QMessageBox::information(0, "Erreur dans l'en tête du fichier OFF", file.errorString()); return false; } if(lin == -1) lin = 0; if(lin == 0) { uint v=0; line = in.readLine(); line = line.simplified(); list_value = line.split(' '); // qDebug()<< list_value << endl; nbsommets = list_value[0].toUInt( ); nbfaces = list_value[1].toUInt(); v = list_value[2].toUInt(); id = v; lin=1; lpoints.clear(); lfaces.clear(); lfacesnormales.clear(); line = in.readLine(); line = line.simplified(); } if(lpoints.size() < nbsommets) { // chargement des sommet point3D p; list_value = line.split(' '); //qDebug()<< list_value << endl; p.x=list_value[0].toDouble(); p.y=list_value[1].toDouble(); p.z=list_value[2].toDouble(); if (min.x > p.x) min.x = p.x; if (min.y > p.y) min.y = p.y; if (min.z > p.z) min.z = p.z; if (max.x < p.x) max.x = p.x; if (max.y < p.y) max.y = p.y; if (max.z < p.z) max.z = p.z; lpoints.push_back(p); }else if(lfaces.size() < nbfaces){ uint v=0; face F; list_value = line.split(' '); //qDebug()<< list_value << endl; v=list_value[0].toUInt(); F.S1=list_value[1].toUInt(); F.S2=list_value[2].toUInt(); F.S3=list_value[3].toUInt(); if (v != 3) { QMessageBox::information(0, "Erreur au chargement des faces, non triangulaires", file.errorString()); return false; } lfaces.push_back(F); } } //calcul du centroid de l'objet à partir de la boîte min/max centroid.x = (max.x + min.x) / 2.0f; centroid.y = (max.y + min.y) / 2.0f; centroid.z = (max.z + min.z) / 2.0f; /*qDebug() << "Chargement du fichier " << objet << "\t" << "parmétres : " << nbsommets << " points - " << nbfaces << " arêtes\n" << "\t" << "Box : MAX(" << max.x << " " << max.y << " " << max.z << ")\t" << " MIN(" << min.x << " " << min.y << " " << min.z << ")\t" << " CENTROID(" << centroid.x << " " << centroid.y << " " << centroid.z <<")." << endl; */ calcul_normales_faces(); calcul_normales_points(); file.close(); return true; } void Objet3D::calcul_normales_points() { lpointsnormales.clear(); //qDebug()<< "taille vide = "<& lnp, deque& lnf, deque& lp, deque& lf, deque& borne) { for(uint i =borne[0]; i< borne[1]; i++) { lnp[lf[i].S1] = lnp[lf[i].S1] + lnf[lf[i].S1] ; lnp[lf[i].S2] = lnp[lf[i].S2] + lnf[lf[i].S2] ; lnp[lf[i].S3] = lnp[lf[i].S3] + lnf[lf[i].S3] ; } } void Objet3D::calcul_normales_face(deque& lnf, deque& lp, deque& lf, uint debut, uint fin) { point3D v1; point3D v2; //qDebug()<< "taille normal = "< p.x) min.x = p.x; if (min.y > p.y) min.y = p.y; if (min.z > p.z) min.z = p.z; if (max.x < p.x) max.x = p.x; if (max.y < p.y) max.y = p.y; if (max.z < p.z) max.z = p.z; lpoints.push_back(p); } //calcul du centroid de l'objet à partir de la boîte min/max centroid.x = (max.x + min.x) / 2.0f; centroid.y = (max.y + min.y) / 2.0f; centroid.z = (max.z + min.z) / 2.0f; /*qDebug() << "Chargement du Maillage " << nom << "\t" << "parmétres : " << nbsommets << " points - " << nbfaces << " arêtes\n" << "\t" << "Box : MAX(" << max.x << " " << max.y << " " << max.z << ")\t" << " MIN(" << min.x << " " << min.y << " " << min.z << ")\t" << " CENTROID(" << centroid.x << " " << centroid.y << " " << centroid.z <<")." << endl;*/ if(!smooth){ calcul_normales_faces(); calcul_normales_points(); /* // sequence multi thread a ameliore * deque b1, b2, b3; while ( lpointsnormales.size() < lpoints.size()) { lpointsnormales.push_back(point3D(0.,0.,0.)); } b1.push_back(0);b1.push_back(lfacesnormales.size()/3); b2.push_back(lfacesnormales.size()/3);b2.push_back(2 * lfacesnormales.size()/3); b3.push_back(2 * lfacesnormales.size()/3);b1.push_back(lfacesnormales.size()); QFuture t1 = QtConcurrent::run(Objet3D::calcul_normales_point, lpointsnormales, lfacesnormales, lpoints, lfaces, b1); QFuture t2 = QtConcurrent::run(Objet3D::calcul_normales_point, lpointsnormales, lfacesnormales, lpoints, lfaces, b2); QFuture t3 = QtConcurrent::run(Objet3D::calcul_normales_point, lpointsnormales, lfacesnormales, lpoints, lfaces, b3); t1.waitForFinished(); t2.waitForFinished(); t3.waitForFinished(); for(uint i = 0;i t1 = QtConcurrent::run(Objet3D::calcul_normales_face, lfacesnormales, lpoints, lfaces, 0, lfacesnormales.size()/3); QFuture t2 = QtConcurrent::run(Objet3D::calcul_normales_face, lfacesnormales, lpoints, lfaces, lfacesnormales.size()/3, 2*lfacesnormales.size()/3); QFuture t3 = QtConcurrent::run(Objet3D::calcul_normales_face, lfacesnormales, lpoints, lfaces, 2*lfacesnormales.size()/3, lfacesnormales.size()); t1.waitForFinished(); t2.waitForFinished(); t3.waitForFinished(); */ }