Équation d'un plan défini par N points
Bonjour,
Je cherche l'équation d'un plan moyen défini par N points.
Pour ce faire, la méthode la plus appropriée semble être la minimisation de la somme des carrés des distances des points à ce plan.
Ce lien propose la solution suivante :
Soit z=a.x+b.y+c l'équation du plan .
la solution est donné par la résolution du système :
(Sxx).a+(Sxy).b+(Sx).c = (Sxz)
(Sxy).a+(Syy).b+(Sy).c = (Syz)
(Sx).a+(Sy).b+n.c = (Sz)
Les coefficients étant calculés préalablement par :
Sxx = Somme des (xk)² pour k=1 à k=n
Sxy = Somme des (xk)(yk)
Sx = Somme des (xk)
Sxz = Somme de (xk)(zk)
Syy = Somme de (yk)²
Syz = Somme de (yk)(zk)
Szz = Somme de (zk)²
Sz = Somme de (zk)
Malheureusement, cet algorithme ne semble pas donner des résultats justes (j'ai testé en le codant en java). Est-ce quelqu’un pourrait certifier qu'il est correct, y apporter des modifications ou me proposer une méthode différente.
Merci.
Solution Python simple à l'aide de la bibliothèque Numpy
Comme évoqué plus la haut le calcul de la matrice de covariance permet de quantifier les écarts des points au plan. lire cet article https://fr.wikipedia.org/wiki/Covariance
La VSD permet d'obtenir la direction du vecteur qui possède la distance au plan la plus faible, le vecteur normal. Lire cet article https://fr.wikipedia.org/wiki/D%C3%A...on_statistique
En code python ça peut donner ça:
Code:
1 2 3 4 5 6 7 8 9 10 11
| import numpy as np
def calculNormal(vectorList):
""" Calcul le plan moyen passant par un nuage de point"""
vectorList = np.array(vectorList)
covariance = np.cov(vectorList.transpose()) # calcul de la matrice de covariance
u = np.linalg.svd(covariance)[0] # calcul des vecteurs propres ordonnées par valeur propre décroissante
vecNormal = u[:,-1] # vecteur propre associé à la valeur propre représentant la distance des points au plan la plus faible
vecNormalNorme = vecNormal / np.linalg.norm(vecNormal) # calcul du vecteur normal normée
barycentre = np.average(vectorList, axis=0) # calcul du barycentre dans le repère orthogonal d'origine
d = - np.vdot(vecNormalNorme, barycentre) # calcul de la distance du barycentre au plan
a, b, c = vecNormalNorme # extraction des coordonnées du vecteur directeur |
Code à tester.