首页 文章

椭圆角计算和点计算的问题

提问于
浏览
1

我有一个带有边界(w,h)的 UIView 并且我试图计算角度并指向椭圆,该椭圆以视点的中点为中心,即中心是(w * 0.5,h * 0.5) . 我不断更改视图和椭圆的大小,因此以下值来自控制台以获取值的实例 .

对于这个例子,(w,h)=(150.000000,300.799988),半径是(rx,ry)=(52.500000,105.279999)

现在,我尝试使用以下代码在此椭圆上找到点 P1(x,y) (30.784275,93.637390)的角度:

CGFloat angle = atan2((y - (h * 0.5)), (x - (w * 0.5)));
if (angle < 0)
{
   angle += 2 * M_PI;
}

我得到的角度值是 4.050611 .

由于我没有得到我想要的输出,我只是尝试使用以下代码从上方角度找到椭圆上的点:

framePoint.x = (w * 0.5) + (rx * cosf(angle));
framePoint.y = (h * 0.5) + (ry * sinf(angle));

令人惊讶的是我得到了一点(42.737656,67.344543) .

我只是继续进行了一次相同过程的迭代 . 我从上面计算角度,得到角度为4.341885,从这个最新角度得到新点(55.990501,52.263786) .

我知道我的计算公式有问题,但我无法指出它 .

此外,如果椭圆上方是圆形,即当rx = ry时,所有点和角度都相等 . 所以它适用于圆形但不适用于椭圆形 .

所以,我想确切地知道我哪里出错了 .

1 回答

  • 1

    是的,现在我明白了你的意思

    • 您正在通过 E=atan2(...) 从椭圆获得 E 角度

    • 并在方程式中使用它 M angle x=x0+rx*cos(M), y=...

    • M是平均圆角

    • 和E是椭圆角

    enter image description here

    • 这类似于开普勒方程式 .

    • 幸运的是,你不需要匹配主焦点周围的速度,所以:

    为了获得 M 角度

    • 您必须缩放一个轴以将椭圆转换为圆形

    • 并计算那里的角度

    • 所以如果你的轴对齐椭圆是 (x0,y0,rx,ry)

    • 和椭圆上的输入点是 (x1,y1)

    • 然后,如果我没有弄错,它应该是这样的:

    • M=atan2((y1-y0)*rx/ry,x1-x0)M=atan2(y1-y0,(x1-x0)*ry/rx)

    • x=x0+rx*cos(M)

    • y=y0+ry*sin(M)

    [笔记]

    • 两个点的X坐标应该相同(图像是手绘的)

    • 无论您缩放哪个轴,哪个轴都没有

相关问题