代码之家  ›  专栏  ›  技术社区  ›  Steve Folly

扇形的二维边界框?

  •  8
  • Steve Folly  · 技术社区  · 15 年前

    我一直在谷歌搜索,直到我的脸是蓝色的,除非我错过了一些非常明显的东西,我找不到任何算法来计算二维扇区的边界框。

    给定封闭圆的中心点、半径和扇形范围的角度,计算该扇形的轴对齐边界矩形的最佳算法是什么?

    3 回复  |  直到 11 年前
        1
  •  15
  •   yairchu    15 年前
    • 生成以下点:
      • 圆的中心
      • 圆上两个半径的位置
      • 圆上除以90的两个角之间的每个角的点 O型 (最多4分)
    • 从上述点计算最小值和最大值x和y。这是你的边界框
        2
  •  8
  •   Glenn    15 年前

    我要重新表述亚尔丘的答案,以便更清楚(对我来说,无论如何)。

    暂时忽略中心坐标并在原点绘制圆。说服自己:

    1. 弧与轴相交的任何地方都是最大值或最小值。
    2. 如果弧不与轴相交,则中心将是边界矩形的一个角,这是唯一的情况。
    3. 要考虑的扇形的唯一其他可能的极限点是半径的端点。

    您现在最多可以找到4+1+2点。找到这些坐标的最大值和最小值来绘制矩形。

    通过将原始圆中心的坐标添加到矩形的坐标中,可以轻松地将矩形转换为原始圆。

        3
  •  2
  •   Regexident Amit Attias    11 年前

    首先,我道歉如果我犯了错误,写作,但英语不是我的第一语言,西班牙语实际上是!

    我面临这个问题,我认为我找到了一个有效的解决办法。

    首先,让我们看看情况的图像

    Graphical situation

    所以我们有一个椭圆(实际上是一个圆)和两个点( C ,请 D )这表明我们的部门。 我们还有一个圆心( B )以及弧的角度 alpha .

    现在,在这种情况下,我让它通过 360º 看它是否有效。

    让我们说 alpha -> -251.1º (它是负的,因为它是顺时针的),让我们把它转换成正值。 360º - 251.1º = 108.9º 现在我们的目标是找到角的平分角,这样我们就可以找到边界框的最大点。( E 在图像中),实际上,正如您可能已经认识到的,段的长度 BE 等于圆的半径,但我们必须有一个角度来获得 e 点。

    所以 108.9º / 2 -> 54.45º 现在我们有了这个角度。

    为了找到e的坐标,我们使用极坐标,所以

    x = r * Cos(theta)
    y = r * Sin(theta)
    

    我们有 r theta 所以我们可以计算x和y

    在我的例子中 r = 2.82 (事实上,这是一个国际性的数字,但为了方便起见,我取了前两位小数)

    我们知道我们的第一个半径是 87.1º 所以西塔会 87.1 - 54.45º -> 32.65º

    我们知道西塔是 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(θ)
    y=r*sin(θ)
    

    所以

    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 
    

    有了这个斜率,我们需要计算切线的方程,基本上就是一个已知斜率的矩形。( m = -1.56 )通过一个已经知道的点( E -> (4.23, 5.76) )

    所以我们有 Y = mx + b 哪里 M=-1.56 ,请 y = 5.76 x = 4.23 所以 b 必须是

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

    现在我们有了切线的完整方程--gt; Y = -1.56X + 12.36 我们所要做的就是把重点突出 C D 在那边。

    我们需要矩形的方程 CH DI 我们来计算一下

    让我们从 中国 :

    我们知道(从切线方程)我们的方向向量是 (1.56, 1)

    我们需要找到一个通过点的矩形 C -> (2, 7.06)

    (x - 2) / 1.56 = (y - 7.06) / 1
    

    做代数-gt; y = 0.64x + 5.78

    我们知道有直肠的方程 中国 我们必须计算点 H .

    我们必须解一个线性系统,如下所示

    y = -1.56x + 12.36
    y = 1.56x + 5.78
    

    解决这个问题,我们会找到问题所在。 H (3, 7.69)

    我们需要对直肠做同样的事情 让我们这样做

    我们的方向向量是 (1.56,1) 再一次

    D -> (4.48, 3.19)
    
    (x - 4.48) / 1.56 = (y -3.19) / 1
    

    做代数-gt; 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)
    

    我为我的回答的范围道歉,但我想尽可能清楚,因此,我几乎一步一步地做了。