Bonjour,
je dois programmer une fonction qui, en partant d'une courbe de point, va en tracant une 2° en décalé (le meilleur exemple: une route et la barrière le long de celle-ci)
Le principe est de partir de 3 points (2 segments, donc). Je prends les coordonnées d'un point d'origine et je calcule celle d'un point a une distance D du point perpendiculairement au segment. Meme chose pour les 2 autres points, avec pour celui du milieu 2 projetés (1 pour chaque segment) puis je calcule le point d intersection des 2 droites formées par les 2 premiers et les 2 derniers points.
Le soucis est que parfois, le point ne doit pas etre affiché. Si par exemple la rote fait un virage tres tres sérrée et que la distance D est tres importante.
j'ai fait actuellement quelque chose qui marche pour les écart "faible",mais dès que ceux-ci sont importants, le résultat final donne n'importe quoi.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
 
 while(vertex3){  //tant que nous avons un 3° point
    pt3     = vertex3->GetPt10();//recup' des coordonnées du 3° point
    ang2    = GeAngle(&pt2,&pt3);//calcul de l angle entre 2, 3 et horizon
    polAng2 = GetOffsetAng(offSet,ang2);
    GePolar(&ptc,&pt2,polAng2,offset);//calcul des coord des projetés
    GePolar(&ptd,&pt3,polAng2,offset);
	angle1= atan2(pt2.y - pt1.y , pt2.x - pt1.x);
	angle2= atan2(pt3.y - pt2.y , pt3.x - pt2.x);
 
	if (angle1>=Ge2Pi) angle1 -=Ge2Pi;
	if (angle2>=Ge2Pi) angle2 -=Ge2Pi;
	if (angle1<=(-Ge2Pi)) angle1 +=Ge2Pi;
	if (angle2<=(-Ge2Pi)) angle2+=Ge2Pi;
    if(!GeLineInter(&ptres,&pta,&ptb,&ptc,&ptd))return 0;
 
	if ((((angle2-angle1)>0) && (offSet<0)) || (((angle2-angle1)<0) && (offSet>0)) || ((angle1>((Ge2Pi)/4)) && (angle2<((Ge2Pi)/4)) && (offSet<0)) || ((angle1<((Ge2Pi)/4)) && (angle2>((Ge2Pi)/4)) && (offSet>0))) // si la barriere est du cote oppose au virage
	{
		ptList.AddPoint(ptres);
	}else{
		m = (ptd.y - pta.y) / (ptd.x - pta.x);
		b = ptd.y - m*ptd.x;
		if (((ptres.y - (( m*ptres.x)+b))/(pt2.y - (( m*pt2.x)+b)))>0) // cas ou les Res et pt2 sont du meme cote de la droite ad
		{// si le pt resultant et le 2° point sont du meme cote de la droite ad: trace de res
			ptList.AddPoint(ptres);
		}
	}
    pt2 = pt3;
    pta = ptc;
    ptb = ptd;
    vertex2 = vertex3;
    vertex3 = cEnt->GetDifferentSubEnt(vertex2);
  }
Avez vous des idées? Je me doute que je suis pas tres clair dans mes explication et mes commentaires de code, alors si vous avez des questions hésitez pas...