Aller au contenu

CAO, polyligne et bulge


eclipz

Messages recommandés

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 :transpi:

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

  • 2 semaines après...

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

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...