J’ai aussi constaté des rebonds quand la source de localisation ou la précision de la source change.
Par le passé, je faisais ma localisation avec Tasker et un appel d’url sur Jeedom, c’est comme ça que j’ai vu ce comportement.
Mon « workaround » était de calculer le recoupement entre la dernière position connue et sa précision :
→ Localisation X est toujours associée avec Précision X
→ Position X est obtenue en prenant le milieu de l’intersection des précisions X et X-1, sur le segment Loc X et Pos X-1 (cf Pos 3)
→ Si aucune intersection, on reste dans la précision X (cf Pos 4)
Je n’ai pas réussi à retrouver le code, mais j’avais TRES CLAIREMENT négligé le fait que tous ces calcul sont à effectuer à la surface d’une sphère, la résolution n’est pas trop compliquée dans le plan :
Pour trouver PosX, il faut chercher A et B (fonction de PosX-1, Loc X et X-1 et Précison X et X-1 :
A (resp. B) est le point où la droite passant par PosX-1 et LocX coupe Précision X (resp. X-1)
L’équation de la droite PosX-1 et LocX (qu’on va renommer P-L
sinon…) est :
y = (x - Px) * (Ly - Py) / (Lx - Px) + Py
L’équation d’un cercle C de centre Cx,Cy
et de rayon r
est :
r = (x - Cx)² + (y - Cy)²
Résoudre x permet de trouver les 2 points d’intersection G et G’ de la droite P-L
avec C :
r = (x - Cx)² + ((x - Px) * (Ly - Py) / (Lx - Px) + Py - Cy)²
→ ax² + bx + c = 0
, avec :
a = 1 + (Px * (Ly - Py) / (Lx - Py))²
b = -2 * Px + 2 * Px * (Ly - Py) * (Py - Cy) / (Lx - Py)
c = Px² + (Py - Cy)² - r
→ Discriminant D = b² - 4 * a * c
D < 0 → Pas de solution (normalement impossible par construction)
D = 0 → 1 seule solution (normalement impossible par construction)
D > 0 → Nos 2 solutions x1 et x2 avec :
x1 = (-b - sqrt(D)) / (2 * a)
et x1 = (-b + sqrt(D)) / (2 * a)
On retrouve y1 et y2 en réinjectant x1 et x2 dans l’équiation de la droite
Pour trouver A, on utilise le cercle C de centre LocX et rayon PrécisionX dans la fonction précédente, en gardant de G ou G’, le point le plus proche de PosX-1.
Pour trouver B, on utilise le cercle C de centre PosX-1 et rayon PrécisionX-1 dans la fonction précédente en gardant de G ou G’, le point le plus proche de LocX.
CQFD : PosX = ((Ax + Bx)/2, (Ay + By)/2)
(Oui, j’avais envie de me faire chier là )
Bad