2009-10-14 2 views
2

Этот фрагмент кода взят из игры, построенной с использованием XNA-рамки. Я хотел бы получить некоторое объяснение того, как это работает с точки зрения триггера и физики.C# - объяснение тригонометрического кода (физика)

ball.velocity = новый Vector2 ((поплавок) Math.cos (cannon.rotation), (флоат) Math.sin (cannon.rotation));

ball.rotation - это поворот спрайта в том, что я должен думать, радиан.

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

Причина, почему я спросил об этом. Я хотел бы получить представление о том, как эти рамки выполняют вычисления для триггера. Я пытаюсь заставить спрайт поворачиваться в направлении, где находится мышь, то есть: x и y известны, мне нужен только угол.

Итак, здесь есть 2 вопроса. объясняя этот код выше и указывая спрайт в направлении известной точки.

Update:

я узнал, что точка а, объект находится не (0,0), потому что XNA использует обратную систему координат. Итак, теперь у меня есть следующие переменные:

пункт объекта. пункт мыши.

ответ

10

Каждый угол соответствует точке на единичной окружности (единичный круг является уникальной окружностью с центром в начале координат с радиусом один, т.е. , единичный круг представляет собой множество точек, удовлетворяющих x^2 + y^2 = 1). Соответствие: угол theta, theta соответствует точке (cos theta, sin theta). Почему (cos theta, sin theta) живут на единичном круге? Из-за любимой идентичности каждого

cos^2 theta + sin^2 theta = 1. 

То есть с x = cos theta и y = sin theta, точка (x, y) удовлетворяет x^2 + y^2 = 1 так, что (x, y) на единичной окружности.

Для того, чтобы изменить это, учитывая точку на единичной окружности можно найти угол, используя inverse tangent (возможно, известный вам как arctan или atan, а иногда tan-1).Точно, учитывая (x, y) на единичном круге, вы можете найти угол, соответствующий (x, y), вычислив theta = arctan(y/x).

Конечно, здесь есть некоторые грязные детали. Функция arctan не может определить разницу между входами (x, y) и (-x, -y), поскольку y/x и (-y/-x) имеют одинаковые знаки. Кроме того, arctan не может обрабатывать входы, где x = 0. Таким образом, мы, как правило, работать с ними, определив функцию atan2, которая будет обрабатывать эти запутанные детали для нас

atan2(y, x) = arctan(y/x)  if x > 0 
      = pi + arctan(y/x) if y >= 0, x < 0 
      = -pi + arctan(y/x) if y < 0, x < 0 
      = pi/2    if y > 0, x = 0 
      = -pi/2    if y < 0, x = 0 
      = NaN     if y = 0, x = 0 

В C#, Math.Atan функция arctan, что я говорил выше, и Math.Atan2 функция atan2, что я говорил выше.

2

Вы можете видеть, что cos и sin возвращают точку на круг.

В этом отношении см. Середину канона как центр круга. Затем, учитывая угол (угол канона), вы можете получить положение на круге, на которое он указывает, с sin и cos. Если вы считаете, что пушка центрирована на позиции 0,0, то это значение также является направлением, в которое должна двигаться пуля.

answer2: если вы знаете x и y, и вам нужно знать угол. Вам нужна функция atan, которая возвращает угол, образованный наклонной стороной треугольника, где одна точка равна 0,0, другая точка равна точка x, y и одна точка - это точка, которая находится под углом 90 градусов.

2

К сожалению, это хороший вопрос, где SO не лучший формат, чтобы ответить на.

Вместо объяснения в тексте, я думаю, было бы полезно узнать о параметрических уравнений. Вы можете начать с поиска «параметрического уравнения круга» в Google.

Способ, которым эта концепция нажала для меня, заключалась в том, чтобы экспериментировать с разными фрагментами кода, пока не поняла связь между sin, cos, кругами и углами. Видеть картинки и изображения также помогают. Раньше я читал описания, но никогда не мог твердо понять объяснения.

4
 | 
    y.-----* P 
    | /| 
    | /| 
    | r/ | 
    |/a | 
    |/)___.__ 
    O   x 

    we have: 

    a = angle in radians 
    O: origin 
    P: known point 
    r: distince between O & P 

    to calculate x, y: 

     x = r*cos(a) 
     y = r*sin(a) 

(in your example : r = 1, a = cannon.rotation) 

Теперь, если у вас есть х, у, и вы хотите:

if x!= 0 a = atan(y/x) 
otherwise a = sign(y)*Pi/2 

для получения дополнительной информации (& похорошевших граф): Wikipedia: Polar coordinate system

0

Что вы спрашиваете, трудно объяснить если вы не знакомы с триггером.

Строка кода, о которой идет речь, вычисляет единичный вектор для направления шара, который, как я полагаю, будет уволен из пушки. Космическая и греховная части вещей извлекают соответственно компоненты X и Y угла пушки. Итак, где точки пушки, это направление, которое стреляет шарик.

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