2009-08-26 38 views
8

我一直在搜索,直到我在臉上變得藍色,除非我錯過了一些非常明顯的東西,我找不到任何算法來計算2D扇區的邊界框。一個扇區的2D邊界框?

給定圓的中心點,半徑以及扇區範圍的角度,計算該扇區的軸對齊邊界矩形的最佳算法是什麼?

+0

Steve,那麼http://stackoverflow.com/questions/622140/calculate-bounding-box-coordinates-from-a-rotated-rectangle-picture-inside? – 2009-08-26 18:39:43

+0

@Matt:不是我正在尋找的東西,但它確實給了我一些想法。 – 2009-08-26 20:06:16

回答

15
  • 生成以下幾點:
    • 該圓的圓心
    • 兩個半徑的圓上的圓上的該90 劃分兩者之間的所有角度
    • 的點的位置(最大4分)
  • 從上述點計算最小和最大x和y。這是你的邊界框
+0

啊是的。我知道了。謝謝! – 2009-08-26 20:03:20

8

我打算改寫yairchu的答案,以便它更清晰(對我來說,無論如何)。

現在忽略中心座標並在原點繪製圓。說服自己如下:

  1. Anywhere的圓弧相交的軸將是一個最大或最小。
  2. 如果圓弧不與一個軸相交,那麼中心將是邊界矩形的一個角,這是唯一的情況。
  3. 該部門考慮的唯一其他可能的極端點是半徑的端點。

您現在最多隻能找到4 + 1 + 2個點。查找這些座標的最大值和最小值以繪製矩形。

通過將原始圓的中心座標添加到矩形的座標,可以很容易地將矩形轉換爲原始圓。

+1

+1良好的措辭(和推理):) – yairchu 2009-08-26 19:54:21

+1

爲你+1以及格倫。我得到了Yairchu的解釋的主旨,但你確實做得更清楚了。乾杯。 – 2009-08-26 20:05:20

2

首先,我很抱歉如果我寫錯誤,但英語不是我的第一語言,西班牙語其實是!

我遇到了這個問題,我想我找到了一個有效的解決方案。

,首先讓我們來看看情況

Graphical situation

圖像所以我們有一個橢圓形(實際上是一個圓圈)和兩個點(CD),這表明我們的行業。 我們也有我們的圓圈的中心(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) 

我們rtheta,所以我們可以在我的例子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.56y = 5.76x = 4.23所以b必須

b = 5.76 - (-1.56) * 4.23 = 12.36 

現在我們有我們的切線方程齊全 - >Y = -1.56X + 12.36 是,我們必須知道的是項目點CD在那裏。

我們需要爲rects CHDI的方程組,以便讓我們計算「時間

讓我們開始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) 

我對我的回答程度道歉,但我的意思是儘可能明確,因此,我做到了幾乎一步一步來。