首页 文章

一个扇区的2D边界框?

提问于
浏览
8

我用谷歌搜索直到我脸色发青,除非我遗漏了一些非常明显的东西,否则我找不到任何算法来计算2D扇区的边界框 .

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

3 回答

  • 3
    • 生成以下几点:

    • 圆圈的中心

    • 圆上两个半径的位置

    • 两个之间每个角度的圆上的点除以90o(最多4个点)

    • 从上述点计算最小值和最大值x和y . 这是你的边界框

  • 8

    我要改写yairchu的答案,以便更清楚(对我来说,无论如何) .

    暂时忽略中心坐标并在原点绘制圆 . 说服自己以下内容:

    • 弧与轴相交的任何位置都是最大值或最小值 .

    • 如果圆弧不与轴相交,则中心将是边界矩形的一个角,这是唯一的情况 .

    • 该部门唯一需要考虑的其他可能的极点是半径的终点 .

    你现在最多可以找到4 1 2个点 . 找到绘制矩形的坐标的最大值和最小值 .

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

  • 15

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

    我遇到了这个问题,我想我找到了一个有效的解决方案 .

    首先让我们看一下情况的图像

    Graphical situation

    所以我们有一个椭圆(实际上是一个圆圈)和两个点( CD )表示我们的扇区 . 我们还有圆圈的中心( B )和圆弧的角度 alpha .

    现在,在这种情况下,我让它通过porpouse上的 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)
    

    我们有 rtheta 所以我们可以计算x和y

    在我的例子 r = 2.82 ...(实际上它是理性的,但我把前两个十进制数字作为一个容易的事情)

    我们知道我们的第一个半径是 87.1º 所以theta将是 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
    

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

    所以我们有 Y = mx + b 其中 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 的等式,所以让's calculate ' em

    让我们从 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)

    我们需要对rect 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)
    

    我为答案的范围道歉,但我的意思是尽可能清楚,因此,我几乎一步一步地做到了 .

相关问题