首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何计算椭圆的轴线对齐包围框?

如何计算椭圆的轴线对齐包围框?
EN

Stack Overflow用户
提问于 2017-12-26 08:47:05
回答 6查看 0关注 0票数 0

如果椭圆的主轴是垂直的或水平的,那么计算包围框就容易了,但是当椭圆旋转时呢?

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

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

注意,我需要轴对齐包围框,即它不应该旋转与椭圆,但保持与x轴对齐,所以转换包围框将无法工作。

EN

回答 6

Stack Overflow用户

发布于 2017-12-26 12:51:58

你可以试着用参数化的方程来表示一个椭圆在任意角度旋转:

代码语言:javascript
复制
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进行区分和求解:

代码语言:javascript
复制
0 = dx/dt = -a*sin(t)*cos(phi) - b*cos(t)*sin(phi)

=>

代码语言:javascript
复制
tan(t) = -b*tan(phi)/a   [3]

这应该给你很多的解决方案,把它插回[1]得到你的最大和最小的x。

重复二:

代码语言:javascript
复制
0 = dy/dt = b*cos(t)*cos(phi) - a*sin(t)*sin(phi)

=>

代码语言:javascript
复制
tan(t) = b*cot(phi)/a  [4]

让我们尝试一个例子:

假设在(0,0)处有一个椭圆,a=2,b=1,由PI/4旋转:

一=>

代码语言:javascript
复制
x = 2*cos(t)*cos(PI/4) - sin(t)*sin(PI/4)

三=>

代码语言:javascript
复制
tan(t) = -tan(PI/4)/2 = -1/2

=>

代码语言:javascript
复制
t = -0.4636 + n*PI

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

所以我们得到:

代码语言:javascript
复制
x = 2*cos(-0.4636)*cos(PI/4) - sin(-0.4636)*sin(PI/4) = 1.5811

and

代码语言:javascript
复制
x = 2*cos(-3.6052)*cos(PI/4) - sin(-3.6052)*sin(PI/4) = -1.5811
票数 0
EN

Stack Overflow用户

发布于 2017-12-26 14:12:41

我找到了一个简单的公式http://www.iquilezles.org/www/articles/ellipses/ellipses.htm

我大致是这样实现的:

代码语言:javascript
复制
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);
票数 0
EN

Stack Overflow用户

发布于 2017-12-26 15:23:11

我认为最有用的公式是这个。一个从原点的角度旋转的省略体具有如下方程:

二次

[图片]
[图片]

二次

二次

[图片]
[图片]

二次

其中(h,k)是中心,a和b是长轴和长轴的大小,t从-pi到pi各不相同。

由此,您应该能够导出tdx/dt或dy/dt为0的数据。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100000021

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档