我的圈子有两点,(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 );
}
答案 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的值,所以在获得两个角度之间的差异之后我们必须重新规范它们)