如果椭圆的主轴是垂直的或水平的,那么计算包围框就容易了,但是当椭圆旋转时呢?
到目前为止,我唯一能想到的方法是计算周长周围的所有点,并找到最大值/最小x和y值。似乎应该有更简单的方法。
如果有一个函数(在数学意义上)描述一个任意角度的椭圆,那么我可以用它的导数来找出斜率为零或未定义的点,但我似乎找不到。
注意,我需要轴对齐包围框,即它不应该旋转与椭圆,但保持与x轴对齐,所以转换包围框将无法工作。
发布于 2017-12-26 12:51:58
你可以试着用参数化的方程来表示一个椭圆在任意角度旋转:
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]
这应该给你很多的解决方案,把它插回[1]得到你的最大和最小的x。
重复二:
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旋转:
一=>
x = 2*cos(t)*cos(PI/4) - sin(t)*sin(PI/4)
三=>
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
and
x = 2*cos(-3.6052)*cos(PI/4) - sin(-3.6052)*sin(PI/4) = -1.5811
发布于 2017-12-26 14:12:41
我找到了一个简单的公式http://www.iquilezles.org/www/articles/ellipses/ellipses.htm
我大致是这样实现的:
num ux = ellipse.r1 * cos(ellipse.phi);
num uy = ellipse.r1 * sin(ellipse.phi);
num vx = ellipse.r2 * cos(ellipse.phi+PI/2);
num vy = ellipse.r2 * sin(ellipse.phi+PI/2);
num bbox_halfwidth = sqrt(ux*ux + vx*vx);
num bbox_halfheight = sqrt(uy*uy + vy*vy);
Point bbox_ul_corner = new Point(ellipse.center.x - bbox_halfwidth,
ellipse.center.y - bbox_halfheight);
Point bbox_br_corner = new Point(ellipse.center.x + bbox_halfwidth,
ellipse.center.y + bbox_halfheight);
发布于 2017-12-26 15:23:11
我认为最有用的公式是这个。一个从原点的角度旋转的省略体具有如下方程:
二次
二次
二次
二次
其中(h,k)是中心,a和b是长轴和长轴的大小,t从-pi到pi各不相同。
由此,您应该能够导出tdx/dt或dy/dt为0的数据。
https://stackoverflow.com/questions/-100000021
复制相似问题