Compte tenu des points d'une ligne et d'une courbe de Bézier quadratique, comment calculez-vous leur point le plus proche? .... De même, étant donné les points de 2 courbes, comment obtenez-vous le point le plus proche?
Compte tenu des points d'une ligne et d'une courbe de Bézier quadratique, comment calculez-vous leur point le plus proche? .... De même, étant donné les points de 2 courbes, comment obtenez-vous le point le plus proche?
Réponses:
Voici mon essai. Les algorithmes suivants sont loin d'être parfaits , mais ils sont simples et je pense que vous devriez commencer par cela, vérifier s'ils fonctionnent dans votre situation et passer à quelque chose de plus rapide et / ou plus précis plus tard.
L'idée est la suivante:
La courbe de Bézier est paramétrée par une fonction F(t)
utilisant un ensemble de points de contrôle et un paramètre variable t
. Le nombre de points de génération est sans importance.
La ligne est paramétrée par deux points A
et B
.
Soit SAMPLES = 10
par exemple
Commencez par t0 = 0
ett1 = 1
Laisser dt = (t1 - t0) / SAMPLES
Si dt < 1e-10
(ou toute autre condition de précision que vous jugez appropriée), l' algorithme est terminé et la réponse estF(t0)
.
Calculez une liste de SAMPLES + 1
points sur la courbe de Bézier:
L[0] = F(t0)
L[1] = F(t0 + dt)
L[2] = F(t0 + 2 * dt)
L[SAMPLES] = F(t0 + SAMPLES * dt)
Trouvez le point L
d'index le i
plus proche de la ligne. Utilisez n'importe quelle méthode de distance point / ligne que vous connaissez, par exemple la distance carrée ||AB^L[i]A||² / ||AB||²
où ^
dénote le produit croisé et ||…||
est la distance.
Si i == 0
, réglez i = 1
; si i == SAMPLES
, réglezi = SAMPLES - 1
Soit t1 = t0 + (i + 1) * dt
ett0 = t0 + (i - 1) * dt
Revenez à l'étape 3.
Cette fois, nous avons deux courbes de Bézier, paramétrées par F(t)
et G(t)
.
Soit SAMPLES = 10
par exemple
Commencez avec t0 = 0
, t1 = 1
, s0 = 0
ets1 = 1
Laisser dt = (t1 - t0) / SAMPLES
Laisser ds = (s1 - s0) / SAMPLES
Si dt < 1e-10
(ou toute autre condition de précision que vous jugez appropriée), l' algorithme est terminé et la réponse estF(t0)
.
SI c'est la première exécution de la boucle:
6.1. Calculez une liste de SAMPLES + 1
points sur F
( voir ci-dessus ).
6.2. Calculez une liste de SAMPLES + 1
points sur G
.
6.3. Trouvez quelle paire de points est la plus proche l'une de l'autre.
6.4. Mise à jour t0
, t1
, s0
, s1
comme on le voit ci - dessus.
AUTRE : calculer alternativement une liste de points sur F
OU une liste de points sur G
, puis trouver quel point F
est le plus proche G(s0)
et mettre à jour t0
et t1
, OU quel point G
est le plus proche F(t0)
et mettre à jour s0
et s1
.
Revenez à l'étape 3.
De par leur conception, ces algorithmes convergeront toujours vers un minimum local. Cependant, rien ne garantit qu'ils convergeront vers la meilleure solution. En particulier, l'algorithme de courbe de Bézier n'est pas très bon du tout, et dans le cas où deux courbes sont proches l'une de l'autre à de nombreux endroits, vous risquez malheureusement de manquer la solution de loin.
Mais comme je l'ai dit, avant de commencer à penser à des solutions plus robustes, vous devez d'abord expérimenter ces solutions simples.
1) Traduisez tout en un axe, donc au lieu de devoir calculer la longueur d'un point, la «ligne», la «ligne» est, disons, l'axe Y.
Ensuite, euh, étant donné une courbe de Bézier, je dirais que cela dépend du nombre de points de contrôle.
S'il y en a trois, (début, «contrôle» et fin), je ferais une sorte de scan (disons chacun deux pour cent puis affine entre les plus proches (avec disons une approche «binaire»).
Plus de points, j'essaierais le couple le plus proche de (traduit de l'axe Y).
Je suis sûr qu'un math-guy peut vous donner la solution exacte (en mathématiques) mais si vous voulez trouver la solution / a dans un jeu vidéo, vous pourriez être mieux avec une solution légèrement correcte car la vraie solution peut contenir plusieurs réponses ( Je ne parle même pas de puissance de traitement).
Quelques réponses de la page du blog Algorithmist , qui trouve correctement le point le plus proche sur la courbe de Bézier quadratique donnée.
Démo .
Pour la courbe de Bézier - cas de ligne droite, la façon la plus précise de trouver la réponse est de procéder comme suit: