如果椭圆的长轴是垂直的或水平的,那么很容易计算边界框,但是当椭圆旋转时呢?
到目前为止,我能想到的唯一方法是计算周边的所有点并找到最大/最小x和y值 . 似乎应该有一个更简单的方法 .
如果有一个函数(在数学意义上)描述了一个任意角度的椭圆,那么我可以用它的导数来找到斜率为零或未定义的点,但我似乎无法找到一个 .
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.
9 回答
我认为最有用的公式就是这个 . 从原点的角度phi旋转的省略号具有以下等式:
其中(h,k)是中心,a和b是长轴和短轴的大小,t是从-pi到pi的变化 .
从那里,您应该能够推导出哪个t dx / dt或dy / dt变为0 .
Brilian Johan Nilsson . 我已将您的代码转录为c# - ellipseAngle现在为度数:
您可以尝试将参数化方程用于以任意角度旋转的椭圆:
...其中椭圆具有中心(h,k)半长轴a和半短轴b,并且通过角度phi旋转 .
然后,您可以区分并求解gradient = 0:
=>
哪个应该为你提供很多解决方案(其中两个你感兴趣),将其插回[1]以获得你的最大和最小x .
重复[2]:
=>
Lets try an example:
考虑(0,0)处的椭圆,a = 2,b = 1,按PI / 4旋转:
[1] =>
[3] =>
=>
我们对t = -0.4636和t = -3.6052感兴趣
所以我们得到:
和
我在http://www.iquilezles.org/www/articles/ellipses/ellipses.htm找到了一个简单的公式(并忽略了z轴) .
我大致这样实现它:
这是相对简单的,但有点难以解释,因为你没有给我们你代表椭圆的方式 . 有很多方法可以做到这一点..
无论如何,一般原理是这样的:你不能直接计算轴对齐的边界框 . 但是,您可以将x和y中椭圆的极值计算为2D空间中的点 .
为此,采用方程x(t)= ellipse_equation(t)和y(t)= ellipse_equation(t)就足够了 . 获取它的第一个订单派生并解决它的根 . 因为我们正在处理基于三角函数的椭圆,这是直截了当的 . 你应该得到一个方程式,通过atan,acos或asin得到根 .
提示:要检查你的代码,请尝试使用未旋转的椭圆:你应该得到0,Pi / 2,Pi和3 * Pi / 2的根 .
对每个轴(x和y)执行此操作 . 您将获得最多四个根(如果您的椭圆退化,则更少,例如,其中一个半径为零) . 评估根部的位置,得到椭圆的所有极值点 .
现在你快到了 . 获取椭圆的边界框就像扫描这四个点的xmin,xmax,ymin和ymax一样简单 .
顺便说一句 - 如果您在找到椭圆方程时遇到问题:尝试将其缩小到具有轴对齐椭圆的情况,该椭圆具有中心,两个半径和围绕中心的旋转角度 .
如果这样做,方程式变为:
如果椭圆由其 foci and eccentricity 给出,则给出该情况的公式(对于由轴长度,中心和角度给出的情况,参见例如用户1789690的答案) .
也就是说,如果焦点是(x0,y0)和(x1,y1)并且偏心率是e,那么
哪里
我从用户1789690和Johan Nilsson的答案中得出了公式 .
如果使用OpenCV / C并使用
cv::fitEllipse(..)
函数,则可能需要对椭圆的矩形进行边界处理 . 在这里,我使用迈克的答案做了一个解决方案:此代码基于上面贡献的代码user1789690,但在Delphi中实现 . 我测试了这个,据我所知,它完美无缺 . 我花了一整天时间搜索一个算法或一些代码,测试了一些不起作用的代码,我很高兴终于找到了上面的代码 . 我希望有人觉得这很有用 . 此代码将计算旋转椭圆的边界框 . 边界框是轴对齐的,不随椭圆旋转 . 半径是在旋转之前的椭圆 .
这是我的功能,用于找到任意方向的椭圆形紧密拟合矩形
我有opencv rect和实现点:
cg - 椭圆的中心
尺寸 - 椭圆的主要,短轴
角度 - 椭圆的方向