2014-10-16 104 views
1

我有一个UIView与界限(w,h),我试图计算角度和点在一个椭圆形是在视图的中点,即中心是(w * 0.5,h * 0.5)。我不断地改变视图和椭圆的大小,所以下面的值是来自控制台的值的一个实例。问题与椭圆角度计算和点计算

对于这种情况下,(W,H)=(150.000000,300.799988)和半径(RX,RY)=(52.500000,105.279999)

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

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

角度值I得到的是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时,所有的点和角都相等。所以它适用于圆而不适用于椭圆。

所以,我想知道我错在哪里。

+0

1.检查ATAN2使用(我用我的atanxy,而不是在这里:http://stackoverflow.com/a/21697187/2521214)如果操作数是dx,dy或dy,dx 2.你也可以使用我的atanxy并比较结果3.检查你的cos,sin atan2是否使用相同的单位(rad,deg)3.尝试添加括号(',') '协调计算以排除错误的操作数优先级编译器错误(它发生在我过去几次以来,因为我包围了我能确定的东西) – Spektre 2014-10-17 07:05:27

+0

@Spektre:我加倍检查了一切。也尝试与你的atanxy。 atanxy表现不同,但仍然给出错误的价值。我想知道我发布的代码的问题,因为我的数学在某个地方显然是错误的。 – blancos 2014-10-17 08:23:32

+0

有一段时间得到你的问题是...添加答案。基本的东西是最糟糕的错误:)你可以永远登上他们......新鲜的眼睛通常有帮助 – Spektre 2014-10-17 10:02:10

回答

1

是现在我看到你的意思

  • 您通过E=atan2(...)
  • 获得由椭圆E角度和公式,你需要M角度x=x0+rx*cos(M), y=...
  • 中号使用它是平均圆形角
  • 和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坐标这两点应该是相同的(图像是手绘在油漆)
  • 不要紧哪个轴您缩放和不
+0

谢谢。有效!!在这一天挣扎了整整一天。 – blancos 2014-10-17 10:44:47