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; |
Partager