2014-08-28 7 views
0

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

enter image description here

Картина иллюстрирует спрайт и два вектора. Как найти угол A между ними двумя? Я пытался использовать этот код, чтобы получить угол между двумя векторами, но я должен был что-то пропустил, потому что я не получить правильные результаты:

 public float GetAngleBetween (Vector2 A, Vector2 B) 
    { 
     float DotProd = Vector2.Dot (A, B); 
     float Length = A.Length() * B.Length(); 
     return (float)MathHelper.ToDegrees ((float)Math.Acos (DotProd/Length)); 
    } 

Любой вход приветствуется и спасибо заранее любые ответы.

+0

я надеюсь, что ответ здесь (http://stackoverflow.com/questions/13458992/angle-between-two-vectors-2d) будет полезно. – Priyank

ответ

0

Я думаю, вы можете найти метод Vector2.Dot, который используется для расчета произведения двух векторов и может использоваться для расчета угла.

Например:

// the angle between the two vectors is less than 90 degrees. 
Vector2.Dot(vector1.Normalize(), vector2.Normalize()) > 0 

// the angle between the two vectors is more than 90 degrees. 
Vector2.Dot(vector1.Normalize(), vector2.Normalize()) < 0 

// the angle between the two vectors is 90 degrees; that is, the vectors are orthogonal. 
Vector2.Dot(vector1.Normalize(), vector2.Normalize()) == 0 

// the angle between the two vectors is 0 degrees; that is, the vectors point in the same direction and are parallel. 
Vector2.Dot(vector1.Normalize(), vector2.Normalize()) == 1 

// the angle between the two vectors is 180 degrees; that is, the vectors point in opposite directions and are parallel. 
Vector2.Dot(vector1.Normalize(), vector2.Normalize()) == -1 

Это то, что вы ищете, или вам нужен точный угол?

+0

Спасибо за ваш ответ, но мне нужен точный угол. – user2236165

+0

Vector2.Dot (vector1.Normalize(), vector2.Normalize()) должен давать cos угла ... –

+0

Я читал, что контрольная точка, в которой XNA вычисляет углы, равна (0,0). Поэтому, если мой спрайт находится в верхнем левом углу экрана, угол между Vector 1 и 2 равен 90 градусам. Однако, если я перемещаю спрайт вокруг изменения угла в соответствии с контрольной точкой. Можно ли изменить эту контрольную точку? Поскольку угол между двумя точками и моим центром спрайтов по-прежнему составляет 90 градусов, даже жесткий расчетный угол в зависимости от контрольной точки - это что-то еще. – user2236165

1

Фактический угол в радианах

Math.ACos(Vector2.Dot(a, b)); 

Убедитесь, что и б нормированные векторы или результаты могут получить довольно странно.

0

Если я понимаю вашу диаграмму вопросов и комментарии, продукт Dot и Acos - это не единственные фрагменты информации, которые вам нужны. Вам также необходимо учитывать, когда спрайт не находится в (0,0).

float angleInRadians = (float) Math.Acos(Vector2.Dot(Vector2.Normalize(vector1 - spritePosition), Vector2.Normalize(vector2 - spritePosition))); 

int angleInDegrees = MathHelper.ToDegrees(angleInRadians); 
Смежные вопросы