2010-05-21 19 views
7

Piszę niestandardową animację dla wpf i jako facet nie matematyki mam kilka pytań ...Jak obliczyć punkt wzdłuż krzywej?

Jeśli otrzymam dwa punkty3D, Od i Do, i zakładając pochodzenie jest na 0,0, 0 Jak obliczyć krzywą między dwoma punktami?

I raz mam "wykreśloną" krzywą i znam jej długość (jak to zrobić?), Jak mogę obliczyć x, y, z coords w pewnej odległości wzdłuż linii?

Dzięki!

+2

Możesz rzucić to na http://mathoverflow.net/, a następnie wróć tutaj, aby uzyskać porady dotyczące wdrożenia. Jest to dobre pytanie, gdy pojawi się rozwiązanie; usuń go ... za kilka lat pojawi się ponownie i podobnie jak ja zapomnisz matematyki. Teraz ... co zepsułem pod? .. krzywą? ... grafiką? .... cholera. – Rusty

+1

Gdy mówisz, że chcesz "zakrzywić", brzmi to tak, jakbyś nie chciał mieć linii prostej między dwoma punktami, ale chcesz linii krzywej łączącej punkty końcowe i inne punkty pomiędzy nimi. Może na początek spójrz na Splines i NURBS. – FrustratedWithFormsDesigner

+0

Powinieneś naprawdę określić, jaki rodzaj krzywej chcesz: istnieje nieskończona liczba krzywych przechodzących przez 2 punkty. EDYCJA: jeśli potrzebujesz splajnu, potrzebujesz co najmniej 3 punktów. – nico

Odpowiedz

5

Aby uzyskać prostą wektor z punktu A do punktu B:

b - a

co przekłada się na:

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

Długość:

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

Aby otrzymać punkt pewną odległość wzdłuż wektora trzeba zrobić wektor wektor jednostkowy (długość 1):

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

a następnie pomnożyć przez dystans:

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

to wszystko z pamięć, więc może nie skompilować od razu.

Jest A Vector Type for C# na CodeProject, który zrobi to za ciebie.

Jeśli chcesz krzywą, wtedy musisz:

a) określenie, jaki typ krzywej chcesz (łuk, splajn, etc.)

b) więcej punktów (centra, kontrola punkty etc.)

+0

Możesz spojrzeć na mój komentarz powyżej, ale prawdę mówiąc, nie wiem jaki rodzaj krzywizny chcę - wiem tylko, że te dwa punkty muszą istnieć na powierzchni, która otacza moje pochodzenie - zasadniczo sfera lub elipsoida to moje jedyne dwa wybory ... – Nicros

0

prawdopodobnie będziesz chciał wyrazić swoją krzywą jako zestaw funkcji parametrycznych jakiejś innej zmiennej:

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 

Istnieje nieskończona liczba krzywych łączące g dowolne dwa punkty, więc będziesz potrzebować więcej informacji, aby zdecydować, jaką formę powinny przyjąć f (t), g (t) i h (t). Aby przesunąć punkt wzdłuż krzywej, po prostu pozwól t zmieniać się pomiędzy 0 i 1 i oblicz współrzędne x, yi z . Jednym podejściem jest zdefiniowanie zestawu punktów kontrolnych, przez które ma przebiegać (lub zbliżona) krzywa, a następnie wyrażanie równań parametrycznych w kategoriach: spline functions. W tym celu nie musisz znać długości łuku krzywej.

+0

Dzięki za odpowiedź! Wysłałem kilka komentarzy powyżej, ale w zasadzie myślę, że moje dwa punkty znajdują się na zamkniętej powierzchni - kuli lub elipsoidzie. Tak więc biorąc pod uwagę pochodzenie i te dwa punkty, potrzebowałbym uzyskać pozycję xyz w danym czasie (lub odległości wzdłuż linii). – Nicros

0

Po prostu chciałem podążać za moim rozwiązaniem - podczas gdy prawdą jest, że istnieje nieskończona liczba krzywych - moje (źle sformułowane) pytanie polegało na tym, jak rysować między dwoma punktami na zakręcie - najkrótszą odległość, zakładając pochodzenie 0,0,0 i dwa punkty 3d. To, co zrobiłem, to przekształcenie moich punktów z kartezjańskiego na polarne, obliczyć punkt kulisty w danym czasie, a następnie zamienić ten punkt z powrotem na kartezjan. Jeśli ktoś chce, żebym opublikował aktualny kod C#, daj mi znać.

Powiązane problemy