与圆相切

时间:2014-04-19 11:26:41

标签: java curve 2d-games

我在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来自直线的参数形式,它是弧度的角度,基本上我是'我试图在我释放箭头的位置与圆相切。

1 个答案:

答案 0 :(得分:0)

您没有指定蛇转动时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的含义保持为蛇的方向,并忘记圆的中心和切线。当蛇转弯时,1 / radius会在angle中相加或相减,并且仍会使用posX += cos(angle), posY += sin(angle)计算位置。