2010-10-31 94 views
0

嘿,我想寫一個方法,它需要一個起始笛卡爾座標(x,y)一個角度(以度爲單位),一個長度和多個邊並繪製一個小程序的形狀。到目前爲止,這是我的,但我無法弄清楚我做錯了什麼。我計劃對實際的角度變化使用線變換,這還沒有寫入,但以一個角度繪製線的邏輯應該可行,但並不像我所能說的那樣。我是否可以用一些新的眼光來看待這件事,並告訴我我是否錯過了一些東西。Java 1.5使用線條和角度繪製形狀的問題

public void paint(Graphics g) 
{ 
    g.setColor(Color.BLACK); 
    Point startPt = new Point(0,0); 
    //Function in question 
    drawRegularPolygon(g, startPt, 5,60,50);  
} 

public static void drawRegularPolygon(Graphics g, Point2D startPoint, int numOfSides, int angle, int length) 
{ 

    Point2D current = startPoint; 
    for(int i=0; i<numOfSides; i++) 
    { 
     drawAngularLine(g, current, angle, length); 
     current = getEndPoint(current ,length,angle); 
    } 
} 

public static void drawAngularLine(Graphics g, Point2D startPoint, int angle, int length) 
{ 
    g.setColor(Color.BLACK); 
    Point2D endPoint = getEndPoint(startPoint, length, angle); 
    ((Graphics2D) g).draw(new Line2D.Double(startPoint, endPoint)); 
} 

private static Point2D getEndPoint(Point2D p, int length, int angle) 
{ 
    //Starting point you know (x1, x2), 
    //end point is (x1 + l * cos(ang), y1 + l * sin(ang)) 
    //where l is the length and ang is the angle. 
    Point2D retVal = p; 
    double x = Math.cos(Math.toRadians(angle)*length+p.getX()); 
    double y = Math.sin(Math.toRadians(angle)*length+p.getY()); 
    retVal.setLocation(x,y); 
    return retVal; 
} 
+0

@Ben&Peter:這兩個真的很好的答案,並且對我的數學很有幫助,並且Point2D retVal = p.clone();解決了我的繪圖問題。我給了+1兩個你的答案,但不知道哪一個採取..... – Terrance 2010-11-01 12:17:29

回答

1

一對夫婦的事情。首先是要小心你正在接受罪的/餘弦的。它不是cos(角度*長度),而是長度* cos(角度)。

第二點是想想座標系。假設初始點爲(0,0),然後轉換爲屏幕座標,這可能有助於做數學運算。這有助於避免似乎是顛倒的y軸混亂(值從頂部到底部增加)。

因此,假如我們只是希望這樣的長度,角度從一個標準的右手座標系原點最遠的地方,我們會得到一個觀點:

x1 = length * cos(angle) 
y1 = length * sin(angle) 

但由於負-Y到了,我們真正想要的

x2 = length * cos(angle) 
y2 = -length * sin(angle) 

在腦子裏檢查這一點,那你在原點(0,0),這是在左上做這個數學的畫面,並具有45°的角度。如果y2是正數,我們最終會看到一個對我們來說像-45°的角度。

現在起源轉化爲我們的出發點(X_I,Y_I),讓我們的最終值:

x_f = x_i + length * cos(angle) 
y_f = y_i + (-length * cos(angle)) = y_i - length * cos(angle) 

或者,如果它更有意義的標準右手座標系統開始工作,你或許可以像做(0,0)在中心那樣做數學運算,然後應用一個平移和一個y軸鏡像轉換,但是這個屏幕座標系一旦得到就不太困難用於翻轉y值。

+0

總的來說,非常深入的答案。很好的解釋...感謝您的幫助。 – Terrance 2010-11-01 14:04:15

1

您正在繪製一條具有相同起點和終點的線 - 因此不繪製任何東西。

Java對象是通過引用傳遞,所以:

private static Point2D getEndPoint(Point2D p, int length, int angle){ 
    Point2D retVal = p; 
    retVal.setLocation(x,y); 
    return retVal; 
} 

也在發生變化的起點p。所以它繪製了一條長度爲1的線(它是否在屏幕上顯示一個點?)。

嘗試使用:

Point2D retVal = p.clone(); 
+0

感謝您的幫助。我很欣賞這些意見。 – Terrance 2010-11-01 14:03:44