问题描述
如果椭圆的长轴是垂直或水平的,那么计算边界框很容易,但是当椭圆被旋转时怎么样?唯一的方法我能想到的是计算周边的所有点并找出最大/最小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,并旋转角度φ。
然后,您可以区分并求解gradient = 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 ]:
$ b $ pre $ code> 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)
$
$ p $ tan $(t)= -tan(PI / 4)/ 2 = -1/2
=>
t = -0.4636 + n * PI
因此我们得到:
pre $ $
$ b code> x = 2 * cos(-0.4636)* cos(PI / 4) - sin(-0.4636)* sin(PI / 4)= 1.5811
$ b $ p
$ $ $ $ $ $ c $ x $ 2 $ cos $ -3.6052 * cos (PI / 4) - sin(-3.6052)* sin(PI / 4)= -1.5811
If the major axis of the ellipse is vertical or horizontal, it's easy to calculate the bounding box, but what about when the ellipse is rotated?
The only way I can think of so far is to calculate all the points around the perimeter and find the max/min x and y values. It seems like there should be a simpler way.
If there's a function (in the mathematical sense) that describes an ellipse at an arbitrary angle, then I could use its derivative to find points where the slope is zero or undefined, but I can't seem to find one.
Edit: to clarify, I need the axis-aligned bounding box, i.e. it should not be rotated with the ellipse, but stay aligned with the x axis so transforming the bounding box won't work.
You could try using the parametrized equations for an ellipse rotated at an arbitrary angle:
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]
...where ellipse has centre (h,k) semimajor axis a and semiminor axis b, and is rotated through angle phi.
You can then differentiate and solve for gradient = 0:
0 = dx/dt = -a*sin(t)*cos(phi) - b*cos(t)*sin(phi)
=>
tan(t) = -b*tan(phi)/a [3]
Which should give you many solutions for t (two of which you are interested in), plug that back into [1] to get your max and min x.
Repeat for [2]:
0 = dy/dt = b*cos(t)*cos(phi) - a*sin(t)*sin(phi)
=>
tan(t) = b*cot(phi)/a [4]
Lets try an example:
Consider an ellipse at (0,0) with a=2, b=1, rotated by 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
We are interested in t = -0.4636 and t = -3.6052
So we get:
x = 2*cos(-0.4636)*cos(PI/4) - sin(-0.4636)*sin(PI/4) = 1.5811
and
x = 2*cos(-3.6052)*cos(PI/4) - sin(-3.6052)*sin(PI/4) = -1.5811
这篇关于如何计算椭圆的轴对齐边界框?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!