2010-05-21 10 views
7

Sto scrivendo un'animazione personalizzata per wpf e come non matematico ho un paio di domande ...Come calcolare il punto lungo una curva?

Se mi vengono dati due Point3D, il Da e il, e assumendo l'origine è a 0,0, 0 come faccio a calcolare una curva tra i due punti?

E una volta che ho "tracciato" la curva e conosco la sua lunghezza (come fare anche questo?) Come posso calcolare le coordinate x, y, z ad una certa distanza lungo la linea?

Grazie!

+2

Si potrebbe voler lanciare questo http://mathoverflow.net/ e quindi tornare qui per consigli di implementazione. È una buona domanda ... quando ottieni la soluzione; archivialo via ... tornerà di nuovo tra qualche anno e come me avrai dimenticato la matematica. Ora ... cosa ho archiviato sotto? Curva? ... grafica? .... merda. – Rusty

+1

Quando dici che vuoi una "curva", sembra che tu non voglia solo una linea retta tra i tuoi due punti ma desideri una linea sinuosa che connetta i tuoi endpoint e altri punti intermedi. Forse dare un'occhiata a Splines e NURBS come inizio. – FrustratedWithFormsDesigner

+0

Devi davvero specificare che tipo di curva vuoi: c'è un numero infinito di curve che passano attraverso 2 punti. EDIT: se si desidera una spline avete bisogno almeno di 3 punti. – nico

risposta

5

Per ottenere un vettore linea retta dal punto A al punto B:

B - A

che si tradurrebbe a:

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

La lunghezza è di:

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

Per ottenere un punto a una certa distanza lungo il vettore è necessario effettuare il vettore un vettore unitario (lunghezza 1):

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

e poi moltiplicare per la distanza:

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

Questo è tutto da la memoria quindi potrebbe non essere compilata immediatamente.

C'è A Vector Type for C# su CodeProject che farà molto questo per voi.

Se si desidera una curva, quindi avrete bisogno:

a) definire quale tipo di curva che si desidera (ad arco, spline, ecc)

b) più punti (centri, il controllo punti ecc)

+0

Potete dare un'occhiata al mio commento di cui sopra, ma sinceramente, io non so che tipo di curva I desidera-tutto quello che so è che devono esistere questi due punti su una superficie che circonda la mia origine- fondamentalmente una sfera o ellissoide sono le mie uniche due scelte .... – Nicros

0

probabilmente si vorrà esprimere la vostra curva come un insieme di funzioni parametriche di qualche altra variabile:

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 

ci sono un numero infinito di curve connectin g qualsiasi due punti, quindi avrai bisogno di più informazioni per decidere quale forma devono prendere f (t), g (t) eh (t). Per spostare un punto lungo la curva, basta lasciare che t varia tra 0 e 1 e calcolare le coordinate x, ye z . Un approccio consiste nel definire un insieme di punti di controllo che desideri che la curva passi attraverso (o vicino), quindi esprimere le equazioni parametriche in termini di spline functions. Non è necessario conoscere la lunghezza dell'arco della curva per fare ciò.

+0

Grazie per la risposta! Ho postato un paio di commenti sopra, ma fondamentalmente, sto pensando che i miei due punti siano su una superficie chiusa, una sfera o un ellissoide. Quindi, data l'origine e questi due punti, avrei bisogno di ottenere la posizione xyz in un dato momento (o la distanza lungo la linea). – Nicros

0

Quindi volevo solo seguire la mia soluzione- mentre è vero che c'è un numero infinito di curve- la mia (poco formulata) domanda era come tracciare tra due punti su una curva- la distanza più breve, assumendo un origine di 0,0,0 e due punti 3d. Quello che ho fatto è stato convertire i miei punti da cartesiani a polari, calcolare il punto sferico in un dato momento e poi riconvertire quel punto in cartesiani. Se qualcuno vuole che inserisca il codice C# attuale fammelo sapere.