eclipz Posté(e) le 18 février 2005 Partager Posté(e) le 18 février 2005 Bonjour à tous voila, je suis sur un projet de lecteur de fichier DXF 2D et plutôt simple... tout se passe bien sauf quand je dois afficher une polyligne avec un bulge... mon appli affiche plein d'arcs n'importe comment et ça commence à serieusement me gonfler... voila mon petit code en c# : double temp, rayon, angle, angle_depart, angle_arrivee, D, vx, vy, xh, yh, xc, yc, H, bul; bul=((Vertex)lst_vertex[i]).getBulge(); Point p1=new Point(); Point p2=new Point(); p1.setX(((Vertex)lst_vertex[i]).getX()); p1.setY(((Vertex)lst_vertex[i]).getY()); p2.setX(((Vertex)lst_vertex[i+1]).getX()); p2.setY(((Vertex)lst_vertex[i+1]).getY()); D=p1.distance(p2); vx=(p2.getY()-p1.getY())/D; vy=(p1.getX()-p2.getX())/D; rayon=D*(1+System.Math.Pow(bul,2))/(4*bul); H=D*(1-System.Math.Pow(bul,2))/(4*bul); xh=(p1.getX()+p2.getX())/2; yh=(p1.getY()+p2.getY())/2; xc=xh-H*vx; yc=yh-H*vy; Point centre_temp=new Point(); centre_temp.setX(xc); centre_temp.setY(yc); //angle depart D=centre_temp.distance(p1); angle_depart=System.Math.Acos((p1.getX()-centre_temp.getX())/D); if(p1.getX()<centre_temp.getX()) { angle_depart=2*System.Math.PI-angle_depart; } angle_depart*=(180.0*System.Math.PI); while(angle_depart>360) { angle_depart-=360; } //angle arrivee D=centre_temp.distance(p2); angle_arrivee=System.Math.Acos((p2.getX()-centre_temp.getX())/D); if(p2.getX()<centre_temp.getX()) { angle_arrivee=2*System.Math.PI-angle_arrivee; } angle_arrivee*=(180.0*System.Math.PI); while(angle_arrivee>360) { angle_arrivee-=360; } Arc ang_temp=new Arc(); ang_temp.setXC(centre_temp.getX()); ang_temp.setYC(centre_temp.getY()); ang_temp.setRayon(rayon); if(bul > 0) { ang_temp.setAngle_arrivee(angle_arrivee); ang_temp.setAngle_depart(angle_depart); } else { ang_temp.setAngle_arrivee(angle_depart); ang_temp.setAngle_depart(angle_arrivee); } ang_temp.setCouleur(this.couleur); ang_temp.setPlan(this.plan_entite); ang_temp.afficher(); vous l'aurez compris, le but est que, lorsque le bulge n'est pas nul, je cherche à calculer les données de l'arc qui devra être tracé (sachant qu'un arc pour moi c'est un centre, un angle de départ et un angle d'arrivée... bref, comme un arc selon le format dxf) j'ai cherché sur le net, je trouve peu de choses et toujours en LISP (truc assez hermétique pour moi) si quelqu'un pouvait me dire ce qui cloche, ça m'aiderait beaucoup... sachant qu'à priori ma methode d'affichage des arcs est bonne je pense... (elle fonctionne parfaitement pour les éléments définis comme arcs au format dxf)... la méthode calculant la distance entre 2 pts est également bonne je crois... les résultats semblent bons et puis c'est pas une méthode très compliquée par avance merci pour l'aide vince EDIT : à tout hasard, voila la méthode afficher() pour les arcs : public void afficher() { if(this.couleur==-1) { this.setCouleurGLPlan(); } else { this.setCouleurGLCouleur(); } GL.glBegin(GL.GL_POINTS); if(angle_depart<angle_arrivee) { for (double i=angle_depart; i<angle_arrivee; i=i+0.1) { double angle=i*System.Math.PI/180; double x=(centre.getX()+ rayon*System.Math.Cos(angle)); double y=(centre.getY()+ rayon*System.Math.Sin(angle)); GL.glVertex2d(x,y); } } else { for (double i=angle_depart; i<angle_arrivee+360;i=i+0.1) { double angle=i*System.Math.PI/180; double x=(centre.getX()+ rayon*System.Math.Cos(angle)); double y=(centre.getY()+ rayon*System.Math.Sin(angle)); GL.glVertex2d(x,y); } } GL.glEnd(); } et la methode de calcul pour la distance entre 2 pts : public double distance(Point p) { double dist; dist=System.Math.Pow(this.getX()-p.getX(),2); dist+=System.Math.Pow(this.getY()-p.getY(),2); dist=System.Math.Sqrt(dist); return dist; } EDIT 2 : petite def du bulge : The bulge is the tangent of 1/4 the included angle for an arc segment, made negative if the arc goes clockwise from the start point to the endpoint; a bulge of 0 indicates a straight segment, and a bulge of 1 is a semicircle Lien vers le commentaire Partager sur d’autres sites More sharing options...
papaye Posté(e) le 2 mars 2005 Partager Posté(e) le 2 mars 2005 Trés intéressant ton code, je l'ai pompé intégralement et j'ai eu le même problème que toi avec "certains" DXF seulement. Le problème vient du calcul des angles de départ et d'arrivée.. J'ai résolu "bêtement" le problème en travaillant avec des valeurs absolues (pour le calcul du rayon et du rapport cote adjacent/hypothénuse) et en faisant un test sur les valeurs des coordonées des points 1 et 2 par rapport au centre, pour chaque quart de plan: AngleDepart = Acos(Abs(X1 - Xcentre) / Rayon) If (X1 <= Xcentre) And (Y1 > Ycentre) Then AngleDepart = PI - AngleDepart If (X1 < Xcentre) And (Y1 <= Ycentre) Then AngleDepart = PI + AngleDepart If (X1 >= Xcentre) And (Y1 < Ycentre) Then AngleDepart = 2 * PI - AngleDepart il y a sûrement des méthodes plus élégantes mais ça marche... Bonne continuation ! PS: j'ai oublié de te remercier pour la méthode, tu l'as trouvé sur le net ou tu l'as mise au point tout seul ??? Lien vers le commentaire Partager sur d’autres sites More sharing options...
Messages recommandés
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.