Математическая справка - Не могу что-то повернуть (знание Java было бы плюсом)

StackOverflow https://stackoverflow.com/questions/576162

  •  05-09-2019
  •  | 
  •  

Вопрос

Хорошо, я пытаюсь повернуть 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 и увеличивается в направлении против часовой стрелки.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top