-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathcercle.py
55 lines (48 loc) · 1.39 KB
/
cercle.py
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
49
50
51
52
53
54
55
"""
Régression circulaire avec la méthode des moindres carrés totaux
voir : https://fr.wikipedia.org/wiki/R%C3%A9gression_circulaire
"""
import numpy as np
import scipy.optimize as optimize
def residus(c, x, y):
"""
Calcule les résidus
Entrées :
- c : centre du cercle (2 dimensions)
- x, y : numpy.array cordonnées des points
Sortie : résidus
"""
r = radius(c, x, y)
N = len(x)
diff = np.zeros((2, N))
diff[0, :] = x - c[0]
diff[1, :] = y - c[1]
norm_diff = np.linalg.norm(diff, axis=0)
return np.square(norm_diff - r)
def radius(c, x, y):
"""
Calcule les résidus
Entrées :
- c : centre du cercle (2 dimensions)
- x, y : numpy.array cordonnées des points
Sortie : rayon du cercle
"""
N = len(x)
diff = np.zeros((2, N))
diff[0, :] = x - c[0]
diff[1, :] = y - c[1]
r = np.sum(np.linalg.norm(diff, axis=0)) / N
return r
def regression_circulaire(c0, x, y):
"""
Fait la régression avec la méthode des moindres carrés
Entrées :
- c0 : centre initial du cercle (2 dimensions)
- x, y : numpy.array cordonnées des points
Sortie :
- res : résultat de la régression (position du centre du cercle)
- r : rayon du cercle
"""
res = optimize.least_squares(residus, c0, args=(x, y))
r = radius(res.x, x, y)
return res, r