【问题标题】:How to find the 4 angles from center of a rotated ellipse to it 4 extermaties如何找到从旋转椭圆中心到它的 4 个角度 4 extermaties
【发布时间】:2018-05-23 10:54:36
【问题描述】:

我正在尝试找到一种算法来导出从旋转椭圆的中心到其末端的 4 个角度。也就是说,从中心到边界框与椭圆的直线相接触的点。

我已经弄清楚了如何使用以下方法获取边界框:

leftX/rightX  =  h± sqrt(a*a*cos(PI)*cos(PI) + b*b*sin(PI)*sin(PI))
topY/bottomY  =  k± sqrt(a*a*sin(PI)*sin(PI) + b*b*cos(PI)*cos(PI))

上面给了我边界框和:

左右点的x

顶点和底部的y

但我需要左右点的 x 和 y 以及顶部和底部的 x 和 y 来计算角度。 p>

我觉得我错过了一些简单但找不到的东西。

图片说明了边界框顶部的点。

【问题讨论】:

  • 您不能定义相对于的旋转,只能定义方向。
  • 您还没有指定如何定义椭圆。
  • 我会找到具有定义切角的点...可以在单象限上使用二分搜索...或在整个椭圆上使用Approximation search

标签: graphics geometry 2d ellipse


【解决方案1】:

设椭圆半轴为a, b,圆心为(cx, cy),旋转角度为fi。那么参数t处的椭圆圆周坐标为:

 x = a * Cos(t) * Cos(fi) - b * Sin(t) * Sin(fi) + cx
 y = a * Cos(t) * Sin(fi) + b * Sin(t) * Cos(fi) + cy

为了得到极值点,我们可以通过t来区分坐标并将导数设置为零

 a * Sin(t) * Cos(fi) = - b * Cos(t) * Sin(fi)   //  dx/dt
 a * Sin(t) * Sin(fi)  =  b * Cos(t) * Cos(fi) //  dy/dt

 tg(t) = -b/a * Tg(fi)
 t(l,r)  = Pi * k + Atan(-b/a * Ttg(fi)  //left and right, k=0,1

 tg(t) = b/a * Ctg(fi)
 t(t,b) = Pi * k + Atan(b/a * Ctg(fi))  //top and bottom, k = 0,1

 ytop = a * Cos(t(t)) * Sin(fi) + b * Sin(t(t)) * Cos(fi) + cy
 and so on

由速成Delphi code生成的a: 200; b: 100; fi: Pi/6 CW;的真实例子

【讨论】:

  • ...非常感谢您的出色回答。因为我不是数学家,所以我不理解你在分解原始方程 (TtG) 时使用的所有符号,但 Delphi 代码很有帮助。我遇到的唯一问题是,当 fi 值低于 0 时,顶部变为底部,底部变为顶部(左右相同),但这很容易通过简单的条件解决。再次感谢...
  • 条件检查很好,因为替代方案是对三角关系进行更复杂的分析。
  • 我昨天花了一整天的时间来学习微分规则,因为我喜欢你把一个方程分解成它的组成部分之间的关​​系以获得所需点的方式。我知道您的细分是基于椭圆切线的末端将具有水平或垂直切线的事实。根据您上面的分析,我试图弄清楚如何计算椭圆上任何点的切线 - 但没有成功。我现在当然想了解更多关于差异化的信息......
  • 我使用的不是切线的极值,而是坐标的极值 - 并注意参数方程(x(t) 和 y(t))的用法。也可以得到切线方程并找到它们何时变为垂直和水平(零提名或分母 - 基本上与我得到的公式相同)
猜你喜欢
  • 2018-06-27
  • 1970-01-01
  • 2010-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-11
相关资源
最近更新 更多