#include "polygon.h" void polygon::_init_normal_(void) { if(vl && count>0) { for(unsigned i=0; i& tm, int p) { for(unsigned i=0; i& tm, int p) { center.transform(tm, p); normal.transform(tm, p); } void polygon::reset(void) { /* for(unsigned i=0; i clip; polygon ret; for(unsigned j=0; j<(*this).card(); j++) { double x0=(*vl)[container::operator[](j)][X], y0=(*vl)[container::operator[](j)][Y], z0=(*vl)[container::operator[](j)][Z], x1=(*vl)[container::operator[]((j+1)%(*this).card())][X], y1=(*vl)[container::operator[]((j+1)%(*this).card())][Y], z1=(*vl)[container::operator[]((j+1)%(*this).card())][Z]; // Wenn beide drin sind den zweiten übernehmen. if(z0>min_Z && z1>min_Z) // Nur P2 nach clip übernehmen clip[clip.card()]= container::operator[]((j+1)%(*this).card()); // Wenn nur P2 drin ist if(z0<=min_Z && z1>min_Z) { // Schnittpunkt berechnen und nach temp übernehmen unsigned idx=(*vl).card(); double t=(min_Z-z0)/(z1-z0); double x=x0+t*(x1-x0); double y=y0+t*(y1-y0); // neuen Vertex zur Vertexliste. (*vl)[idx]=vertex(x, y, min_Z, COORD); // und ins geclippte polygon clip[clip.card()]=idx; // und P2 ins geclippte polygon clip[clip.card()]= container::operator[]((j+1)%(*this).card()); } // Wenn nur P1 drin ist if(z0>min_Z && z1<=min_Z) { // Schnittpunkt berechnen und nach temp übernehmen unsigned idx=(*vl).card(); double t=(min_Z-z1)/(z0-z1); double x=x1+t*(x0-x1); double y=y1+t*(y0-y1); // neuen Vertex zur Vertexliste. (*vl)[idx]=vertex(x, y, min_Z, COORD); // und ins geclippte polygon clip[clip.card()]=idx; } } // Das geclippte Polygon zurückliefern. ret=polygon(clip, vl); ret.set_id(id); return ret; } /** * \brief Clippings nach Sutherland-Hodgman * * Cliped das Polygon an dem Polygon p. Es wird ein neues Polygon * erzeugt, das diesem Polygon innerhalb des Polygons p entspricht. * Dieses neue Polygon nutzt die selbe Vertexliste. * * \param p Das Polygon an dem geclipped werden soll. * \returns Ein in p passendes Polygon. */ polygon polygon::clip_2d(const polygon& p) const { //! enthält während des clippings die aktuellen //! Vertex_listen indizies. container clip; // Zuerst Origialdaten sichern. clip=(container)*this; // Solange unbearbeitete Kanten im Clippolygon sind... for(unsigned i=0; i temp; //! Hole nächste Kante des Clippolygons und sichere sie als //! Vektor. Diese ist definiert über die beiden Punkte //! p[i] und p[(i+1)%p.card()] double x0=p[i][X], y0=p[i][Y], x1=p[(i+1)%p.card()][X], y1=p[(i+1)%p.card()][Y]; // Jetzt muss zunaechst ein Vektor erzeugt werden der senkrecht // von der Kante ins Poligon zeigt // chk=(X=P1.Y-P2.Y, Y=P2.X-P1.X, 0) vertex chk(y0-y1, x1-x0, 0, VEKTOR); // Solange Kanten nicht bearbeitet wurden for(unsigned j=0; j 0.05 und/oder double chk_p1=chk%((*vl)[clip[j]] - (*p.vl)[i]); //! liegt der zweite Punkt innerhalb des Clippolygons //! chk%(P2 - clipP1) > 0.05 double chk_p2=chk%((*vl)[clip[(j+1)%clip.card()]] - (*p.vl)[i]); // 0.05 ist ein Epsilon um Ungenauigkeiten auszugleichen und // ganz sicher zu gehen das der Punkt wirklich innerhalb liegt. // Wenn beide drin sind if(chk_p1>0.05 && chk_p2>0.05) // Nur P2 nach temp übernehmen temp[temp.card()]=clip[(j+1)%clip.card()]; // Wenn nur P1 drin ist if(chk_p1>0.05 && chk_p2<=0.05) { // Schnittpunkt berechnen und nach temp übernehmen unsigned idx=(*vl).card(); double x,y; x=x0+((((x1s-x0s)*(y0-y0s))+((y1s-y0s)*(x0s-x0)))/ (((x1-x0)*(y1s-y0s))-((y1-y0)*(x1s-x0s))))*(x1-x0); y=y0+((((x1s-x0s)*(y0-y0s))+((y1s-y0s)*(x0s-x0)))/ (((x1-x0)*(y1s-y0s))-((y1-y0)*(x1s-x0s))))*(y1-y0); // neuen Vertex zur Vertexliste. (*vl)[idx]=vertex(x, y, 0, COORD); temp[temp.card()]=idx; } // Wenn nur P2 drin ist if(chk_p1<=0.05 && chk_p2>0.05) { // Schnittpunkt berechnen und nach temp übernehmen unsigned idx=(*vl).card(); double x,y; x=x0+((((x1s-x0s)*(y0-y0s))+((y1s-y0s)*(x0s-x0)))/ (((x1-x0)*(y1s-y0s))-((y1-y0)*(x1s-x0s))))*(x1-x0); y=y0+((((x1s-x0s)*(y0-y0s))+((y1s-y0s)*(x0s-x0)))/ (((x1-x0)*(y1s-y0s))-((y1-y0)*(x1s-x0s))))*(y1-y0); // neuen Vertex zur Vertexliste. (*vl)[idx]=vertex(x, y, 0, COORD); temp[temp.card()]=idx; // P2 nach temp übernehmen temp[temp.card()]=clip[(j+1)%clip.card()]; } // Wenn keiner drin ist // Nichts nach temp } // temp enthält jetzt die aktuellen Vertexindizies, // für den nächsten durchlauf muß clip // darauf gesetzt werden. clip=temp; } // Das geclippte Polygon zurückliefern. return polygon(clip, vl); } void polygon::project_2d(double lcx, double sw, double sh, double ph_ar, double sy, int p) { for(unsigned i=0; i