【问题标题】:Tangent to the circle与圆相切
【发布时间】:2014-04-19 11:26:40
【问题描述】:

我正在用 Java 编写类似 http://www.gamekb.com/thumbs_v2/01872/1872657-85play-curve-fever-2.gif 的曲线蛇游戏。如果我想在特定角度下移动它:

posX += cos(angle);
posY += sin(angle);

当我按下左或右时,它会计算旋转的中间(左和右),然后

posX = middleX + sin(angle) * radius;
posY = middleY + cos(angle) * radius;

angle += PI/180;

如果我松开钥匙,它应该会计算出新的角度:

vectorx = middleX - posX; /*normal vector to tangent*/
vectory = middleY - posY;

k = -(vectorx/vectory);   /*directiv of tangent. Should be angle in radians but not
                           in all cases */

angle = k;

这段代码意味着我计算向量[vectorx,vectory],它与我正在计算的角度垂直于我的新直线,k 来自直线的参数形式,它是以弧度表示的角度,基本上我正在尝试在我释放箭头的地方与圆相切。

【问题讨论】:

    标签: java curve 2d-games


    【解决方案1】:

    您还没有指定当蛇转动时angle 代表什么。仅使用旧角度计算新角度可能很简单,但这里有一种使用切线的方法:

    vectorX = posX - middleX;
    vectorY = posY - middleY;
    tangentX = -vectorY; // flip the signs of these two for
    tangentY = +vectorX; // turning in the other direction
    angle = atan2(tangentY, tangentX)
    

    另一种方法是将angle 的含义保留为蛇的方向,而忘记圆的中心和切线。当蛇转弯时,angle 加上或减去1 / radius,仍然使用posX += cos(angle), posY += sin(angle) 计算位置。

    【讨论】:

    • 我试过 angle = atan2(vectory, vectorx) + PI/2;但它仍然没有给出正确的切线。从数学的角度来看,它应该可以工作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-19
    • 1970-01-01
    相关资源
    最近更新 更多