Kreuzung zwischen Bézier-Kurve und einem Liniensegment
Ich Schreibe ein Spiel in Python (mit pygame), die mich verpflichtet, generiert zufällige aber gut aussehende "Meer" für jedes neue Spiel. Nach langer Suche entschied ich mich auf einen Algorithmus beinhaltet, dass die Bezier-Kurven definiert, die in padlib.py. Ich jetzt brauchen, um herauszufinden, wenn die Kurven generiert padlib schneiden Sie eine Linie segment.
Brute-force-Methode wäre, nur die Menge der Liniensegmente approximiert produziert von padlib um die Antwort zu finden. Ich vermute aber, dass eine bessere Antwort gefunden werden kann, analytisch. Ich habe nur ein paar Dutzend spline-Segmente - Suche, Sie sollten schneller sein als tausend von Linien-Segmenten.
Ein wenig Suche hat mich auf diesem Weg sind: Bezier-Kurve -> Kochanek-Bartels-Spline -> Kubische Hermite-spline
Auf der letzten Seite, ich fand diese Funktion:
p(t) = h00(t)p0 + h10(t)m0 + h01(t)p1 + h11(t)m1
wo p(t) ist tatsächlich ein Punkt (2-dimensionaler Vektor), hij(t) - Funktionen sind kubische Polynome, p0, p1, m0 und m1 sind die Punkte, die ich bekommen kann von padlib code.
Nun, ich kann sehen, dass die Lösung zu meinem problem ist p(t) = u + v * t1, wobei u und v das Ende meiner Strecke.
Jedoch, die analytische Lösung ist mir schleierhaft. Hat jemand hier wissen von einer vorhandenen Lösung? Oder kann mir helfen bei der Lösung der Gleichungen?
- wäre schön, wenn einer der beteiligten ein Teil Ihres Quellcodes, denn deine Frage ist zu unverständlich
- Der entsprechende code ist meistens in padlib.py. Und die Mathematik in Wikipedia-Artikeln ist wichtiger als der code.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als eine grobe Skizze, drehen und übersetzen Sie das system, so dass das Liniensegment liegt auf der X-Achse. Nun die y-Koordinate ist eine kubische Funktion des Parameters t an. Finden Sie die 'Nullen' (die analytische Formeln gefunden werden, in gute mathematische Texte oder wikipedia). Bewerten Sie jetzt die x-Koordinaten entspricht, die null Punkte und testen Sie gegen Ihre line-segment.