Math help - Не могу повернуть что-то (зная, что Java будет плюсом) - PullRequest
0 голосов
/ 23 февраля 2009

Хорошо, я пытаюсь повернуть многоугольник Java, основываясь на его исходной позиции угла 0. x, и y в конечном итоге преобразуется в int в конце моего использования, поэтому я мог понять, что не вижу каких-то изменений, но когда разница в углах велика, например, от 0 до 180, я думаю, что должен увидеть что-то .

Я занимался этим некоторое время и не могу вспомнить, что это такое. Вот метод. (Извините, если он запутался в тегах кода, мой Firefox испортил их.)

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);  
}

Ответы [ 3 ]

9 голосов
/ 23 февраля 2009

Значения x и y, которыми манипулируют в методе rotate, не будут видны в вызывающем его методе, поскольку Java передает аргументы метода по значению .

Следовательно, значения x и y, которые изменяются в методе rotate, являются локальной копией, поэтому, как только он выходит из области видимости (т. Е. Возвращается из метода rotate в вызывающий метод) значения x и y исчезнут.

Итак, в настоящее время происходит следующее:

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

Единственный способ получить несколько значений из метода в Java - это передать объект и манипулировать переданным объектом. (На самом деле, копия ссылки на объект передается, когда вызов метода сделал.)

Например, переопределение rotate для возврата 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.
}

Тем не менее, как сказал Пьер , с помощью AffineTransform было бы намного проще, на мой взгляд.

Например, создание объекта Rectangle и вращение его с помощью AffineTransform может быть выполнено следующим образом:

Rectangle rect = new Rectangle(0, 0, 10, 10);

AffineTransform at = new AffineTransform();
at.rotate(Math.toRadians(45));

Shape rotatedRect = at.createTransformedShape(rect);

AffineTransform может применяться к классам, которые реализуют интерфейс Shape. Список классов, реализующих Shape, можно найти в связанных спецификациях API Java для интерфейса Shape.

Для получения дополнительной информации о том, как использовать AffineTransform и Java 2D:

4 голосов
/ 23 февраля 2009

К вашему сведению: вращение фигур и точек было реализовано в java.awt.geom.AffineTransform

1 голос
/ 23 февраля 2009

Вы выполняете 2D вращательное преобразование .

Это должно выглядеть примерно так:

xnew = xold*cos(t) - yold*sin(t)
ynew = xold*sin(t) + yold*cos(t)

Конечно, угол поворота должен быть в радианах. На оси х он равен нулю и увеличивается в направлении против часовой стрелки.

Как старые, так и новые точки должны быть выражены относительно источника, вокруг которого вы вращаетесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...