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

时间:2012-01-19 07:44:09

标签: ios math cocos2d-iphone

我从数组获得最后两个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;
}

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

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

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

1 个答案:

答案 0 :(得分:7)

天哪,你这样做的方式令人难以置信地过于复杂。

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

首先,你需要做的是计算一个指向相关直线的向量。

V = P2 - P1;

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

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

V = V/sqrt(V(1)^2 + V(2)^2);

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

现在计算P3很简单。

P3 = P2 + d*V;

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

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