2012-02-09 69 views
1

我知道這不是一個硬性觸發問題,但可悲的是我數學遲緩。沿已知角度繪製已知距離的線

我需要從一個已知的起始點沿已知角度畫一條50像素的線到一個未知的終點。該角度來自起點(400,400)和鼠標點擊;該線需要朝向鼠標點擊繪製,但點擊僅需50個像素。

我已經google'd廣泛,並找到了一些解決方案,但它只是沒有爲我而來。

這是我應得的角度:

float angle = (float) Math.toDegrees(Math.atan2(400 - event.getY(), 400 - event.getX())); 
float angleInDegrees = (angle + 270) % 360; 

「事件」是一個鼠標點擊。

float endX = 250 + 50 * (float)Math.cos(angleInDegrees); 
float endY 250 + 50 * (float)Math.sin(angleInDegrees); 

line.setStartX(400); 
line.setStartY(400); 
line.setEndX(endX); 
line.setEndY(endY); 

的一切,我發現圍繞Math.cos和Math.sin但我仍然沒有得到它。我認爲這個問題與將弧度映射到場景座標有關,但我不確定。所以人們,我以什麼方式愚蠢?我會很感激任何幫助。

回答

3

你甚至不必處理弧度/度數。回到正弦和餘弦的幾何定義:正弦爲,餘弦爲adjacent/hypotenuse。 (「相反」和「相鄰」是指直角三角形的腿分別與您正弦或餘弦的角度相對和相鄰)。

所以:

float opposite = event.getY() - 400; 
float adjacent = event.getX() - 400; 
float hypotenuse = Math.sqrt(opposite*opposite + adjacent*adjacent); 

float cosine = adjacent/hypotenuse; 
float sine = opposite/hypotenuse; 

float endX = 400 + 50 * cosine; 
float endY = 400 + 50 * sine; 
5

我不會打擾角度。您可以使用比率來執行此操作:

int startX = 400; 
int startY = 400; 
int dx = event.getX() - startX; 
int dy = event.getY() - startY; 
float distToTarget = Math.sqrt(dx * dx + dy * dy); 
float ratio = 50/distToTarget; 
int endX = startX + Math.round(ratio * dx); 
int endY = startY + Math.round(ratio * dy); 

然後從(startX,startY)繪製到(endX,endY)。

這裏是發生了什麼事情:

  1. 計算,從(400,400)進入到鼠標點擊的載體(這是(DX,DY))
  2. 規模的載體,因此50個像素長
  3. 輪縮放的載體中,從而它具有整數長度在x和y
  4. 添加縮放的,圓形的矢量(400,400)來計算的結束點
+0

非常感謝!這工作完美。這個答案更有意義,然後與角度混雜。 – user1198765 2012-02-09 04:58:07

1

錯誤在你的代碼是您在使用度,而Math.cosMath.sin需要radians說法。
使用Math.toRadians而不是Math.toDegrees,您的代碼將開始工作。