特定方向上圆上两点之间的距离

时间:2013-05-04 15:15:38

标签: objective-c math distance geometry

我的圈子有两点,(x1y1)和(x2y2)。如何计算它们在计数器和时钟方向上的距离。 目前,我正在使用以下公式计算圆上2点之间的距离。 请建议。

- (CGFloat)calculateDistanceBetween:(CGPoint)point1 point2:(CGPoint)point2
{
    CGFloat dx = point2.x - point1.x;
    CGFloat dy = point2.y - point1.y;
    return sqrt(dx*dx + dy*dy );
}

1 个答案:

答案 0 :(得分:2)

这确实是一个数学问题。您正在寻找弧长(等于弧度乘以半径的角度)

您现有的功能无法计算弧长,因为它不知道圆的位置(定义圆圈需要3个点)。

- (CGFloat)calculateShortestArcDistanceBetween:(CGPoint)point1 point2:(CGPoint)point2 center:(CGPoint)center
{
    CGFloat dx1 = point1.x - center.x;
    CGFloat dy1 = point1.y - center.y;
    CGFloat dx2 = point2.x - center.x;
    CGFloat dy2 = point2.y - center.y;
    CGFloat angle1 = atan2f( dy1, dx1 );
    CGFloat angle2 = atan2f( dy2, dx2 );
    CGFloat angle = angle1 - angle2;
    if(      angle >  M_PI ) angle -= M_PI * 2;
    else if( angle < -M_PI ) angle += M_PI * 2;
    return fabs( angle ) * sqrtf( dx1 * dx1 + dy1 * dy1 );
}

- (CGFloat)calculateDirectedArcDistanceBetween:(CGPoint)point1 point2:(CGPoint)point2 center:(CGPoint)center
{
    CGFloat dx1 = point1.x - center.x;
    CGFloat dy1 = point1.y - center.y;
    CGFloat dx2 = point2.x - center.x;
    CGFloat dy2 = point2.y - center.y;
    CGFloat angle1 = atan2f( dy1, dx1 );
    CGFloat angle2 = atan2f( dy2, dx2 );
    CGFloat angle = angle1 - angle2;
    if( angle < 0 ) angle += M_PI * 2;
    return angle * sqrtf( dx1 * dx1 + dy1 * dy1 );
}

大多数棘手的问题是确保范围是正确的(atan2给出从-pi到+ pi的值,所以在获得两个角度之间的差异之后我们必须重新规范它们)