2013-10-10 32 views
0

我正在使用Java的Graphics2D庫來繪製各種形狀,並用線條將它們連接在一起。這些行中的一些將需要在行尾的箭頭。這些形狀可以在任何位置,這樣箭頭的角度就會改變。如何旋轉一個點的多邊形

到目前爲止,我的代碼繪製箭頭並旋轉它,除非它沒有在正確的角度或在正確的位置。當我在屏幕周圍移動我的形狀時,箭頭似乎繞着它指向的形狀運行。 (座標X2,Y2)

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大小 - 第一形狀的x和y COORDS - 箭頭除法2.

INT X1,Y1的尺寸。 (形狀的中心)

int y2,x2 - 第二形狀x和y座標。 (形狀的中心)

你可以明白我的意思,這些圖片: Example 1

Example 2

我有一種感覺,我很接近得到這個,因爲它似乎完美地軌道的形狀,這暗示了它並不是以正確的角度或點來旋轉。

+0

您可以在翻譯它之前嘗試旋轉它... – MadProgrammer

+0

'double theta = Math。atan2(dy,dx);'你試過打印這個值嗎? – Cruncher

回答

-1

旋轉與原點(0,0)

讓你有2種方式:在形狀的原點

1.-計算旋轉。

2.-將形狀移動到(0,0)旋轉,然後返回到當前位置。

我現在沒有代碼,但它很容易:)我已經做到了。

1

首先,您需要獲取線條所在的角度,因此首先將線條的起點(接觸頂端框的線條)作爲起點。 角度可以使用這個公式找到:tan(theta)=(y/x) y是你下了多少,x是你到了多少左邊(從原點和左/下都是你的軸方向這是默認的通常是Java進行輸出)

theta = Math.atan(x/y); 

然後您再旋轉角度的三角形的ofcourse偏移得到它在正確的方向:

at.rotate(theta + offset); 

你可以得到通過試驗和錯誤來抵消。 記住COS/SIN /棕褐色採用弧度

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

也應該閱讀方法,如何在Java文檔用於爲AffineTransform @docs

的.rotate(雙角,雙X,雙Y )用於在(x,y)點處旋轉,而不是使用.rotate(雙角度)。 然後只是將三角形翻譯回新點