Bonjour,

Avec un peu de délai, me revoici avec la solution mise en oeuvre. Pour chaque point de ma forme initiale, j'appelle la méthode suivante avec "precedent" et "suivant' les points précédent et suivant le "point" que je veux projeter.
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
 
function TProfil.FormuleEpaisseurPeau(point, precedent, suivant : TPoint; epaisseur : double ; premier, signe : boolean) : TPointProfil;
var
  normePrecedent : double; // norme du vecteur precedent, point
  normeSuivant : double; // norme du vecteur point, suivant
  iSigne : integer;
  VecteurNormal, VecteurNormalTemp : TPoint;
  normeVecteurNormal : double;
  Precedent2, Point21, Point22, Suivant2 : TPoint;
begin
  if signe then iSigne := -1
  else iSigne := 1;
 
  normePrecedent := Sqrt(Power((point.X-precedent.X), 2) + Power((point.Y-precedent.Y), 2));
  normeSuivant := Sqrt(Power((suivant.X-point.X), 2) + Power((suivant.Y-point.Y), 2));
  // --- Segment précédent
  // Calculer les coordonnées du vecteur directeur normé de la normal
  VecteurNormalTemp.X := (Point.X - Precedent.X)/normePrecedent;
  VecteurNormalTemp.Y := (Point.Y - Precedent.Y)/normePrecedent;
  // Rotation de Pi/2 du vecteur
  VecteurNormal.X := -VecteurNormalTemp.Y;
  VecteurNormal.Y := VecteurNormalTemp.X;
  // Translation des points originaux
  Precedent2.X := Precedent.X + iSigne * epaisseur * VecteurNormal.X;
  Precedent2.Y := Precedent.Y + iSigne * epaisseur * VecteurNormal.Y;
  Point21.X := Point.X + iSigne * epaisseur * VecteurNormal.X;
  Point21.Y := Point.Y + iSigne * epaisseur * VecteurNormal.Y;
  // --- Segment 2
  // Calculer les coordonnées du vecteur directeur normé de la normal
  VecteurNormalTemp.X := (Suivant.X - Point.X)/normeSuivant;
  VecteurNormalTemp.Y := (Suivant.Y - Point.Y)/normeSuivant;
  // Rotation de Pi/2 du vecteur
  VecteurNormal.X := -VecteurNormalTemp.Y;
  VecteurNormal.Y := VecteurNormalTemp.X;
  // Translation des points originaux
  Suivant2.X := Suivant.X + iSigne * epaisseur * VecteurNormal.X;
  Suivant2.Y := Suivant.Y + iSigne * epaisseur * VecteurNormal.Y;
  Point22.X := Point.X + iSigne * epaisseur * VecteurNormal.X;
  Point22.Y := Point.Y + iSigne * epaisseur * VecteurNormal.Y;
 
  // Calculer l'intersection des 2 droites "images"
  if (((Precedent2.X=Point21.X)and(Point22.X=Suivant2.X))or
      ((Precedent2.Y=Point21.Y)and(Point22.Y=Suivant2.Y))) then
  begin
    Result := Point21;
  end else begin
    Result := IntersectionDroites(Precedent2, Point21, Point22, Suivant2);
  end;
La méthode InstersectionDroites calcule simplement l'intersection entre les 2 droites (Precedent2, Point21) et (Point22, Suivant2).

En espérant que ça puisse servir.