2010-05-21 2 views
7

Ich schreibe eine benutzerdefinierte Animation für WPF und als ein Nicht-Mathe-Typ habe ich ein paar Fragen ...Wie berechne ich den Punkt entlang einer Kurve?

Wenn ich zwei Point3Ds, die Von und To, und die Annahme der Herkunft ist bei 0,0 gegeben, 0 Wie berechne ich eine Kurve zwischen den beiden Punkten?

Und sobald ich die Kurve 'geplottet' habe und ich ihre Länge weiß (wie geht das auch?) Wie kann ich die x, y, z-Koordinaten in einer bestimmten Entfernung entlang der Linie berechnen?

Danke!

B - A

, die übersetzen würde:

+2

Sie können dies auf http://mathoverflow.net/ werfen und dann kommen Sie hier für Implementierungsrat. Es ist eine gute Frage ... wenn Sie die Lösung bekommen; fang es weg ... es wird in ein paar Jahren wieder auftauchen und du wirst wie ich die Mathematik vergessen haben. Nun ... was habe ich da unter? .. Kurve? ... Grafik? .... Mist geschrieben. – Rusty

+1

Wenn Sie sagen, dass Sie eine "Kurve" möchten, klingt es so, als wollten Sie nicht nur eine Gerade zwischen Ihren beiden Punkten, sondern auch eine kurvenreiche Linie, die Ihre Endpunkte und andere dazwischen liegende Punkte verbindet. Vielleicht sehen Sie Splines und NURBS als einen Anfang. – FrustratedWithFormsDesigner

+0

Sie sollten wirklich angeben, welche Art von Kurve Sie wollen: Es gibt eine unendliche Anzahl von Kurven durch 2 Punkte. EDIT: Wenn Sie einen Spline wollen, brauchen Sie mindestens 3 Punkte. – nico

Antwort

5

Um eine gerade Linie Vektor von Punkt A nach Punkt B bekommen

vector.x = b.x - a.x; 
vector.y = b.y - a.y; 
vector.z = b.z - a.z; 

Die Länge ist:

length = Math.Sqrt(vector.x * vector.x + 
        vector.y * vector.y + 
        vector.z * vector.z); 

Um einen Punkt in einem bestimmten Abstand entlang des Vektors Sie den Vektor einen Einheitsvektor zu machen brauchen, um (Länge 1):

vector.x = vector.x/length; 
... 

und dann multiplizieren Sie Abstand:

vector.x = distance * vector.x; 
... 

Das alles ist aus Speicher so könnte nicht sofort kompilieren.

Es gibt A Vector Type for C# auf CodeProject, die viel davon für Sie tun wird.

Wenn Sie eine Kurve wollen, dann werden Sie brauchen:

a) zu definieren, welche Art von Kurve Sie wollen (Bogen, Spline etc.)

b) mehr Punkte (Zentren, Steuer Punkte etc.)

+0

Sie können einen Blick auf meinen Kommentar oben, aber Wahrlich, ich weiß nicht, welche Art von Kurve ich will - alles was ich weiß ist, dass diese zwei Punkte auf einer Oberfläche existieren müssen, die meinen Ursprung umgibt - im Grunde eine Kugel oder ein Ellipsoid sind meine einzigen zwei Möglichkeiten .... – Nicros

0

Sie werden wahrscheinlich Ihre Kurve als eine Reihe von Parameterfunktionen von einer anderen variablen zum Ausdruck bringen wollen:

x = f(t) 
y = g(t) 
z = h(t) 

where 0 <= t <= 1, and 

f(0) = from.x, f(1) = to.x 
g(0) = from.y, g(1) = to.y 
h(0) = from.z, h(1) = to.z 

Es gibt eine unendliche Anzahl von Kurven connectin Wenn Sie zwei Punkte benötigen, benötigen Sie weitere Informationen, um zu entscheiden, welche Form f (t), g (t) und h (t) annehmen soll. Um einen Punkt entlang der Kurve zu verschieben, lassen Sie t zwischen 0 und 1 variieren und berechnen Sie die Koordinaten x, y und z . Ein Ansatz besteht darin, eine Reihe von Kontrollpunkten zu definieren, die Ihre -Kurve durchlaufen sollen (oder nahe), und dann Ihre parametrischen Gleichungen in Form von spline functions auszudrücken. Sie müssen die Bogenlänge der Kurve nicht kennen, um dies zu tun.

+0

Danke für die Antwort! Ich habe oben ein paar Kommentare gepostet, aber im Grunde denke ich, dass meine zwei Punkte auf einer geschlossenen Oberfläche liegen - eine Kugel oder ein Ellipsoid. Angesichts des Ursprungs und dieser zwei Punkte müsste ich die xyz-Position zu einer gegebenen Zeit (oder Entfernung entlang der Linie) erhalten. – Nicros

0

Also wollte ich nur meine Lösung verfolgen - während es wahr ist, gibt es eine unendliche Anzahl von Kurven - meine (schlecht formulierte) Frage war, wie zwischen zwei Punkten auf einer Kurve - die kürzeste Entfernung, unter der Annahme ein Ursprung von 0,0,0 und zwei 3D-Punkte. Was ich getan habe, war, meine Punkte von kartesisch in polar umzurechnen, den Kugelpunkt zu einer bestimmten Zeit zu berechnen und diesen Punkt dann in Kartesische umzuwandeln. Wenn jemand möchte, dass ich den tatsächlichen C# -Code poste, lass es mich wissen.