Comment déterminer la longueur d'un chemin?

11

J'ai un jeu qui oblige chaque joueur à se déplacer le long d'un chemin spécifié. Je dessine le chemin en utilisant les courbes de Bézier. Comment puis-je déterminer la longueur totale réelle (non linéaire) du chemin et la distance que chaque joueur avait parcourue? (La distance entre le point de départ et un point spécifié sur le chemin d'accès.)

MISE À JOUR:

Le chemin est représenté dans un plan cartésien (2D).

Valentin Radu
la source
Votre question est répondue vers le bas de cette réponse
BlueRaja - Danny Pflughoeft

Réponses:

7

Comme l'ont dit les réponses précédentes, calculer la longueur d'une courbe de Bézier est difficile ( impossible ?). Je dirais que 100% des jeux utilisent une approximation de la longueur, ce qui est à peu près toujours assez précis.

Il y a quelques mois, je l'ai implémenté en utilisant l'approche proposée consistant à diviser la courbe en "petits" segments et à ajouter leur longueur. Il y a un exemple d'implémentation C ++ ici .

Dan
la source
11

Mesurer la longueur d'une courbe de Bézier est difficile. Si cela ne vous dérange pas une légère imprécision, une solution simple serait d'approximer les courbes de Bézier avec des lignes droites et de calculer la somme des longueurs de ligne. Plus vous créez de segments, meilleure est l'approximation.

bummzack
la source
Je pourrais considérer cela, mais comment puis-je déterminer combien de segments dois-je avoir et comment puis-je mapper les segments pour avoir leur point de départ et leur point de fin sur mon chemin? Cette technique a-t-elle un nom? (donc je le recherche sur Google)
Valentin Radu
Une approche simple serait d'utiliser simplement une distribution linéaire de points de B (0) à B (1) ... un peu comme quelque chose que vous utiliseriez pour tracer réellement la courbe. Regardez le code source dans la réponse de Dan.
bummzack
J'apprécierais une explication du vote
négatif
7

Le paramétrage de longueur de spline d'ordre supérieur (c'est-à-dire supérieur au 1er ordre) doit être approximé; il ne peut pas être représenté directement, d'où le fait qu'il n'est pas facile de trouver des solutions directes à cela.

Quelques implémentations existantes (code copier-coller):

Selon les approximations de Chebyshev , selon les auteurs, la précision augmente à mesure que la taille de la courbe augmente. Regardez le pseudocode pp. 7-8, le reste est une description d'autres algorithmes sur lesquels ils ont basé leur approche que vous pouvez ignorer. Un certain nombre de références en ligne qualifient cette méthode de bonne.

Voir également ces approches concises.

Ingénieur
la source
5

Cela a commencé comme un commentaire sur le commentaire de la réponse de @ bummzack, mais s'est allongé trop longtemps.

comment puis-je déterminer combien de segments dois-je avoir

Il existe deux approches. Le premier n'est que l'algorithme standard pour le rendu d'une courbe de Bézier: les points de contrôle forment un cadre de délimitation de la courbe, donc si tous les points de contrôle se trouvent à moins d'un epsilon du segment de ligne du point de départ au point final, vous vous rapprochez comme une ligne; sinon vous subdivisez en utilisant l'algorithme de Casteljau. Epsilon est choisi en fonction de l'erreur que vous souhaitez dans le résultat final. (Pour le rendu, c'est généralement 0,5 pixel).

L'autre approche est un raffinement de celle utilisant l'arithmétique d'intervalle. Prenez la longueur de la ligne du début à la fin comme limite inférieure et la somme des longueurs des lignes passant par les points de contrôle comme limite supérieure. Encore une fois, subdivisez comme requis par vos exigences d'erreur finale.

On subdivise normalement à t = 0,5, mais l'algorithme de de Casteljau permet le fractionnement en tout point, donc si vous avez un Bézier cubique avec les points de contrôle C_0 à C_3 et C_2 est beaucoup plus proche du segment de ligne entre les extrémités que C_1, vous pourriez trouver que le fractionnement à l'un des 1/3 ou 2/3 donne des limites plus strictes. Je n'ai pas travaillé sur l'algèbre pour justifier ce qui serait mieux, mais vous pouvez expérimenter et faire rapport si vous le souhaitez. Si rien d'autre, je voulais souligner que l'option est là.

Peter Taylor
la source
3

Le calcul de la longueur d'une courbe paramétrée peut être fait en prenant l'intégrale de sqrt ((dx / dt) ² + (dy / dt) ²), où dx / dt est la dérivée de la composante x de la courbe, et dy / dt est la dérivée de la composante y de la courbe. Dans le cas d'une spline de Bézier, ces deux sont les mêmes, car l'équation peut être étendue à n'importe quelle dimension.

La formule pour une spline cubique de Bézier est la suivante: B (t) = (1 - t³) * P0 + 3 (1 - t) ²t * P1 + 3 (1 - t) t² * P2 + t³ P3 où P0 à P3 sont les points de contrôle.

Selon Wolfram | Alpha, la dérivée de cette formule est: d (B (t)) / dt = 3 (t (t (P3 - P0) + P2 (2 - 3t) + P1 (3t² - 4t + 1))

Vous pouvez maintenant remettre cela dans l'équation de la longueur d'une courbe et calculer l'intégrale de t = 0 à t = 1. Malheureusement, Wolfram | Alpha expire lorsque j'essaie de le faire. Vous pouvez cependant faire une intégration numérique.

Ruud
la source