给定两个点计算给定角度的第三点?

hem*_*ant 0 math cocos2d-iphone ios

我有一个数组最后两个CGPoints,其中包含用户绘制线条.我需要以相同的角度将线延伸到固定的距离.所以我首先在下面的代码的帮助下计算最后两点之间的角度

-(CGFloat)angleBetweenFirstPoint:(CGPoint)firstPoint ToSecondPoint:(CGPoint)secondPoint
{

CGPoint diff = ccpSub(secondPoint, firstPoint);

NSLog(@"difference point %f , %f",diff.x,diff.y);

CGFloat res = atan2(diff.y, diff.x);

/*if ( res < 0 ) 
{
    res = (0.5 * M_PI) + res;
}

if ( dx<0  && dy>0 ) {      // 2nd quadrant
    res += 0.5 * M_PI;
} else if ( dx<0 && dy<0 ) {        // 3rd quadrant
    res += M_PI;
} else if ( dx>0 && dy<0 ) {        // 4th quadrant
    res += M_PI + (0.5 * M_PI);
}*/

//res=res*180/M_PI;

res = CC_RADIANS_TO_DEGREES(res);

return res;
}
Run Code Online (Sandbox Code Playgroud)

计算角度后,我借助以下数学找到延伸点

-(void)extendLine
{
lineAngle = [self angleBetweenFirstPoint:pointD ToSecondPoint:endPt];

extendEndPt.x = endPt.x - cos(lineAngle) * 200;
        extendEndPt.y = endPt.y - sin(lineAngle) * 200;

// draw line unto extended point
}
Run Code Online (Sandbox Code Playgroud)

但是我得到的点不是以与原始线相同的角度绘制延长线.我认为这是因为我没有在最后几点之间找到正确的角度..我可能做错了什么?在考虑角度和方式时,我是否需要考虑整个象限系统?并且我在横向模式下工作.那会有什么不同吗?

小智 7

天啊,你这样做的方式令人难以置信的过于复杂.

用角度跳过所有的crapola.你不需要它.期.用矢量和非常简单的方法做到这一切.首先,我假设你有两个点,P1和P2.您希望找到一个新的点P3,即P2的已知距离(d),沿着连接两点的直线.

你需要做的就是首先,计算一个指向所讨论的线的向量.

V = P2 - P1;
Run Code Online (Sandbox Code Playgroud)

我写的就好像我在MATLAB中写的那样,但所有这些都意味着要减去两点的x和y坐标.

接下来,将矢量V缩放以具有单位长度.

V = V/sqrt(V(1)^2 + V(2)^2);
Run Code Online (Sandbox Code Playgroud)

将向量V的分量除以该向量的长度(或者如果您愿意,则为2范数)可以创建具有单位范数的向量.该范数只是V元素的平方和的平方根,因此它显然是向量的长度.

现在计算P3很简单.

P3 = P2 + d*V;
Run Code Online (Sandbox Code Playgroud)

P3将在远离点P1的线的方向上位于距离P2的d个单位的距离处.没有什么复杂的要求.没有角度计算.不用担心象限.

学习使用矢量.他们是你的朋友,或者至少,如果你让他们,他们就可以.