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);  
}
¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top