2017-02-13 32 views
1

Я создаю базовую 2D-игру, и в настоящее время я пытаюсь получить x и y (Point) всех углов прямоугольника, пока я поворачиваю прямоугольник.Получение точки углов прямоугольника на экране во время вращения

private static Graphics2D drawRect(Graphics2D g) 
{ 
    Rectangle rect = new Rectangle(350,350,75,75); 
    AffineTransform transform = new AffineTransform(); 
    transform.rotate(Math.toRadians(rotation), rect.getX() + rect.width/2, rect.getY() + rect.height/2); 
    AffineTransform old = g.getTransform(); 
    g.transform(transform); 

    g.fill(rect); 
    if(z >= 1000) 
    { 
     // here I am asking it to print out the x,y of the point at the top left of the rectangle 
     System.out.println(rect.getX() + " : " + rect.getY() + " : " + rotation); 
     z = 0; 
    } 
    g.setTransform(old); 
    z++; 
    return g; 
} 

При запуске этого начинается при 350, 350, как показано, и будет вращаться в любом направлении в зависимости от того, как я увеличить его. Он правильно вращается по графике. Но когда я хочу напечатать точку x, y исходной верхней левой точки, она всегда возвращается с 350, 350. Если я поверну ее на 45 градусов в положительном направлении, она вернет 350, 350. Я сделал функцию щелчка поэтому я могу щелкнуть по экрану и правильно вернуть x и y точки щелчка. Когда я нажимаю на исходный верхний левый угол прямоугольника, он возвращает 311,334. Это результат, который я ищу при вычислении верхнего левого угла x, y. Визуальная здесь:

picture of before rotation

picture of after rotation

+0

Там, наверное, действительно аккуратный способ сделать это, но на основе того, что (мало) Я знаю, я знаю, что могу вычислить угол между двумя точками, поэтому, учитывая центральную точку прямоугольника и верхний/левый угол прямоугольника, я могу вычислить угол, это представляет собой смещение. Я знаю, что могу вычислить точку на круге, учитывая угол и радиус. Таким образом, если предположить, что радиус является самой длинной длиной прямоугольника, плюс ваш введенный угол и угол смещения, вы должны иметь возможность рассчитать новое положение x/y верхнего/левого угла – MadProgrammer

ответ

2

Вы прикладывая ваш преобразование графического объекта. Следовательно, сам объект прямоугольника не изменяется.

AffineTransform имеет два способа, которыми вы можете воспользоваться. createTransformedShape который возвращает новую форму, которая преобразуется соответствующим образом или transform(Point2D ptSrc, Point2D ptDst), который преобразует точку ptSrc и сохранить преобразованные точки в ptDst:

Point rotatedPoint = new Point(); 
transform.transform(new Point(rect.x, rect.y), rotatedPoint); 
+1

Это правильная идея, но ;), 'Rectangle # getX/Y' возвращает' Double', а 'Point' ожидает' int', вы можете использовать 'Point2D.Double' (что, вероятно, предпочтительнее) или' Rectangle # x/y', но, +1 для обучения мне что-то новое и аккуратное;) – MadProgrammer

+0

Спасибо, человек, работает как шарм и возвращает правильную точку x, y. <3 –