#include "facet.h" #include "utils.h" #include #include #include static void erreur(char *mesg) { printf("ERREUR %s\n",mesg); exit(0); } void Facet::calculerNormale() { ItVertex itv=v.begin(); Point3D s1=(**(itv++)).p; Point3D s2=(**(itv++)).p; Point3D s3=(**(itv++)).p; Vecteur3D v1=vecteur(s1,s2); Vecteur3D v2=vecteur(s2,s3); n=prodVect(v1,v2); float dist=sqrt(prodScal(n,n)); if (dist<1e-05) { printf("facette anormale : norme nulle\n"); if (itv!=v.end()) { s3=(**(itv++)).p; Vecteur3D v3=vecteur(s2,s3); n=prodVect(v1,v3); dist=sqrt(prodScal(n,n)); } } else { n.x/=dist; n.y/=dist; n.z/=dist; } } void attendre(int nb) { float a; for(long i=0;in.x,(*itv)->n.y,(*itv)->n.z); glVertex3f((*itv)->p.x,(*itv)->p.y,(*itv)->p.z); } glEnd(); } void Facet::tracer() { glColor3f(1,0,0); glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); glEnable(GL_POLYGON_OFFSET_FILL); glPolygonOffset(1,1); tracer2(); glDisable(GL_POLYGON_OFFSET_FILL); glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); glColor3f(0.0,0.0,0.0); glLineWidth(2.0); tracer2(); glLineWidth(1.0); glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); } void calculerNormale(LFacet *l) { ItFacet itf; for(itf=l->begin();itf!=l->end();itf++) { (*itf)->calculerNormale(); } } void calculerNormaleSommet(MObjet *l) { ItFacet itf; ItVertex itv; ItAVertex ita; calculerNormale(&(l->f)); for(itf=l->f.begin();itf!=l->f.end();itf++) { for(itv=(*itf)->v.begin();itv!=(*itf)->v.end();itv++) { (*itv)->n=add((*itv)->n,(*itf)->n); (*itv)->nb++; } } for(ita=l->v.begin();ita!=l->v.end();ita++) { // printf("%f,%f,%f\n",(*ita)->n.x,(*ita)->n.y,(*ita)->n.z); (*ita)->n=scale((*ita)->n,1.0/static_cast((*ita)->nb)); // printf("%d\n",(*ita)->nb); normer((*ita)->n); } } void initA(LFacet *l) { ItFacet itf; for(itf=l->begin();itf!=l->end();itf++) { (*itf)->A=(*((*itf)->v.begin()))->p; } } void tracer(Facet f) { f.tracer2(); } void tracer(LFacet l) { ItFacet itf; for(itf=l.begin();itf!=l.end();itf++) { tracer((**itf)); } } void tracer(MObjet o) { tracer(o.f); } void gonfler(MObjet o,float k) { ItAVertex ita; for(ita=o.v.begin();ita!=o.v.end();ita++) { (*ita)->p=add((*ita)->p,scale((*ita)->n,k)); } } void tracerNormale(AVertex a) { ItAVertex ita; Point3D pp; for(ita=a.begin();ita!=a.end();ita++) { glBegin(GL_LINES); glVertex3f((*ita)->p.x,(*ita)->p.y,(*ita)->p.z); pp=add((*ita)->p,(*ita)->n); glVertex3f(pp.x,pp.y,pp.z); glEnd(); } }