Astuces de recherche...
Home
- Accueil & nouveautés
- Les newsgroups VB
- Téléchargements
- L'équipe
- Nous contacter
- Liens
Rubriques
- Toutes les questions
- Affichage & graphismes
- Algorithmique
- API
- Base de registre
- Bases de données
- Contrôles
- Date & heure
- Déploiement
- Divers
- Erreurs & problèmes
- Fichiers & dossiers
- Généralités
- Impression
- Internet & mails
- Math
- Multimédia
- Réseaux
- Structures de données
- Texte & strings
- VB .Net
- VB Script
- VBA
- Windows

Question 194

Comment calculer le périmètre d'une ellipse?

Introduction

Il n'existe pas de formule simple permettant de calculer le périmètre d'une ellipse. Pour des cas particuliers et quand on n'a pas besoin de précision, on peut parfois se contenter de l'approximation :

Périmètre ≈   PI * (Ra+Rb), où Ra et Rb sont les 2 rayons de l'ellipse.

Cette approximation est suffisante pour obtenir un ordre de grandeur de la valeur réelle, mais elle peut s'avérer très mauvaise (plus de 20% d'écart avec la valeur réelle), voir complètement fausse pour certaines valeurs de Ra et Rb. Il existe de meilleures approximations, mais ce ne sont dans tous les cas que des valeurs approchées.

Valeurs exactes

Il existe cependant des méthodes permettant de connaître la valeur exacte du périmètre d'une ellipse quelconque. Ces méthodes sont basées sur les développements en série. On trouvera dans la section "Aller plus loin" Une bonne présentation de ces méthodes avec leur justification.

La fonction présentée ici permet de calculer avec une très grande précision le périmètre d'une ellipse quelconque. Elle implémente 2 développements en série, Cayley et Gauss-Kummer. En fonction des valeurs particulières de Ra et Rb, la fonction utilise la série pour laquelle la convergence et la précision est la meilleure.

Option Explicit
'
' Retourne la valeur du périmètre d'une ellipse de rayons a et b
' Cette fonction appelle les 2 fonctions gk() et Cayley(), en fonction
' de l'excentricité de l'ellipse.
'
Public Function EllipsePerimeter(ByVal a As Double, ByVal b As Double) As Double
    Const PI As Double = 3.14159265358979
    Dim h As Double

    If (a = 0) Or (b = 0) Then
        EllipsePerimeter = 0#
        Exit Function
    End If
    
    a = Abs(a): b = Abs(b)
    If a < b Then
        swap a, b
    End If

    If b < (0.28 * a) Then
        EllipsePerimeter = 4 * a * cayley((b / a) ^ 2)
    Else
        h = ((a - b) / (a + b)) ^ 2
        EllipsePerimeter = PI * (a + b) * gk(h)
    End If

End Function

' Développement de la série de Gauss-Kummer
Private Function gk(ByVal h As Double) As Double
    Dim x As Double, z As Double
    Dim n As Long

    z = 0: x = 1: n = 0
    
    While (z + x) <> z
        n = n + 1
        x = h * x * ((n - 1.5) / n) ^ 2
        z = z + x
    Wend
    gk = 1 + z
End Function

' Développement de la série de cayley
Private Function cayley(ByVal x As Double) As Double
    Dim y As Double
    Dim t As Double
    Dim z As Double
    Dim n As Long
    Dim u As Double, v As Double, w As Double

    y = Log(16 / x) - 1
    t = x / 4
    n = 1
    z = 0
    u = t * y
    
    v = n - 0.5 / n
    w = 0.5 / ((n - 0.5) * n)
    While z <> (z + u)
        z = z + u
        n = n + 1
        t = x * t * v
        v = (n - 0.5) / n
        t = t * v
        y = y - w
        w = 0.5 / ((n - 0.5) * n)
        y = y - w
        u = t * y
    Wend
    cayley = 1 + z

End Function

' Permutation de 2 variables
Private Sub swap(ByRef a As Double, ByRef b As Double)
    Dim tmp As Double

    tmp = a
    a = b
    b = tmp
End Sub

Exemple d'utilisation


    Dim r1 As Double, r2 As Double, p As Double

    r1 = 50
    r2 = 100
    p = EllipsePerimeter(r1, r2)
    Debug.Print p

Pour aller plus loin

Date de publication : 11 septembre 2008
Dernière modification : 11 septembre 2008
Rubriques : Algorithmique, Math
Mots-clés : ellipse, elipse, éllipse, périmètre, perimetre, longueur, circonférence, Cayley, Gauss, Kummer, séries, série, développement, approximation, géométrie, convergence