Математическая справка - Не могу что-то повернуть (знание Java было бы плюсом)
Вопрос
Хорошо, я пытаюсь повернуть 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);
}
Решение
Ценности из 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.
}
Тем не менее, поскольку Пьер предлагает, используя Аффинная трансформация на мой взгляд, было бы намного проще.
Например, создание 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
можно найти в связанных спецификациях Java API для Shape
интерфейс.
Для получения дополнительной информации о том, как использовать AffineTransform
и Java 2D:
Другие советы
К ТВОЕМУ СВЕДЕНИЮ:Вращающиеся фигуры и точки были реализованы в java.awt.geom.Аффинная трансформация
Вы выполняете 2D вращательное преобразование.
Это должно выглядеть примерно так:
xnew = xold*cos(t) - yold*sin(t)
ynew = xold*sin(t) + yold*cos(t)
Угол поворота t, конечно, должен быть в радианах.Оно равно нулю по оси x и увеличивается в направлении против часовой стрелки.
Как старая, так и новая точки должны быть выражены относительно начала координат, вокруг которого вы вращаетесь.