2010-05-21 18 views
7

Estoy escribiendo una animación personalizada para wpf y como un tipo no matemático Tengo un par de preguntas ...¿Cómo calcular el punto a lo largo de una curva?

Si me dan dos Point3D's, el From y To, y suponiendo que el origen está en 0,0, 0 ¿cómo puedo calcular una curva entre los dos puntos?

Y una vez que tengo la curva 'trazada' y conozco su longitud (¿cómo hacer eso también?) ¿Cómo puedo calcular las coordenadas x, y, z a cierta distancia a lo largo de la línea?

Gracias!

+2

Es posible que desee plantear esto en http://mathoverflow.net/ y luego volver aquí para obtener consejos de implementación. Es una buena pregunta ... cuando obtienes la solución; archívala ... volverá a aparecer en unos años y, como yo, habrás olvidado las matemáticas. Ahora ... ¿qué archivé debajo de ... curva? ... ¿gráficos? .... mierda. – Rusty

+1

Cuando dices que quieres una "curva", parece que no solo quieres una línea recta entre tus dos puntos, sino también una línea curva que conecta tus puntos finales y algunos otros puntos intermedios. Tal vez busque en Splines y NURBS como un comienzo. – FrustratedWithFormsDesigner

+0

Realmente debe especificar qué tipo de curva desea: hay un número infinito de curvas que pasan por 2 puntos. EDITAR: si quieres una spline necesitas al menos 3 puntos. – nico

Respuesta

5

Para obtener un vector línea recta del punto A al punto B:

B - A

lo que se traduciría a:

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

La longitud es:

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

Para conseguir un punto a cierta distancia a lo largo del vector que necesita para hacer el vector de un vector unitario (longitud 1):

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

y luego se multiplica por la distancia:

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

Esto es todo de memoria, por lo que podría no compilarse de inmediato.

Hay A Vector Type for C# en CodeProject que hará mucho de esto por usted.

Si desea una curva, entonces tendrá que:

a) Definir qué tipo de curva que desea (arco, spline, etc.)

b) más puntos (centros, el control puntos, etc.)

+0

Puede echar un vistazo a mi comentario anterior, pero sinceramente, no sé qué tipo de curva quiero, todo lo que sé es que estos dos puntos deben existir en una superficie que rodea mi origen; básicamente, una esfera o elipsoide son mis dos únicas opciones ... – Nicros

0

es probable que quiere expresar su curva como un conjunto de funciones paramétricas de alguna otra variable:

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 

Hay un número infinito de curvas connectin En dos puntos, necesitará más información sobre para decidir qué forma deben tomar f (t), g (t) y h (t). Para mover un punto a lo largo de la curva, simplemente deje que t varíe entre 0 y 1 y calcule las coordenadas x, y y z . Un enfoque es definir un conjunto de puntos de control para los que desea que pase su curva (o cerca) y luego expresar sus ecuaciones paramétricas en términos de spline functions. No necesitará saber la longitud del arco de la curva para hacer esto.

+0

¡Gracias por la respuesta! Publiqué un par de comentarios arriba, pero básicamente, estoy pensando que mis dos puntos están en una superficie cerrada, una esfera o un elipsoide. Entonces, dado el origen y estos dos puntos, necesitaría obtener la posición xyz en un momento dado (o la distancia a lo largo de la línea). – Nicros

0

Así que solo quería seguir con mi solución, aunque es cierto que hay un número infinito de curvas, mi pregunta (mal redactada) fue cómo trazar entre dos puntos en una curva, la distancia más corta, suponiendo que origen de 0,0,0 y dos puntos 3d. Lo que hice fue convertir mis puntos de cartesianos a polares, calcular el punto esférico en un momento dado y luego convertir ese punto a cartesianos. Si alguien quiere que publique el código de C# real, hágamelo saber.

Cuestiones relacionadas