Ayuda matemática: no se puede rotar algo (saber Java sería una ventaja)
Pregunta
Bien, estoy intentando rotar un polígono de Java en función de su posición original del ángulo 0.x e y terminan convirtiéndose en un int al final de mi uso, por lo que podría entender que no veo algún cambio, pero cuando la diferencia en los ángulos es grande, como de 0 a 180, creo que debería ver algo.
Llevo un rato en esto y no se me ocurre qué es.Aquí está el método.(Lo siento si se estropea las etiquetas de código, mi Firefox las estropea).
public void rotate(double x, double y, obj o1)
{
double dist = Math.sqrt(Math.pow(x - (o1.x + (o1.w/2)), 2) + Math.pow(y - (o1.y + (o1.h/2)),2));
x += (Math.sin(Math.toRadians(o1.a)) * dist);
y -= (Math.cos(Math.toRadians(o1.a)) * dist);
}
Solución
Los valores de x
y y
que están siendo manipulados en el método rotate
no serán vistos en el método que está llamando porque Java pasa los argumentos del método por valor .
Por lo tanto, los valores x
y y
que están siendo cambiados en el método rotate
es una copia local, por lo que una vez que se sale del ámbito (es decir regresar del método rotate
a su método de llamada), los valores de x
y y
voluntad desaparecer.
Así que en la actualidad, lo que está sucediendo es:
x = 10;
y = 10;
o1 = new obj();
o1.a = 100;
rotate(x, y, obj);
System.out.println(x); // Still prints 10
System.out.println(y); // Still prints 10
La única manera de obtener múltiples valores de vuelta de un método en Java es pasar un objeto, y manipular el objeto que se pasa. (En realidad, una copia de la referencia al objeto se pasa en cuando una llamada al método es hecho.)
Por ejemplo, redefiniendo rotate
para devolver una Point
:
public Point rotate(int x, int y, double angle)
{
// Do rotation.
return new Point(newX, newY);
}
public void callingMethod()
{
int x = 10;
int y = 10;
p = rotate(x, y, 45);
System.out.println(x); // Should print something other than 10.
System.out.println(y); // Should print something other than 10.
}
Dicho esto, como Pierre sugiere , utilizando la AffineTransform sería mucho más fácil en mi opinión.
Por ejemplo, la creación de un Rectangle
objeto y girándola usando AffineTransform
se puede realizar por el siguiente:
Rectangle rect = new Rectangle(0, 0, 10, 10);
AffineTransform at = new AffineTransform();
at.rotate(Math.toRadians(45));
Shape rotatedRect = at.createTransformedShape(rect);
AffineTransform
se puede aplicar a las clases que implementan la Shape
interfaz. Una lista de las clases que implementan Shape
se puede encontrar en las especificaciones de la API Java para la interfaz vinculados Shape
.
Para obtener más información sobre cómo utilizar AffineTransform
y Java 2D:
Otros consejos
FYI: Rotación de formas y puntos se ha implementado en java.awt.geom.AffineTransform
Estás realizando un Transformación rotacional 2D.
Debería verse así:
xnew = xold*cos(t) - yold*sin(t)
ynew = xold*sin(t) + yold*cos(t)
Por supuesto, el ángulo de rotación t debe estar expresado en radianes.Es cero en el eje x y aumenta en el sentido contrario a las agujas del reloj.
Tanto los puntos antiguos como los nuevos deben expresarse en relación con el origen sobre el que estás girando.