Касательная к окружности

Я пишу кривую змейку, как эта http://www.gamekb.com/thumbs_v2/01872/1872657-85play-curve-fever-2.gif на Java. Если я хочу двигаться под определенным углом, это:

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 из параметрической формы прямой, и это угол в радианах, в основном я пытаюсь сделать касательную к круг в точке, где я выпускаю стрелу.


person amUser    schedule 19.04.2014    source источник


Ответы (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 как направления змеи и забыть о центре круга и касательной. Когда змея поворачивается, 1 / radius прибавляется или вычитается из angle, а позиция по-прежнему рассчитывается с использованием posX += cos(angle), posY += sin(angle).

person tom    schedule 19.04.2014
comment
я пробовал угол = atan2 (вектор, векторx) + PI/2; но это все еще не дает правильных касаний. С математической точки зрения это должно работать - person amUser; 20.04.2014