我有一个带有边界(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 回答
是的,现在我明白了你的意思
您正在通过
E=atan2(...)
从椭圆获得E
角度并在方程式中使用它
M
anglex=x0+rx*cos(M), y=...
M是平均圆角
和E是椭圆角
这类似于开普勒方程式 .
幸运的是,你不需要匹配主焦点周围的速度,所以:
为了获得
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坐标应该相同(图像是手绘的)
无论您缩放哪个轴,哪个轴都没有