Вращение, чтобы указать на что-то в радианах, не оборачиваясь вокруг нуля - PullRequest
0 голосов
/ 06 июня 2018

Допустим, у меня есть круг с линией, торчащей из него.

Я хочу, чтобы эта линия указывала на центр окна, независимо от того, куда движется круг.

Но, Я хочу, чтобы эта линия на медленно двигалась к этому углу.Я не хочу, чтобы вращение вычислялось и устанавливалось для каждого отдельного кадра, а скорее вычислялось и Твин в этом направлении.

Проблема, с которой я столкнулся, заключается в том, что если вы двигаетесьчтобы заставить линию вращаться вокруг места, где радианы встречаются с 0, она сделает полные 360 (или 3,14 в радах;), чтобы добраться до этой точки.

Я потратил некоторое время, пытаясь придумать, как объяснить это лучше всего, вот кодекс , который, мы надеемся, может помочь прояснить то, что я спрашиваю

// CenterX/Y is the center of the screen.
// dotX/Y is the center of the circle.
var angleToCenter=Math.atan2(centerY-dotY,centerX-dotX);

if (angleToCenter<currentAngle) {
  currentAngle-=0.05;    
} else {
  currentAngle+=0.05;
}

если вы переместитесь вправо от экрана, а затем поднимитесь выше или ниже центра, вы увидите, что линия движется по кругу, пытаясь добраться до рассчитанного направления.Как мне избежать этого?Я хочу, чтобы линия плавно вращалась, чтобы указывать на центр, кратчайшим путем, , а не , делая полный круг.

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Проблема заключается в том, что angleToCenter переключается с Math.PI на -Math.PI (и наоборот).
Поэтому я бы посоветовал вам создать «расстояние до эпсилон-угла», в котором углы будутбыть жестко закодированным:

var angleToCenter = Math.atan2(centerY - dotY, centerX - dotX);
var epsilon = 0.05;
if (Math.abs(angleToCenter - Math.PI) <= epsilon / 2 || Math.abs(angleToCenter + Math.PI) <= epsilon / 2) {
  if (dotY > centerY) {
    currentAngle = -Math.PI;
  } else if (dotY < centerY) {
    currentAngle = Math.PI;
  }
} else if (angleToCenter < currentAngle - epsilon) {
  currentAngle -= epsilon;
} else {
  currentAngle += epsilon;
}

Для полного редактирования вы можете проверить мой ответвление на ваш CodePan

0 голосов
/ 06 июня 2018

Отличный вопрос.Очень разные.

У меня будет обратное (-1) отношение, определенное для любого местоположения ниже черного круга.Так что, если красный круг пересекает горизонтальную ось - граница которой определяется черным кругом - математический результат для вашего уравнения инвертируется.

Это будет 0 градусов, как мы обычно думаем, теперь оно расположено на 180 градусов.

Обоснование : Глядя на ваш CodePen, очевидно, что стебель движется "длинный путь вокруг, но вы хотите, чтобы он пошел "короткий путь вокруг".Казалось бы, наиболее интуитивным способом добиться этого является инверсия вычисленного вращением красных кругов.Самым простым способом, который я могу придумать, было бы изменение полярности круга.

...