2016-02-26 44 views
0

我在每個屏幕邊緣都有一些固定位置的圖像,我想找到一種方法能夠正確指向它們,以及MouseMoved提供的新鼠標點以及這2點和角度我可以畫出一條到達屏幕末端的線,但不幸的是我無法在圖像上正確顯示該線條點如何繪製正確指向屏幕角落圖像的線條

+0

所以,如果你看到你到達屏幕的結束,你調整隻是一個座標,而不是其他? – RealSkeptic

+0

@RealSkeptic屏幕邊緣只是衆多案例中的一個,事情是我不明白爲什麼它會這樣做,而我在數學上真的很虛弱 – Sherif

+0

因此,隨着使用的移動,鼠標想要確定它們所關閉的點和點到那個? – MadProgrammer

回答

1

您的程序正在嘗試做的是:

  1. 找到該線應該有的角度。
  2. 首先假定線條將會非常長,以至於它穿過矩形的邊緣。
  3. 然後在交叉點切斷它。

例如,假設矩形是180乘120,角度是45度。尺寸較大是180,所以你在該角度畫一條線長度180的:

Illustration of that situation

所以要剪切線其中箭頭是。您的newXnewY都在框架之外。根據你的程序的邏輯,你會發現newX大於1750,所以你把它切成180(在我的例子中最大幀數)。而newY的值大於850,所以你把它切成120(在我的例子中矩形的最大值Y)。

這意味着幾乎總是會以行結束爲(180,120)而不是箭頭所在的位置。這是因爲您只調整了一個座標,但在繼續之前未找到對應的Y座標。

基本上,當您將newX減少到getWidth() - 100時,您還需要找到與它一致並且位於同一行的Y.所以你需要再次計算Y.相反的:

if (newX > 1720) 
    { 
     newX = getWidth() - 100; 
    } 

你需要有

if (newX > 1720) 
    { 
     newX = getWidth() - 100; 
     newY = Math.round(oldY + (newX - oldX)*Math.tan(angle)); 
    } 

newY新值可能仍是外面的矩形。事實上,新的觀點是:

New point that was calculated

所以,現在你將調整Y的值 - 但是,你要小心,並根據同一X的值相匹配是Y角度。

但要小心:該方法不是很好開始。以Math.max(getWidth(), getHeight())作爲線路的起始長度僅適用於某些點。但是如果你的觀點靠近一個角落而另一個角落靠近對角?矩形的對角線比寬度和高度都長。所以你會得到一條太短的線,不會到達邊緣。

你可以計算出對角線,而不是max,但也許你應該採取不同的方法:

  1. 計算該行的線性公式(任何線爲y=ax+b)。
  2. 計算Y表示x=100x=width-100
  3. 計算X爲y=100y=height-100
  4. 現在你有四對X和Y,找出其中的一個是正確的。只有兩個將在框架內,只有其中一個是在正確的方向。

    實際上,你不需要計算四點。如果鼠標事件中的原始newX位於oldX的右側,則只能計算右邊的公式。左邊不感興趣。如果它在左邊,則只在左邊計算。如果鼠標事件中的原始newY低於oldY,則只計算下邊緣處的公式,並且如果它較高,則只在頂邊處計算。你會得到兩點。其中只有一個是「合法的」(x和y都在矩形中),然後使用它。

Calculating from the edges

+0

非常感謝,當我刪除那些如果條件指向看起來不錯。 – Sherif