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

Objective c 特定方向上圆上两点之间的距离,objective-c,math,distance,geometry,Objective C,Math,Distance,Geometry,我的圆上有两个点,(x1y1)和(x2y2)。如何计算它们在计数器和时钟方向上的距离。 目前,我使用以下公式计算圆上两点之间的距离。 请建议 - (CGFloat)calculateDistanceBetween:(CGPoint)point1 point2:(CGPoint)point2 { CGFloat dx = point2.x - point1.x; CGFloat dy = point2.y - point1.y; return sqrt(dx*dx + dy

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

- (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 );
}

这真是一道数学题。您正在查找弧长(等于弧度中的角度乘以半径)

现有函数无法计算弧长,因为它不知道圆在哪里(定义圆需要3个点)

-(CGFloat)计算起点距离介于:(CGPoint)点1点2:(CGPoint)点2中心:(CGPoint)中心
{
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角度=角度1-角度2;
如果(角度>μPI)角度-=μPI*2;
否则,如果(角度<-M_PI)角度+=M_PI*2;
返回晶圆(角度)*sqrtf(dx1*dx1+dy1*dy1);
}
-(CGFloat)CalculatedDirectedArcDistanceBeween:(CGPoint)点1点2:(CGPoint)点2中心:(CGPoint)中心
{
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角度=角度1-角度2;
如果(角度<0)角度+=M_PI*2;
返回角*sqrtf(dx1*dx1+dy1*dy1);
}

最棘手的一点是确保范围正确(
atan2
给出了从-pi到+pi的值,因此在得到两个角度之间的差值后,我们必须将其重新标准化)

您是指沿圆弧的距离吗?你的函数看起来不像是这样做的。你所拥有的只是两点之间的线性距离,没有涉及到圆。顺时针/逆时针方向没有区别。小注释:
hypotf
是一个计算向量长度的方便函数。@MartinR不知道这一点。它是便携式的吗?快速的网络搜索并没有告诉我。我在圆圈上的两点是{180.109,155.487}和{79.2966,18.2268}。我得到了两个方向的弧长221.778336-221.778336。这是不对的!我遗漏了什么吗?修改后的函数如下<代码>-(CGFloat)计算之间的距离:(CGPoint)point1 point2:(CGPoint)point2 center:(CGPoint)center{CGFloat dx1=point1.x-center.x;CGFloat dy1=point1.y-center.y;CGFloat dx2=point2.y-center.y;CGFloat angle1=atan2f(dy1,dx1);CGFloat angle2=atan2f(dy2,dx2);CGFloat angle=angle1-angle2;返回角*sqrtf(dx1*dx1+dy1*dy1);}
您还没有说出中心点在哪里。另请参见我的更新答案,其中有
if(角度<0)…
行(定向角度所需)
- (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 );
}