在這些情況下要做的事情是在數學上描述約束,並看看它是否簡化。這是幾何處理的基本技能。
我們假設圖像區域的左下角是(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
有從二次方程兩個可能的答案,但其中一人將放在矩形圓上的那一邊。消除這種情況應該很容易。
這是一個三角問題,而不是算法問題。您可能希望將其遷移到Math。 – templatetypedef 2012-02-03 01:42:47