2014-02-19 7 views
0

Предлагается 2 метода;C# XNA Рассчитать расстояние между прямоугольниками (вращение)

if(rectangle.Intersects(otherRectangle)) 
{ 
    //collision stuff 
} 

Catch: работает только с невращающимися прямоугольниками.

if(Vector2.Distance(player.pos, enemy.pos) < 50) 
{ 
    //collision stuff 
} 

Catch: работает только с кругами.

То, что я хочу, чтобы вычислить х и у в этом образе:problem

Факты

Ширина и длина обоих прямоугольников определены, наряду с их вращением. Я могу рассчитать D, используя теорему Пифагора. Но TRUE расстояние D - (X + Y).

Общий подход

Очевидно, х и у могут быть вычислены с помощью правила косинуса. Но у меня есть только ширина или длина и угол между двумя фигурами.

Усложнение

Плюс, это должно работать на любом повороте. Прямоугольник слева можно вращать в любом направлении, а x будет отличаться в зависимости от указанного вращения.

Вопрос

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

+1

«Я просто хочу, чтобы эффективный метод обнаружения столкновений был более сложным ...» Будьте осторожны, чтобы не искать сложности ... он найдет вас, и вы можете пожалеть об этом. Серьезно, хотя, ищите SAT. –

+0

Итак, вы хотите использовать теорему Пифагора или нет? Вы также можете изучить методы Vector2, такие как 'Vector2.Dot()' – davidsbro

+0

Мне нужно использовать теорему Пифагора в любом случае, чтобы получить расстояние. – ShadowByte

ответ

1

Один подход, чтобы повернуть линию с обратным углом и проверить с осью выровнена коробкой:

class RotatedBox 
{ 
    ... 

    float CalcIntersectionLength(Vector2 lineTo) //assume that the line starts at the box' origin 
    { 
     Matrix myTransform = Matrix.CreateRotationZ(-this.RotationAngle); 
     var lineDirection = Vector2.Transform(lineTo -this.Center, myTransform); 
     lineDirection.Normalize(); 
     var distanceToHitLeftOrRight = this.Width/2/Math.Abs(lineDirection.X); 
     var distanceToHitTopOrBottom = this.Height/2/Math.Abbs(lineDirection.Y); 
     return Math.Min(distanceToHitLeftOrRight, distanceToHitTopOrBottom); 
    } 
} 

Теперь вы можете рассчитать фактическое расстояние с

var distance = (box1.Center - box2.Center).Length 
       - box1.CalcIntersectionLength(box2.Center) 
       - box2.CalcIntersectionLength(box1.Center); 

Убедитесь, что направление вращения соответствует вашей визуализации.

+0

Центр и линияТо было бы? – ShadowByte

+0

Центр - это центр коробки и 'lineTo' цель линии. –

+0

Не работает. Результат: http://i.imgur.com/KQSOdZb.gif – ShadowByte

Смежные вопросы