2013-10-10 4 views
0

Я использую библиотеки Graphics2D от Java, чтобы рисовать различные фигуры с помощью линий, соединяющих их вместе. Некоторым из этих строк понадобится стрелка в конце строки. Формы могут находиться в любом положении, чтобы угол стрелки изменился.Как повернуть многоугольник около точки

Пока мой код рисует стрелку и вращает ее, за исключением того, что она не находится под прямым углом или в правильном месте. Когда я перемещаю фигуры вокруг экрана, стрелка появляется на орбиту формы, на которую он указывает. (Коорд х2, у2)

private static void drawArrow(Graphics2D g, int size, int x1, int y1, int x2, int y2) { 
    double dx = x2 - x1, dy = y2 - y1; 
    double theta = Math.atan2(dy, dx); 
    AffineTransform at = AffineTransform.getTranslateInstance(x2, y2); 
    Polygon p = new Polygon(); 
    p.addPoint(0, 0); 
    p.addPoint(size, 0 - size); 
    p.addPoint(0 - size, 0 - size); 
    at.rotate(theta, x2, y2); 
    java.awt.Shape shape = at.createTransformedShape(p); 
    g.fill(shape); 
} 

INT размер - размер стрелки делят 2.

INT x1, y1 - первые формы х и у Coords. (центр формы)

int y2, x2 - вторая фигура x и y координаты. (Центр формы)

Вы можете увидеть, что я имею в виду в этих картинах: Example 1

Example 2

У меня есть чувство, что я близок к тому это, потому что, кажется, орбитальное форму идеально, который говорит мне, что он просто не вращается под прямым углом или точкой.

+0

Вы можете попробовать и повернуть его, прежде чем перевести его ... – MadProgrammer

+0

'double theta = Math.atan2 (dy, dx); 'вы пробовали распечатать это значение? – Cruncher

ответ

-1

Вращение производится с началом (0,0)

У вас есть 2 пути:

1.- вращение Calculate в происхождении формы.

2.- Переместите фигуру в положение (0,0), а затем вернитесь в текущее местоположение.

У меня нет кода прямо сейчас, но это легко :) Я уже делаю это.

1

Прежде всего, вам нужно получить угол, на котором находится линия, поэтому начните, отметив начало линии (прикосновение к верхнему боксу) в качестве источника. Угол может быть найден с использованием этой формулы: tan (theta) = (y/x) y, насколько вы спустились, x, насколько вы шли влево (как из начала, так и слева/вниз, являясь вашим направление оси, который по умолчанию, как правило, в Java для выходов)

theta = Math.atan(x/y); 

затем применить угол поворота к вашему треугольнику со смещением конечно, чтобы получить его в правильном направлении:

at.rotate(theta + offset); 

вы можете получить смещение методом проб и ошибок. Имейте в виду, соз/SIN/TAn использовать радианах

Math.toRadians(double angleInDegrees) 
Math.toDegrees(double angleInRadians) 

также следует читать, как методы используются на ява документы для AffineTransform @docs

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

Смежные вопросы