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).
Réponses:
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 .
la source
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.
la source
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.
la source
Cela a commencé comme un commentaire sur le commentaire de la réponse de @ bummzack, mais s'est allongé trop longtemps.
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à.
la source
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.
la source