7
votes

Calculer le point d'intersection de la courbe quadratique bézier

Ceci appuie définitivement les limites de ma connaissance de la trigité.

existe une formule pour calculer un point d'intersection entre une courbe quadratique bézier et une ligne?

Exemple:

Dans l'image ci-dessous, j'ai P1, P2, C (qui est le point de contrôle) et X1, X2 (qui pour mon calcul particulier n'est qu'une ligne droite sur l'axe X.)

Ce que j'aimerais pouvoir savoir est la position X, Y de T ainsi que l'angle de la tangente à T. Au point d'intersection entre la courbe rouge et la ligne noire.

> </ P> <p> Après avoir fait un peu de recherche et de trouver <un href = Cette question, je sais que je peux utiliser: xxx < / Pré>

Pour calculer ma position X, Y à tout moment donné le long de la courbe. Ainsi, en utilisant cela, je pouvais simplement boucler à travers un tas de points le long de la courbe, vérifiant pour voir si tout est sur mon axe X intersectant. Et de là, essayez de calculer mon angle de tangent. Mais cela ne semble vraiment pas comme la meilleure façon de le faire. Toute gourou mathématique est-elle là, sachez quelle est la meilleure façon?

Je pense que c'est peut-être un peu plus compliqué que je le souhaite.


2 commentaires

Peut-être POMAX peut vous offrir une aide.


Je suis à peu près sûr que je l'ai couvert dans l'amorce, dans la section sur Intersection de courbe . Faites simplement une rotation de votre courbe et de votre ligne de sorte que la ligne «lignes» avec l'axe X et que vous avez maintenant réduit «la recherche de l'intersection» à «Recherche de racines» (avec alignement expliqué ici )


3 Réponses :


7
votes

Entrez la description de l'image ici

Formule de courbe quadratique: strong> p >

<h4>Calculate intersections of QBez-Curve and Line</h4>
<canvas id="canvas" width=350 height=350></canvas>


5 commentaires

Il a demandé la fonction de Bezier, pour laquelle il n'y a pas y (x), mais seulement des représentations paramétriques x (t), y (t)


Ce genre de confond de me confond plus. Seriez-vous capable d'ajouter un exemple avec des valeurs? Je trouve que je peux mieux comprendre quand je vois les choses qui travaillent.


@Gigo: Oups, mon cerveau fatigué n'a pas reconnu qu'à 1 heure la nuit dernière - mon mauvais. Alors maintenant, le calcul est assez complexe. Vous pouvez transformer la paire de courbes de ligne afin que la ligne soit alignée sur l'axe, puis calculez les racines. GIGO, avez-vous déjà codé cette solution? Sinon, je vais payer la pénalité et coder la solution pour Tyler Mackenzie ...


@Gigo, j'ai posté le code pour calculer les intersections d'une ligne QBEZ & A.


Comment pouvons-nous résoudre le même problème pour l'intersection 3D Bézier et la ligne? Par exemple pour les points: var p1 = {x: 0, y: 0, z: 1}; var p2 = {x: 100, y: 0, z: 1}; var c = {x: 0, y: 0, z: -5}; var x1 = {x: 0, y: 0, z: 0}; var x2 = {x: 100, y: 0, z: 0};



8
votes

Si vous n'avez besoin d'une intersection qu'avec une ligne droite dans la direction X, vous connaissez déjà la coordonnée Y de l'intersection. Pour que la coordonnée X, faites quelque chose comme ceci:

  • L'équation de votre ligne est simplement y = b
  • le réglage égal à votre équation Y de la fonction Bezériéraire y (t) vous fait:

    B = (1 - T) * (1 - T) * P [0] .Y + 2 * (1 - T) * T * P [1] .Y + T * T * P [2]. y
  • La résolution * pour t vous fait:
    t = (p [0] .y - P [1] .Y - SQRT (B * A + P [1] .Y * P [1] .Y - P [0]. ] .y)) / a
    avec a = p [0] .y - 2 * p [1] .y + p [2] .y
  • Insérez le t résultant dans votre équation X de la fonction BeziéR) x (t) pour obtenir la coordonnée X et vous avez terminé.

    Vous devrez peut-être faire attention à certains cas spéciaux, comme si aucune solution n'existe, car l'argument de la racine carrée peut alors devenir négatif ou le dénominateur ( A ) pourrait devenir zéro ou quelque chose comme ça.

    laisser un commentaire si vous avez besoin de plus d'aide ou de l'intersection avec des lignes arbitraires.

    (*) J'ai utilisé Wolfram Alpha pour résoudre l'équation car je suis paresseux: Solution Wolfram Alpha .


3 commentaires

J'aime vraiment cette méthode. beaucoup plus simple et élégant lors du calcul d'une ligne horizontale ou verticale. Très utile pour mon application.


Très utile pour la conversion de scanline de formes!


Notez que si vous traduisez et faites pivoter à la fois la courbe de Bézier et la ligne d'intersection, de sorte que la ligne d'intersection est égale à l'axe X, que cette méthode est toujours possible d'utiliser pour les traversées Bézier-ligne.



0
votes

Calculez la ligne Tangθ avec la coordonnée X

L'intersection de la courbe (x, y) doit être la même tangθ

alors la solution est

A = la distance x de la ligne de (ligne.x, 0) à (0,0)

(courbe.x + a) / courbe.y = tangθ (θ peut obtenir de l'intersection de la ligne avec x-coordidate)


0 commentaires