4 votos

¿2D - coordenadas de un punto a lo largo de una línea, basado en d y m - donde estoy liando para arriba?

DESPUÉS DE EDITAR:

Me las arreglé para encontrar los errores en mi ecuaciones a continuación. Era una señal de error en uno de los términos (en lugar de +). Haber corregido eso, el método que describo a continuación FUNCIONA, pero NO LO USO ::- D. Mi método es complicado y propenso a errores (como he demostrado, jaja). Las 2 respuestas a continuación ofrecen mucho mejores opciones. hardmath encontrado un par de mis errores y proporciona una forma alternativa de obtención de X2 y Y2 usando el mismo sistema de las fórmulas que se utilizan.

Por otro lado, joriki proporciona una solución alternativa que es MUY eficiente en términos de número de cálculos que deben hacerse cada fotograma. Finalmente, he abandonado por completo mi enfoque y hará uso de su solución.

Gracias hardmath y joriki, y, por todos los medios, Matemáticas @ Pila ::- D. la gente regla! Yo humildemente gracias por ayudar a un programador en peligro!

POST ORIGINAL:

Hola ::- D. yo estoy trabajando en un (Flash) juego y tengo un arma de la que un proyectil sale. El proyectil viaja a lo largo de una línea. Tengo la pendiente de la línea, así como el origen (1 punto). Quiero calcular, en función de la Distancia, donde debo sacar el proyectil, fotograma por fotograma. Aumenta la distancia con una cierta cantidad cada fotograma, como el proyectil viaja a lo largo de la línea.

He intentado mi mejor para solucionar esto y esto es lo que hice hasta ahora. No me importaría si usted sabe de una manera más sencilla, pero me gustaría mucho agradecería si usted me diga por qué mi método no funciona (las coordenadas estoy recibiendo son muy caótico).

He utilizado estas ecuaciones para construir un sistema:

http://www.analyzemath.com/Calculators/TwoPointsCalculator.html

d = sqrt [ (x1 -x2)^ + (y1 - y2)^ ]

m = (y2 - y1) / (x2 - x1)

Saqué y2:

y2 = m * x2 - m * x1 + y1

A partir de esa ecuación, yo lo sé todo, excepto x2. x1, y1 and m are all known. Estoy a la búsqueda de x2 y y2 que están las coordenadas de mi punto deseado.

He quitado el radical por el cuadrado de la primera ecuación y también romper (problemas) el paranthesis. Debo mencionar que ha sido un largo tiempo desde que no hago matemáticas así que disculpen la falta de la terminología correcta. También, estoy familiarizado con la forma de producir una rápida MathJaX de las ecuaciones, pero creo que estamos lo suficientemente simple para ser escrito normalmente. ^ - los medios de la plaza. He utilizado algunos extra paranthesis.

d^ = x1^ - (2 * x2 * x1) + x2^ + y1^ - (2 * y2 * y1) + y2 ^

Ok, así que también sé que d es. Ahora, me tomó y2 y la sustituye en la ecuación anterior. Esto es lo que resultó:

d^ = x1^ - 2 * x2 * x1  + x2^ + y1^ - 2 * y1 * (m * x2 + K) + (m * x2 +K) ^

Donde K es la parte que me puede calcular a partir de la anterior y2 ecuación: y2 = m* x2 -m * x1 + y1

Así que ahora tengo una ecuación en la que yo lo sé todo, excepto x2. He reducido esta ecuación para una ecuación cuadrática. La forma final (he resuelto el cuadrado paréntesis anterior) es:

x2^ ( - 1 - m^) + x2 (2 * x1   + 2 *  y1 * m - 2 * m * K) + d^ - x1^ - y1^ + 2 * y1 * K - K ^ = 0

Se ve de miedo ¿no? reír.

Este parece ser el correcto. Porque estamos hablando de una recta, la pendiente y la distancia, es obvio que no puede haber DOS puntos de distancia D de mi Origen (x1, y1). Así que me resuelva la ecuación cuadrática para encontrar x2-1 y x2-2, que puedo tomar para mi primera ecuación y obtener y2-1 y y2-2. Así que se trasladó a resolver la ecuación cuadrática. En primer lugar, he encontrado a, b y c).

a = -1 - m^
b = (2 * x1   + 2 *  y1 * m - 2 * m * K) 
c = d^ -  x1^ - y1^  + 2 * y1 * K - K ^ 

Y ahora, he encontrado la 2 raíces:

x2 = (-b + sqrt (b^ - 4ac)) / 2a
x2 = (-b - sqrt (b^ - 4ac)) / 2a

Entonces, encontré a los dos y2 puntos. Y es así ::- D.

No funciona reír......... He trabajado durante horas de esta mañana, la flexión, lo patético de matemáticas músculos llegué a la izquierda y he trabajado en toda esta lejos de terminar con:

(x=1509141.9643610462, y=20806970.245399687)

Esto, en caso de que el origen está en 200, 250 y la distancia es de 1 y la pendiente es de 2.2 o -0.7 o lo que sea.......

A veces, yo me pongo NaN (No un Número, Un valor no válido en ActionScript 3). Por lo que los valores que me estoy poniendo DEFINITIVAMENTE no están relacionados con mi origen.

Un punto de interés, sin embargo: de la pendiente = 1.380657160570366, mi proyectil en REALIDAD PARECE QUE funciona, como en, parece un poco DEMASIADO lejos del Origen (alrededor de 50 píxeles), pero se MUEVE a lo largo de la línea correcta, aunque, extrañamente, se ACELERA, aunque yo nunca aumentar su velocidad, yo simplemente aumentar la distancia:

_ProjectileDistance += _ProjectileSpeed;
var newCoords: Point = GetPointAlongLine(weaponRootPointX, weaponRootPointY, _ProjectileDistance, _ProjectileSlope);
Projectile.x = newCoords.x;
Projectile.y = newCoords.y;

Y para los que saben de programación, aquí es lo que me dijo se ve como en el código:

  var a: Number = - 1 - slope * slope;
  var b: Number = 2 * x1 + 2 * y1 * slope - 2 * slope * y2KnownPart;
  var c: Number = distance*distance - x1*x1 - y1*y1 - 2 * y1 * y2KnownPart - y2KnownPart*y2KnownPart;

  var x2Root1: Number = (- b + Math.sqrt(b*b - 4 * a * c)) / (2 * a);
  var x2Root2: Number = (- b - Math.sqrt(b*b - 4 * a * c)) / (2 * a);
  var y2Root1: Number = slope * x2Root1 + y2KnownPart;
  var y2Root2: Number = slope * x2Root2 + y2KnownPart;

Lo siento por el largo post ::- D. espero que alguien tenga la paciencia de leer hasta esta línea ::- D. Si usted lo hizo, sé que usted está haciendo por una buena causa ::- D. Mi los juegos son gratis, así es mi software, basta con mirar aquí ::- D https://sourceforge.net/users/echysttas

7voto

JiminyCricket Puntos 143

Su enfoque es demasiado complicado-no voy a tomar el tiempo para encontrar donde se ha cometido un error, pero en lugar de mostrar como se puede hacer mucho más sencillo:

La distancia $d$ es la hipotenusa de un triángulo formado por los dos ejes paralelos los segmentos de longitudes $\Delta y := y_2-y_1$$\Delta x := x_2-x_1$, como en esta imagen que he encontrado en la web:

enter image description here

La pendiente $m$$\Delta y/\Delta x$, que es la tangente del ángulo de $\alpha$ entre la línea y el $x$-eje: $m=\tan\alpha$. Los incrementos de $\Delta x$ $\Delta y$ están dadas por el seno y coseno, respectivamente, de que el ángulo de los tiempos de la hipotenusa, entonces todo lo que tienes que hacer es calcular el $\alpha=\arctan m$ y, a continuación,$\Delta x = d\cos \alpha$$\Delta y=d\sin\alpha$. Si sus cálculos son críticas en el tiempo, puede llegar a funcionar con un par menos trascendental operaciones, pero esta es la manera más directa.

Edit: en Realidad, usted querrá usar el atan2 función que una gran cantidad de entornos de programación, con los argumentos de la $\Delta y$$\Delta x$, ya que perder una señal al formulario de $m=\Delta y/\Delta x$, es decir, ya no sabe qué dirección lo largo de la línea del proyectil es viajar.

Edit: hardmath la respuesta es más o menos lo que yo tenía en mente cuando me dijo "Si sus cálculos son críticas en el tiempo, puede llegar a funcionar con un par menos trascendental de las operaciones". Nota, sin embargo, que en tanto responde a la trascendental operaciones se deben realizar sólo una vez (una raíz cuadrada en hardmath del caso, tres funciones trigonométricas en mi caso) y, a continuación, el cálculo de la posición del proyectil para cada una de las $d$ sólo implica multiplicaciones.

1voto

jwarzech Puntos 2769

Creo que te has perdido una oportunidad para mantener el problema simple. Desde m, x1, y1, d son conocidos, están pidiendo a resolver dos ecuaciones para las dos incógnitas x2, y2:

$$ (x2 - x1)^2 + (y2 - y1)^2 = d^2 $$

$$ (y2 - y1) / (x2 - x1) = m $$

But this is simpler to state in terms of unknowns u = x2 - x1 and v = y2 - y1. Once you've found u, v it is trivial to get x2, y2 by adding x1, y1 respectively. So consider the two equations:

$$ u^2 + v^2 = d^2 $$

$$ v/u = m $$

Now $v = m u$ from the 2nd eqn. can be substituted into the 1st eqn. giving us simply:

$$ (m^2 + 1)u^2 = d^2 $$

whose solution is obviously (assuming d > 0):

$$ u = \pm d/ \sqrt{m^2 + 1} $$

and correspondingly:

$$ v = \pm m d/ \sqrt{m^2 + 1} $$

donde la misma elección de más-o-menos el signo debe ser hecha en ambas fórmulas.

Por una abundancia de precaución que uno debe sustituir estas de vuelta en las ecuaciones para u, v arriba, para asegurarse de que no hemos introducido artefacto raíces (no tenemos). Geométricamente la imagen es una línea que pasa por el origen de la intersección de la circunferencia de radio d a un punto de (u,v) a lo largo de una línea de pendiente m.

Por último, agregar (x1,y1) a (u,v) conseguir (x2,y2) y listo. Presumiblemente hay algo de información acerca de la dirección en la que circula, que indica en cuál de las dos soluciones es la que usted desea...

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X