2012-02-03 47 views
0

以下是我正在嘗試爲我的遊戲解決的問題。定位包含直線和圓的交點的控件?

我有這樣的場景: enter image description here

我試圖解決綠色矩形的位置和大小。圓圈在屏幕的50%和40%處,其半徑與屏幕的高度成正比。

綠色矩形必須始終距離底部10個像素。它的左角也必須遠離10個像素。從圖像中可以看出,從右上角到矩形接觸圓的距離也是10像素。

另一個約束是綠色矩形必須總是比其高度(高寬比)寬3倍。

鑑於這些限制,我該如何解決綠色矩形的位置和大小?

基本上,遊戲窗口可以有一堆不同的縱橫比,所以在這些情況下,綠色的矩形必須看起來不錯。

我不一定在尋找代碼,但只是一個關於如何解決這個問題的想法。

感謝

+0

這是一個三角問題,而不是算法問題。您可能希望將其遷移到Math。 – templatetypedef 2012-02-03 01:42:47

回答

2

在這些情況下要做的事情是在數學上描述約束,並看看它是否簡化。這是幾何處理的基本技能。

我們假設圖像區域的左下角是(0,0)。這將矩形的左下角放在(10,10);我們將調用右上角(x1,y1)。我假設你已經計算出圓的位置,因爲這非常簡單,我們稱之爲中心(x2,y2)和半徑r。

第一個約束:矩形比高度寬3倍。

x1-10 = 3 * (y1-10) or x1 = 3 * (y1-10) + 10 or x1 = 3*y1 - 20 

第二個約束:x1,y1位於離圓圈10個像素處。如果我們描述另一個比第一個大10個像素的圓圈,那麼這個點就會在它上面。

(x1-x2)^2 + (y1-y2)^2 = (r+10)^2 

爲代X1:

(3*y1 - 20 - x2)^2 + (y1-y2)^2 = (r+10)^2 

這是偉大的,因爲R,X 2,和y2是已知的;唯一未知的剩餘是y1。我們來看看能不能把所有的y1都收集起來。

(3*y1 + (-20 - x2))^2 + (y1-y2)^2 = (r+10)^2 
3^2*y1^2 + 2*(3*y1*(-20-x2) + (-20-x2)^2 + y1^2 + 2*y1*-y2 + y2^2 = (r+10)^2 
3^2*y1^2 + y1^2 + 6*(-20-x2)*y1 + 2*-y2*y1 + y2^2 = (r+10)^2 
(3^2+1)*y1^2 + (-120 - 6*x2 - 2*y2)*y1 + y2^2 = (r+10)^2 

在這一點上它看起來幾乎像一個二次方程。多一點小調整:

10 * y1^2 + (-120 - 6*x2 - 2*y2) * y1 + (y2^2 - (r+10)^2) = 0 

最後一步是應用Quadratic Formula

a*y1^2 + b*y1 + c = 0 
a = 10 
b = (-120 - 6*x2 - 2*y2) 
c = (y2^2 - (r+10)^2) 
y1 = (-b +/- sqrt(b^2 - 4*a*c))/2*a 

有從二次方程兩個可能的答案,但其中一人將放在矩形圓上的那一邊。消除這種情況應該很容易。

+0

「如果我們描述另一個比第一個大10個像素的圓圈,這個點就會落在它上面。」真?矩形頂部的水平線與圓的半徑不重合......或者我錯過了什麼? (我認爲你想改變10像素左邊的圓圈,而不是增加它的半徑) – Nemo 2012-02-03 06:02:34

+1

@Nemo,我沒有想到水平距離真的是這裏所要求的 - 它會給出一個不一致的總距離,取決於你相交的部分曲線。在被這個問題所取代之前,我也看到了問題的原始陳述。 – 2012-02-03 13:52:10

0

你有什麼有一個經典的圓線交點的問題。你知道線上的一個點 - 矩形的左下角。你知道線的斜率(從長寬比)。你相交的圓圈可以是你的紅色圓圈向左移動10來給你10個像素的差距。交點將是所需矩形的右上角。這對於一個想法應該足夠了。