2010-08-21 16 views
28

Digamos que tengo un (x, y) que es siempre el mismo para el punto inicial de una línea y un (x, y) que cambia para el punto final de ese mismo línea. La línea también es siempre 40px de largo. Al comienzo del programa, la línea se origina en una orientación vertical (llamémosla 0 grados). Basado en la entrada de un usuario, necesito que la línea se vuelva a dibujar un número específico de grados desde su origen cambiando solo el final (x, y).Dibuje una línea en un ángulo específico en Java

algo más de comida PENSAR SI NECESITA:

estoy en una rutina tratando de calcular esto y hacer que funcione en Java. Puedo hacer que las matemáticas funcionen para calcular el punto en función de la longitud del arco de un segmento circular, pero no sé cómo hacer que Java lo haga.

Creo que sería más fácil basándome en un triángulo ya que siempre sabré la longitud de dos lados de un triángulo (un lado formado por la línea larga 40px y el otro lado formado por el punto inicial de esa línea y el borde del JPanel) y el ángulo formado por esas dos líneas. Aún así, mi cerebro está loco por tratar de resolverlo. Cualquier ayuda sería muy apreciada.

ACTUALIZACIÓN:

@casablanca me consiguió en el camino correcto. Revisé mis funciones trigonométricas y aquí es cómo lo hice funcionar.

En primer lugar, no me di cuenta de que 90 grados era recto, pero una vez que me di cuenta de que hice que mi solución reflejara ese hecho. Estaba dibujando mi línea comenzando en la parte inferior central del marco que salía. Dado que el lado opposite del triángulo está en el lado derecho de la pantalla cuando el ángulo dado por mi usuario es inferior a 90 grados y está en el lado izquierdo de la pantalla cuando el ángulo dado por mi usuario es mayor que 90 grados tuve para ajustar la fórmula para tener en cuenta ese hecho, así tengo cuatro métodos, uno para la coordenada x en el lado izquierdo de la pantalla (cuando el ángulo dado por el usuario es mayor de 90 grados), uno para la coordenada y en el lado izquierdo de la pantalla (cuando el ángulo dado por el usuario es mayor de 90 grados) y lo mismo para el lado derecho de la pantalla cuando el ángulo dado por el usuario es inferior a 90 grados. El int length en todos los métodos es la longitud de la hipotenusa. ¡Gracias de nuevo por su ayuda @casablanca!

public double leftSideX(double angle, int length){ 
    double x = frameWidth/2 - (length * Math.cos(Math.toRadians(90-(Math.toDegrees(angle)-90)))); 
    return x; 
} 

public double leftSideY(double angle, int length){ 
    double y = frameHeight - (length * Math.sin(Math.toRadians(90-(Math.toDegrees(angle)-90)))); 
    return y; 
} 

public double rightSideX(double angle, int length){ 
    double x = frameWidth/2 + (length * Math.cos(angle)); 
    return x; 
} 

public double rightSideY(double angle, int length){ 
    double y = frameHeight - (length * Math.sin(angle)); 
    return y; 
} 
+0

También podría considerar modificar los gráficos de contexto de transformar, que se muestra aquí: http://stackoverflow.com/questions/3420651 – trashgod

+0

Es posible que desee considerar que encapsula este functionlity en una clase; p.ej. Vector2D. De esa forma, podría construir un Vector2D con coordenadas xey, una longitud y un ángulo, y proporcionar métodos como getMagnitude(), getAngle(), getX(), getY(), rotateClockwise (double), etc. – Adamski

+0

Lo haría Me encanta, pero creo que eso está un poco más allá de mi capacidad en este momento. Me llevó casi un día entero resolver esto :) – ubiquibacon

Respuesta

64

¿Esto es lo que estás buscando?

startX = x; 
startY = y; 
endX = x + 40 * Math.sin(angle); 
endY = y + 40 * Math.cos(angle); 

y trazar una línea desde (startX, StartY) a (EndX, Endy) en cualquier API que está utilizando.

También tenga en cuenta que angle está en radianes. Si lo ha tenido en grados, es necesario convertirlo en primer lugar:

angle = angle * Math.PI/180; 
+1

Espero que a Dios no sea tan simple, pero si es así, ¡te vas a llevar a la tarta de frutas esta Navidad! Ahora estoy demasiado cansada para intentarlo, pero a primera hora de la mañana ... ¡gracias por la respuesta rápida! – ubiquibacon

+1

@Jim Lewis: En realidad, las convenciones trigonométricas son al revés. Lo cambié porque OP quería 0 grados para ser vertical: 'sin 0 = 0' así' endX = x' y 'cos 0 = 1' así que' endY = y + 40'. – casablanca

+0

@casablanca: D'oh! Por supuesto, tienes razón ... tal vez debería dejar de comentar sobre las publicaciones de matemáticas los viernes por la noche. –

Cuestiones relacionadas