Я не уверен, что нет более простого способа сделать это, я часто возвращаюсь к трехмерной векторной математике, даже если в двухмерных тригонометрических решениях лучше подходят.Ваш вопрос подразумевает, что вы работаете в 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);
Если это окажется в обратном направлении (в положительном / отрицательном направлении), то измените порядок параметровв функции Креста.