Кратчайший путь к цели? - PullRequest
       7

Кратчайший путь к цели?

1 голос
/ 07 декабря 2010

Я создал небольшую мини-игру «Стрелок-танкист» и в настоящее время работает над управлением ЦП другими танками.

Танк-процессор знает следующее:

  • Свой облик,направление его ориентации
  • Своя собственная позиция (X и Y)
  • Его целевая позиция (X и Y)

Поверх этого ява сделано так, чтоположительный у вниз, а не вверх.положительное направление х слева направо.

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

Допустим, танк находится в точке (3,3),лицом к 90 градусам (прямо слева) и Im в (4,7).Какими будут расчеты?

1 Ответ

1 голос
/ 08 декабря 2010

Я не уверен, что нет более простого способа сделать это, я часто возвращаюсь к трехмерной векторной математике, даже если в двухмерных тригонометрических решениях лучше подходят.Ваш вопрос подразумевает, что вы работаете в 2D, но математика 3D все равно будет работать.Надеюсь, кто-то придумает более простой алгоритм для вас, но если нет, то вот что.

Полагаю, вы имеете в виду самый короткий путь в угловом измерении.В этом коде результат будет положительным угловым значением, если кратчайший путь - против часовой стрелки, и отрицательным, если CW.

Vector2 targetPosition = new Vector2(3, 3);
Vector2 myPosition = new Vector2(4, 7);
Vector2 myFacingDirection2D = new Vector2(-1, 0);//facing straight left   
Vector3 directionToTarget3D = Vector3.Normalize(new Vector3(targetPosition - myPosition, 0));
Vector3 myFacingDirection3D = Vector3.Normalize(new Vector3(myFacingDir2D, 0);
Vector3 crossResult = Vector3.Cross(myFacingDirection3D, directionToTarget3d);
float dotFactor = Vector3.Dot(myFacingDirection3D, directionToTarget3D) < 0 ? MathHelper.Pi : 0f;

float angleToTarget = (dotFactor - (float)Math.Sin(crossResult.Length()) ) * Math.Sign(crossResult.Z);

Если это окажется в обратном направлении (в положительном / отрицательном направлении), то измените порядок параметровв функции Креста.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...