C'est quoi la courbure sur un sommet de polyligne ?

Dernière mise à jour : lundi 1 janvier 0001

Une polyligne, c'est une série de sommets (vertex), donc des points et sur chaque point, on a un réel qu'on appelle la courbure (bulge en anglais ; code 42 dans les DXF).

La courbure est égale à la tangente de 1/4 de l'angle parcouru par l'arc.

Si un sommet a une courbure de zéro, le segment qui suit est une ligne droite. Si la courbure est différente de zéro, c'est un arc.

Une valeur de 1 correspond à un demi-tour ou 180°. En effet, 180° / 4 = 45° et la tangente de 45° est 1.

Courbure sur un sommet de polyligne

Si la courbure est positive, on tourne dans le sens trigonométrique. Si elle est négative, on tourne dans le sens horaire.

On ne peut pas décrire un arc de 360° car tan(360°/4) = infini

Le dernier sommet de la polyligne a une courbure, mais elle n'est pas prise en compte si la polyligne est ouverte. Si par contre la polyligne est fermée, alors le dernier segment est un arc.

On peut noter également que dans une polyligne, tous les arcs sont tangents au segment précédent.

Déterminer la position du centre et le rayon de l'arc

Avec l'API .NET d'AutoCAD

Si vous êtes dans AutoCAD, c'est très simple, il y a une méthode GetArcSegment2dAt() dans la classe Polyline qui permet de récupérer l'arc correspondant à un sommet donné.

Mais bon, si vous n'avez pas accès à l'API .NET d'AutoCAD, vous pouvez toujours calculer ça vous-même.

Calcul de la longueur de corde

On peut commencer par calculer la longueur de corde. C'est la distance qui sépare les deux sommets adjacents sur la polyligne. C'est une simple distance euclidienne entre deux points.

Longueur de corde

double cordLength = Math.Sqrt(Math.Pow(point2.X - point1.X, 2) + Math.Pow(point2.Y - point1.Y, 2));

Calcul du rayon de l'arc

Ensuite pour calculer le rayon, on observe que p1, p2 et le centre de l'arc C forment un triangle isocèle.

Les côtés p1 → C et p2 → C sont égaux et correspondent au rayon R de l'arc.

Si on coupe ce triangle en deux, on obtient deux triangles rectangles avec un angle droit au milieu de la corde (point M). Sur ce triangle, R est l'hypoténuse. On connait la longueur M → p2 c'est la moitié de la longueur de la corde L.

Les deux triangles rectangles

Donc sin(alpha/2) = côté opposé / hypoténuse = (L/2) / R.

On multiplie par R des deux côtés : R * sin(alpha/2) = L/2.

Et pour finir, on divise par sin(alpha/2) des deux côtés : R = L / (2 * sin(alpha/2)).

double angle = Math.Atan(bulge);
double radius = cordLength / (2 * Math.Sin(angle / 2));

Calcul du centre de l'arc

Là ça se complique un peu. On doit utiliser des vecteurs.

Il nous faut une structure comme celle-ci pour représenter un vecteur dans le plan :

public readonly struct Vector2d
{
    public double X { get; }
    
    public double Y { get; }
    
    public Vector2d(double x, double y)
    {
        X = x;
        Y = y;
    }
}

Pour commencer, il faut calculer le vecteur entre les deux sommets p1 et p2 :

Vector2d vector = new Vector2d(point2.X - point1.X, point2.Y - point1.Y);

On divise ce vecteur par sa longueur pour obtenir un vecteur unitaire :

Vector2d unitVector = vector / Math.Sqrt(vector.X * vector.X + vector.Y * vector.Y);

On détermine la position du milieu de la corde (point M) :

Vector2d midPoint = new Vector2d((point1.X + point2.X) / 2, (point1.Y + point2.Y) / 2);

Si la courbure est égale à un, alors l'arc est un demi-tour et le centre est situé sur la corde donc on a notre centre.

La distance CM, avec un peu de trigonométrie :

double distanceCM = radius * Math.Cos(angle / 2);

Ensuite, on peut calculer le centre de l'arc en ajoutant le vecteur perpendiculaire à la moitié de la corde :

Vector2d perpendicularVector = new Vector2d(-unitVector.Y, unitVector.X);
Vector2d center = new Vector2d(midPoint.X + perpendicularVector.X * distanceCM, midPoint.Y + perpendicularVector.Y * distanceCM);

Pour avoir un vecteur perpendiculaire au vecteur (x, y), on peut prendre (-y, x).

On n'a pas fini parce que si la courbure est égale à un,

{{bloc:AutoCAD}}