我一直在搜索,直到我在臉上變得藍色,除非我錯過了一些非常明顯的東西,我找不到任何算法來計算2D扇區的邊界框。一個扇區的2D邊界框?
給定圓的中心點,半徑以及扇區範圍的角度,計算該扇區的軸對齊邊界矩形的最佳算法是什麼?
我一直在搜索,直到我在臉上變得藍色,除非我錯過了一些非常明顯的東西,我找不到任何算法來計算2D扇區的邊界框。一個扇區的2D邊界框?
給定圓的中心點,半徑以及扇區範圍的角度,計算該扇區的軸對齊邊界矩形的最佳算法是什麼?
啊是的。我知道了。謝謝! – 2009-08-26 20:03:20
我打算改寫yairchu的答案,以便它更清晰(對我來說,無論如何)。
現在忽略中心座標並在原點繪製圓。說服自己如下:
您現在最多隻能找到4 + 1 + 2個點。查找這些座標的最大值和最小值以繪製矩形。
通過將原始圓的中心座標添加到矩形的座標,可以很容易地將矩形轉換爲原始圓。
+1良好的措辭(和推理):) – yairchu 2009-08-26 19:54:21
爲你+1以及格倫。我得到了Yairchu的解釋的主旨,但你確實做得更清楚了。乾杯。 – 2009-08-26 20:05:20
首先,我很抱歉如果我寫錯誤,但英語不是我的第一語言,西班牙語其實是!
我遇到了這個問題,我想我找到了一個有效的解決方案。
,首先讓我們來看看情況
圖像所以我們有一個橢圓形(實際上是一個圓圈)和兩個點(C
,D
),這表明我們的行業。 我們也有我們的圓圈的中心(B
)和圓弧的角度alpha
。
現在,在這種情況下,我通過了porpouse上的360º
來查看它是否可行。
比方說alpha -> -251.1º
(其負面導致其順時針),讓在它轉換爲正值360º - 251.1º = 108.9º
我們現在的目標是要找到角的平分的角度,我們可以找到邊框的最大點(E
圖像),實際上你可能已經意識到,線段BE
的長度等於圓的半徑,但我們必須有角度才能獲得點的實際座標。因此108.9º/2 -> 54.45º
現在我們有角度。
爲了找到E的座標,我們用極座標,以便
x = r * Cos(theta)
y = r * Sin(theta)
我們r
和theta
,所以我們可以在我的例子r = 2.82
計算x和y
...(其實這是irational但我還是把前兩位十進制數字作爲緩解)
我們知道我們的第一個半徑是87.1º
sota會是87.1 - 54.45º -> 32.65º
我們知道* THETA *爲32.65º
讓我們做一些數學
x = 2.82 * Cos(32.65º) -> 2.37552
y = 2.82 * Sin(32.65º) -> 1.52213
現在我們需要將這些值調整到圈子中,以便
x = x + centerX
y = y + centerY
的實際中心在這個例子中,圓被集中在(1.86, 4.24)
x -> 4.23552
y -> 5.76213
在這個階段我們應該使用一些微積分。我們知道邊界框的一條邊將是通過我們剛剛計算的點的弧的切線,讓我們找到該切線(紅線)。
我們知道切線通過我們的點(4.23, 5.76)
現在我們需要一個斜率。
正如您所看到的,斜率與通過我們的半徑的矩形的斜率相同,所以我們必須找到該斜率。
爲此,我們需要獲取半徑座標(從極座標快速轉換爲直角座標)。
x = r * Cos(theta)
y = r * Sin(theta)
所以
p0 = (centerX + 2.82 * Cos(87.1º), centerY + 2.82 * Sin(87.1º))
p1 = (centerX + 2.82 * Cos(-21.8º), centerY + 2.82 * Sin(-21.8º))
(21.8º
是從水平軸順時針測得的到低於它的半徑的角度,因此我把它負)
p0 (2, 7.06)
p1 (4.48, 3.19)
現在讓我們找到斜率:
m = (y - y0)/(x - x0)
...
m = (3.19 - 7.06)/(4.48-2) = -3.87/2.48 = -1.56048
...
m = -1.56
有我們需要計算的切線方程的斜率,基本上是通過一個已經知道點(E -> (4.23, 5.76)
)
所以我們Y = mx + b
傳遞一個已知斜率(m = -1.56
)一個矩形,其中m = -1.56
,y = 5.76
和x = 4.23
所以b
必須
b = 5.76 - (-1.56) * 4.23 = 12.36
現在我們有我們的切線方程齊全 - >Y = -1.56X + 12.36
是,我們必須知道的是項目點C
和D
在那裏。
我們需要爲rects CH
和DI
的方程組,以便讓我們計算「時間
讓我們開始CH
:
我們知道(從tanget方程),我們的方向向量是(1.56, 1)
我們需要找到一個通過點的矩形C -> (2, 7.06)
(x - 2)/1.56 = (y - 7.06)/1
做一些代數 - >y = 0.64x + 5.78
我們知道必須爲矩形CH
方程,我們必須計算點H
。
我們必須求解線性方程如下
y = -1.56x + 12.36
y = 1.56x + 5.78
解決這一點,我們會發現點H (3, 7.69)
我們需要做相同的矩形DI
所以讓我們做吧
我們的方向矢量是(1.56, 1)
再次
D -> (4.48, 3.19)
(x - 4.48)/1.56 = (y -3.19)/1
做一些代數 - >y = 0.64x + 0.32
讓求解線性系統
y = -1.56x + 12.36
y = 0.64x + 0.32
I (5.47, 3.82)
在這個階段,我們已經擁有了四點,使我們的邊界框 - >C, H, D , I
以防萬一你不不知道或記住如何解決編程語言的線性系統,我給你一個小例子
這是純代數
比方說,我們有以下系統
Ax + By = C
Dx + Ey = F
然後
Dx = F - Ey
x = (F - Ey)/D
x = F/D - (E/D)y
更換另方程式
A(F/D - (E/D)y) + By = C
AF/D - (AE/D)y + By = C
(AE/D)y + By = C - AF/D
y(-AE/D + B) = C - AF/D
y = (C - AF/D)/(-AE/D + B)
= ((CD - AF)/D)/((-AE + BD)/D))
所以
y = (CD - AF)/(BD - AE)
和x
我們做同樣的
Dx = F - Ey
Dx - F = -Ey
Ey = F - Dx
y = F/E - (D/E)x
更換另方程式
Ax + B(F/E - (D/E)x) = C
Ax + (BF/E - (DB/E)x) = C
Ax - (DB/E)x = C - BF/E
x (A-(DB/E)) = C - BF/E
x = (C - BF/E)/(A-(DB/E))
= ((CE - BF)/E)/((AE-DB)/E)
x = (CE - BF)/(AE - DB)
我對我的回答程度道歉,但我的意思是儘可能明確,因此,我做到了幾乎一步一步來。
Steve,那麼http://stackoverflow.com/questions/622140/calculate-bounding-box-coordinates-from-a-rotated-rectangle-picture-inside? – 2009-08-26 18:39:43
@Matt:不是我正在尋找的東西,但它確實給了我一些想法。 – 2009-08-26 20:06:16