En quoi le cas avec la courbe de Bézier est-il différent du cas avec les lignes droites? Avez-vous une courbe qui pourrait entourer complètement l'autre ligne (de sorte que chaque direction pointe vers "vers")?
bummzack
1
Vous devez probablement clarifier vos termes. En géométrie, une "ligne" s'étend à l'infini dans les deux sens, par opposition à une demi-ligne ou un segment, donc 2 lignes se croisent toujours à moins qu'elles ne soient parallèles. Laquelle demandez-vous? Vous avez tracé une flèche, ce qui implique une direction, ce qui pour moi implique un segment ou tout au plus une demi-ligne. Et quelle est votre définition de "vers" et "loin"?
Hackworth
La courbe de Bézier peut être plus difficile à représenter dans l'égalité requise pour résoudre un test d'intersection de rayons. Soit dit en passant, je changerais le mot qui représente votre flèche en "rayon". Vous pourriez obtenir une réponse plus rapide. Je répondrai à cela si j'ai le temps pendant le déjeuner si personne d'autre ne le fait. Sinon, c'est une tâche extrêmement courante dans les jeux. Google "Test d'intersection de segments de ligne Ray". Je soupçonne que le test de la courbe de Bézier est similaire, mais je ne l'ai jamais essayé.
brandon
3
Vous devriez diviser votre question en deux. La partie avec des segments de ligne est très facile. La pièce aux courbes de Bézier est extrêmement complexe et n'a qu'une solution numérique approximative.
Soit Aet Bsoit deux points sur la ligne noire. Laissez Cet Dsoyez votre segment bleu. Le signe de la zcoordonnée du produit croisé AB^ACvous indique si Cest "gauche" ou "droite" de la ligne noire. De même, le produit croisé AB^CDvous indique si vous CDorientez "à gauche" ou "à droite" de la ligne noire.
Nous ne voulons pas vraiment savoir si c'est à gauche ou à droite; tout ce que nous voulons, c'est nous assurer qu'ils sont dans la même direction ou dans la direction opposée, c'est pourquoi nous multiplions les deux valeurs.
Pour la courbe, je pense que vous pourriez trouver la tangente de la courbe au point le plus proche de votre segment de ligne et l'utiliser de la même manière que vous testez vos autres segments de ligne. Probablement un peu plus difficile qu'il n'y paraît :)
Notlesh
@stephelton: Regardez à nouveau la deuxième image pour les courbes de Bézier, pointant vers une courbe qui s'éloigne. Ou considérez une courbe avec une tangente parallèle au segment qui peut se croiser, mais qui se courbe vers le segment et se croise.
Cascabel
+1 pour le trollface, et bon calcul :). Cependant, votre diagramme «vers» a toujours un «loin» - déplacez simplement le point de départ au-dessus de la ligne.
Jonathan Dickinson
@JonathanDickinson merci, j'ai mis à jour l'image pour que ce soit un peu plus clair mon interrogation!
sam hocevar
2
En supposant que le point de départ est le cercle vert et le point final est la flèche rouge
Calculez la distance entre le point de départ comme DS et le segment noir, et faites de même pour le point d'arrivée (flèche rouge) comme DE. Si DS> DE, alors le segment pointe vers. si DE> DS, il pointe loin. Si les deux sont égaux, les deux sont parallèles.
Vous pouvez trouver comment calculer la distance d'un point à un segment ici , et à une courbe de Bézier ici . Cependant, selon la forme de la courbe de Bézier, cela pourrait retourner des résultats étranges (la courbe peut se croiser)
DS> DE ne fonctionne que pour les lignes droites. Cela peut échouer pour Béziers. De plus, vous ne connaissez pas sa définition de "vers". Si l'extension de la flèche traverserait une ligne définie par 2 points, mais pas le segment défini par les mêmes points, est-ce toujours "vers"?
Hackworth
Je parle de deux segments, pas de lignes, donc il n'y a pas "d'extension de la flèche". En outre, peu importe où pointe la flèche, car nous parlons ici des distances. Le point le plus proche sur la ligne noire pourrait être un point de début / fin de la ligne noire, cela n'a pas d'importance. Les deux segments pourraient être colinéaires, cette méthode fonctionnerait toujours comme prévu. Pour les courbes plus douces, j'ai mentionné que cela donnerait des résultats étranges selon la forme de la courbe.
Réponses:
Soit
A
etB
soit deux points sur la ligne noire. LaissezC
etD
soyez votre segment bleu. Le signe de laz
coordonnée du produit croiséAB^AC
vous indique siC
est "gauche" ou "droite" de la ligne noire. De même, le produit croiséAB^CD
vous indique si vousCD
orientez "à gauche" ou "à droite" de la ligne noire.Nous ne voulons pas vraiment savoir si c'est à gauche ou à droite; tout ce que nous voulons, c'est nous assurer qu'ils sont dans la même direction ou dans la direction opposée, c'est pourquoi nous multiplions les deux valeurs.
Le pseudocode suivant devrait donc fonctionner:
J'ai peur d'avoir besoin de temps pour écrire une solution appropriée pour la courbe de Bézier. La situation suivante est-elle proche ou éloignée?
la source
En supposant que le point de départ est le cercle vert et le point final est la flèche rouge
Calculez la distance entre le point de départ comme DS et le segment noir, et faites de même pour le point d'arrivée (flèche rouge) comme DE. Si DS> DE, alors le segment pointe vers. si DE> DS, il pointe loin. Si les deux sont égaux, les deux sont parallèles.
Vous pouvez trouver comment calculer la distance d'un point à un segment ici , et à une courbe de Bézier ici . Cependant, selon la forme de la courbe de Bézier, cela pourrait retourner des résultats étranges (la courbe peut se croiser)
la source