【问题标题】:Given two points calculate third point at a given angle?给定两点以给定角度计算第三点?
【发布时间】:2012-01-19 20:46:36
【问题描述】:

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

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

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

【问题讨论】:

    标签: ios math cocos2d-iphone


    【解决方案1】:

    各位大神,您这样做的方式极其复杂。

    跳过所有有角度的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 的直线方向。不需要任何复杂的东西。没有计算角度。不用担心象限。

    学习使用向量。他们是你的朋友,或者至少,如果你允许他们,他们可以。

    【讨论】:

    • 我喜欢你的风格,但这不太可能对提问者有所帮助,除非你可以提供一些 Objective-c(或者至少是 c)代码来展示如何做到这一点。 AFAIK 没有内置库来保存或操作可可中的向量。
    • 是的,我预料到了。但即使向量操作不可行,围绕这些操作包裹几个简单的循环也很容易。关键是使用向量的代数,而不是计算显式角度的杂乱无章的东西。
    • 也许这是正确的做法。但我很难将向量缩放为单位长度。我们使用具有 x 和 y 绳索的 CGPoint(即我们从差异中得到的 V)。如何使用 CGPoint 创建单位长度??
    • 试过类似的方法但不起作用,CGPoint diff = ccpSub(endPt, pointD); diff.x = diff.x/sqrt(diff.x/2 + diff.y/2); diff.y = diff.y/sqrt(diff.x/2 + diff.y/2); CGFloat 距离 = sqrt((diff.x * diff.x) + (diff.y * diff.y)); extendEndPt.x = endPt.x + 距离 * 延伸点; extendEndPt.y = endPt.y + 距离 * 延伸点;
    • 接受了,因为它引导我朝着正确的方向前进......这最终成功了gamedev.stackexchange.com/questions/19379/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-30
    • 1970-01-01
    • 2012-12-27
    • 1970-01-01
    • 1970-01-01
    • 2014-05-22
    • 1970-01-01
    相关资源
    最近更新 更多