2010-06-01 19 views
7

por favor consulte mi diagrama rápido adjunto a continuación.Coordenadas perdidas. Basic Trigonometry Help

lo que estoy tratando de hacer es obtener las coordenadas de los puntos amarillos usando el ángulo de las coordenadas conocidas de los puntos rojos. Suponiendo que cada punto amarillo está a unos 20 píxeles del x: 50/y: 250 puntos rojos en ángulo recto (creo que así se llama) ¿cómo obtengo sus coordenadas?

Creo que esto es trigonometría muy básica y debería usar Math.tan(), pero no nos enseñaron mucha matemática en la escuela de arte.

alt text http://www.freeimagehosting.net/uploads/e8c848a357.jpg

+0

¿Es verdad para todos sus problemas que estarán alineados a 45 grados? –

+0

lo siento, no estoy seguro de lo que está preguntando. La matemática REALMENTE no es mi fuerte. en el diagrama de arriba, la x: 200, y: 100 actuará como un punto de anclaje. cuando el diagrama está girando, me gustaría saber la fórmula para obtener las coordenadas de los puntos amarillos independientemente del ángulo que estén haciendo los puntos rojos. Espero que tenga sentido. – TheDarkIn1978

+0

Ah, entonces no está fijado en ese ángulo. De acuerdo, es hora de escribir esa solución de vector giratorio! –

Respuesta

7

En realidad no necesitan TRIGS para éste. Simplemente use pendientes, o cambie en x y y.

Dada una línea de pendiente m = y/x, la línea perpendicular a esa línea tiene pendiente -1/m, o -x/y.

La pendiente m entre los puntos rojos es -150/150, o -1/1. Noté que tu positivo y puntos abajo.

Por lo tanto, la pendiente positiva es 1/1. Tus cambios x e y a la misma velocidad, con la misma cantidad.

Una vez que sepa eso, entonces debería ser bastante fácil darse cuenta del resto. Dado que están alineados en un ángulo de 45 grados, la relación de borde del triángulo 45-45-90 es 1 : 1 : sqrt(2). Entonces, si su longitud es 20, el cambio xey individual sería 20/sqrt(2), o aproximadamente 14 en números enteros.

Por lo tanto, sus dos puntos amarillos estarían en (36, 236), y (64, 264). Si las líneas no están alineadas a un grado conveniente, deberá usar arctan() o algo similar, y obtener el ángulo entre la línea y la línea horizontal, para que pueda calcular la relación de cambio xy y.

Espero que mi respuesta no sea demasiado difícil de seguir. Para una solución más general, vea la respuesta de Troubadour.


Editar: Puesto que la OP dijo que el punto rojo inferior está realmente rotando alrededor del punto rojo superior, necesitaremos una solución más flexible en su lugar.

Voy a extender esta respuesta de Troubadour's, ya que estoy haciendo exactamente lo mismo. Por favor, consulte su publicación mientras lee la mía.

1. Obtener el vector desde el origen (200, 100) para el punto de giro (50, 250):

vector = (200 - 50, 100 - 250) = (150, -150) 

2. girar su vector mediante el canje de la x e y, y negar x para obtener el nuevo vector:

vector = (150, -150) => swap => (-150, 150) => negate x => (150, 150) 

3. Obtener el vector unitario (de longitud 1) desde el nuevo vector:

vector = vector/length(vector) 
     = (150/length(vector), 150/length(vector)) 
     ~= (0.7071, 0.7071) 

     where 

     length(vector) = sqrt(150^2 + 150^2) ~= 212.2320 

4. Obtener el vector de desplazamiento de la longitud 20, multiplicando el vector unidad.

displacement_vector = vector * 20 
        = (0.7071 * 20, 0.7071 * 20) 
        = (14.1421, 14.1421) 

5. /menos este vector a/de su vector de rotación (punto):

yellow_1 = (50, 250) + (14.1421, 14.1421) ~= (64, 254) 
yellow_2 = (50, 250) - (14.1421, 14.1421) ~= (36, 236) 

espero que los pasos anteriores te ayudan con la formulación de su código. No importa en qué ángulo esté, los mismos pasos.

+0

dices que no necesitas trigonometría , entonces sugiero usar arctan ... –

+1

Dije "Realmente no necesitas triglices para este", y "Si las líneas no están alineadas a un grado conveniente ..." Por favor, no quites mis palabras de contexto . '=]' –

+1

+1 para el bit editado.El vector imho realmente es el camino a seguir aquí, ya sea que solo necesites el caso especial o no. –

1

Es bastante fácil si sabes que va a permanecer en 45 grados. Si la distancia desde 50, 250 es 20, entonces los puntos están en (50 - (20*sqrt(2)), 250 - (20*sqrt(2))) y (50 + (20/sqrt(2)), 250 + (20/sqrt(2))).

En general, la parte 20*sqrt(2) de cada uno debe reemplazarse por (distance)*cos(angle) y distance*sin(angle). Uno es para la coordenada xy uno para la coordenada y. (dependiendo de qué lado se mida el ángulo desde!)

En resumen, debe usar sin y cos. 45 grados es un caso especial donde sen y cos son ambos 1/sqrt(2) así que no importa qué camino los use.

2

Dado que los puntos amarillos están desviados en ángulo recto desde la línea roja-roja, puede usar algo más simple. No voy a responder toda la pregunta, pero intentaré dar algunas pistas:

Ignorando la distancia real a los puntos amarillos, imagine otros puntos en la misma línea NW-SE, a la misma distancia que esa NE punto rojo El vector para eso es simplemente el vector para el punto rojo, rotado 90 grados.

Girando 90 grados se puede hacer intercambiando las coordenadas e invirtiendo una de ellas.

Una vez que tenga eso, mueva ese punto amarillo a su posición más cercana escalando dicho vector por la distancia real (20).

4

Call el punto rojo al (50, 250) A y el de (200, 100) B.

Una forma sería calcular primero el vector AB es decir

v_AB = (200 - 50, 100 - 250) = (150, -150) 

Puede genere un vector en ángulo recto a eso intercambiando los componentes e invirtiendo el signo de uno de los dos componentes. Así

v_AB_perp = (150, 150) 

es un vector girar mediante la rotación de las agujas del reloj v_AB como se mire en la pantalla. Puede normalizar esto para obtener un vector unitario dividiendo a través de la magnitud decir

v_AB_perp_normalised = v_AB_perp/|v_AB_perp| 

Para obtener sólo en los puntos amarillos se multiplican este por sus 20 píxeles y/menos que a las coordenadas de A.

+1

+1. La rotación de vectores es una solución general mucho mejor. –

+2

Supongo que el OP no sabrá que | Z | = sqrt (Z.x * Z.x + Z.y * Z.y) –

+0

@jk: Heh, lo leí como "la longitud del vector", pero gracias por señalarlo. –

2

Esto debería funcionar (Voy a referirme al punto más a la izquierda de color amarillo, pero vamos a obtener las coordenadas de ambos en el final):

  1. encontrar la pendiente de la línea propuesta por el dos puntos rojos
  2. Encuentra la ecuación de la línea entre el punto amarillo y el punto rojo (d2).
  3. hallar las coordenadas de los puntos de color amarillo mediante el uso de la ecuación de línea d2 y el hecho de que la distancia desde el punto más bajo de color rojo es 20.

Para 1:

encontrar la pendiente: m = (y1 - y2)/(x1 - x2) = (250 - 100)/(50 - 200) = 150/-150 = -1

Para 2:

sabemos que d1 (línea entre los puntos rojos) es perpendicular en d2 (línea entre el punto rojo y el punto amarillo), y por lo tanto el producto de sus pendientes debe ser -1. Por lo tanto, la pendiente de d2 es m = 1

Por tanto, la ecuación es: d2: y - 250 = x - 50 => d2: y - x = 200

Para 3:

El punto amarillo requerida encuentra en la línea d2, y su distancia al punto de color rojo más bajo es 20. Resolver el sistema de ecuaciones:

y - x = 200 
(x - 50)^2 + (y - 250)^2 = 400 

El cálculo se pone muy feo, pero resolverlo con Mathematica da:

{{x -> 35.8579, y -> 235.858}, {x -> 64.1421, y -> 264.142}}

Ahí es donde sus dos puntos amarillos se encuentran!

Mediante programación, puede resolver dicho sistema fácilmente sustituyendo y = 200 + x en la segunda ecuación, luego moviendo todo en un lado y resolviéndolo como una ecuación cuadrática.