2010-08-21 117 views
28

比方說,我有一個(x,y)對於一條線的開始點總是一樣的,而一個(x,y)對於同一個終點的點線。該行也總是40px長。在程序開始時,線條始於垂直方向(讓它稱爲0度)。基於用戶輸入,我需要通過僅更改結束點(x,y)來重新繪製從原點開始的特定度數。深思在Java中以特定角度畫一條線

一些食物,如果你需要它:

我在一個發情試圖計算出這一點,並使其在Java中工作很。我可以根據圓弧段的弧長計算點的數學工作,但我不知道如何讓Java做到這一點。

我認爲基於三角形角度會更容易,因爲我總是會知道三角形的兩邊的長度(一邊是由40px長的線形成的,另一邊是由該線的起點形成的另一邊和JPanel的邊界)以及這兩條線形成的角度。儘管如此,我的大腦卻很難找出答案。任何幫助將非常感激。

UPDATE:

@casablanca讓我在正確的軌道上。我刷了我的trig函數,這是我如何使它工作。

首先,我沒有意識到90度是直線上升的,但是一旦我意識到我讓我的解決方案反映了這一事實。我從畫面底部的中心開始畫出我的線條。由於我的用戶給出的角度小於90度時,三角形的opposite一側位於屏幕的右側,而當我的用戶給出的角度大於90度時,屏幕的左側是我的爲了說明這一點,我調整了公式,因此我有四種方法,一種用於屏幕左側的x座標(當用戶給定的角度大於90度時),一個用於座標左側的y (當用戶給定角度大於90度時),當用戶給定角度時,屏幕右側的相同物品小於90度。所有方法中的int length是斜邊的長度。 再次感謝您的幫助@casablanca!

public double leftSideX(double angle, int length){ 
    double x = frameWidth/2 - (length * Math.cos(Math.toRadians(90-(Math.toDegrees(angle)-90)))); 
    return x; 
} 

public double leftSideY(double angle, int length){ 
    double y = frameHeight - (length * Math.sin(Math.toRadians(90-(Math.toDegrees(angle)-90)))); 
    return y; 
} 

public double rightSideX(double angle, int length){ 
    double x = frameWidth/2 + (length * Math.cos(angle)); 
    return x; 
} 

public double rightSideY(double angle, int length){ 
    double y = frameHeight - (length * Math.sin(angle)); 
    return y; 
} 
+0

也可以考慮改變圖形上下文的變換,如下所示:http://stackoverflow.com/questions/3420651 – trashgod 2010-08-21 15:18:59

+0

你可能要考慮這個封裝班級中的功能;例如的Vector2D。這樣你就可以用x和y座標或者長度和角度來構造一個Vector2D,並提供諸如getMagnitude(),getAngle(),getX(),getY(),rotateClockwise(double)等方法。 – Adamski 2010-08-22 21:22:48

+0

喜歡,但我認爲這有點超出我現在的能力。我花了將近一整天的時間才弄明白這一點:) – ubiquibacon 2010-08-22 21:28:02

回答

64

這是你在找什麼?

startX = x; 
startY = y; 
endX = x + 40 * Math.sin(angle); 
endY = y + 40 * Math.cos(angle); 

和借鑑(startx的,startY)至(endX,恩迪)在你使用任何API線。

另請注意,angle以弧度表示。如果您在度有了它,你需要先將其轉換:

angle = angle * Math.PI/180; 
+1

我希望上帝不是那麼簡單,但如果是這樣,你會在聖誕節期間得到水果蛋糕!雖然我現在太累了,但現在還是試一試,但早上第一件事......感謝您的快速回復! – ubiquibacon 2010-08-21 05:28:30

+1

@Jim Lewis:實際上trig的慣例是相反的。我把它切換,因爲OP想要0度是垂直的:'sin 0 = 0'所以'endX = x'和'cos 0 = 1'所以'endY = y + 40'。 – casablanca 2010-08-21 14:46:48

+0

@casablanca:D'oh!當然你是對的......也許我應該在週五晚上不再評論數學職位。 – 2010-08-21 16:49:00