我从数组获得最后两个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
}
但我得到的观点是不能以与原始线相同的角度绘制延长线。 我认为这是因为我没有在最后几点之间找到正确的角度..我可能做错了什么?在考虑角度和方式时,我是否需要考虑整个象限系统?并且我在横向模式下工作。这会有什么不同吗?
答案 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的线的方向上。没有什么复杂的要求。没有角度计算。不用担心象限。
学习使用矢量。他们是你的朋友,或者至少,如果你让他们,他们就可以。