math - 如何计算椭圆的轴对齐边界框?

标签 math graphics geometry

如果椭圆的长轴是垂直或水平的,那么计算边界框很容易,但是当椭圆旋转时呢?

到目前为止我能想到的唯一方法是计算周长周围的所有点并找到最大/最小 x 和 y 值。看来应该有更简单的方法。

如果有一个函数(在数学意义上)可以描述任意角度的椭圆,那么我可以使用它的导数来找到斜率为零或未定义的点,但我似乎找不到一个。

编辑:澄清一下,我需要轴对齐的边界框,即它不应随椭圆旋转,而应与 x 轴保持对齐,因此变换边界框将不起作用。

最佳答案

您可以尝试使用参数化方程来计算以任意角度旋转的椭圆:

x = h + a*cos(t)*cos(phi) - b*sin(t)*sin(phi)  [1]
y = k + b*sin(t)*cos(phi) + a*cos(t)*sin(phi)  [2]

...其中椭圆具有中心 (h,k) 长半轴 a 和短半轴 b,并旋转角度 phi。

然后您可以微分并求解梯度 = 0:

0 = dx/dt = -a*sin(t)*cos(phi) - b*cos(t)*sin(phi)

=>

tan(t) = -b*tan(phi)/a   [3]

这将为您提供许多 t 的解决方案(您感兴趣的其中两个),将其插回到 [1] 中以获得最大和最小 x。

重复[2]:

0 = dy/dt = b*cos(t)*cos(phi) - a*sin(t)*sin(phi)

=>

tan(t) = b*cot(phi)/a  [4]

让我们尝试一个例子:

考虑 (0,0) 处的椭圆,a=2,b=1,旋转 PI/4:

[1] =>

x = 2*cos(t)*cos(PI/4) - sin(t)*sin(PI/4)

[3] =>

tan(t) = -tan(PI/4)/2 = -1/2

=>

t = -0.4636 + n*PI

我们对 t = -0.4636 和 t = -3.6052 感兴趣

所以我们得到:

x = 2*cos(-0.4636)*cos(PI/4) - sin(-0.4636)*sin(PI/4) = 1.5811

x = 2*cos(-3.6052)*cos(PI/4) - sin(-3.6052)*sin(PI/4) = -1.5811

关于math - 如何计算椭圆的轴对齐边界框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/87734/

相关文章:

math - x86上三角指令的误差是多少?

android - 找不到 FingerPaint 样本

java - 使矩形绕一圈 - Java/Swing

c++ - 如何将光流场(float)映射到像素数据(char)以进行图像变形?

c++ - 3D 点投影到 2D XY 平面

java - 当给定 2 个点和这些点的 asa 时,获取等腰三角形的最后一个角点

algorithm - 如何找到环绕的两个数字的平均值?

math - 补码——如何处理负数?

非原始数简单算术的 Java 注解

Java Swing 图形故障?