Разработка Android: самое простое обнаружение столкновений? - PullRequest
2 голосов
/ 04 августа 2011

Я пытаюсь выполнить обнаружение столкновения. Я не использую OpenGl, я использую canvas / surfaceview.

У меня есть 2 растровых изображения. Это то, что я дошел до сих пор:

public boolean inBounds(int x2,int y2, int x,int y,int width,int height){
    if(x2 > x && x2 < x + width -1 && y2 > y && y2 < y + height -1){
        return true;
    }
     return false;

       }

Это выполняется, но обнаруживает столкновение, только если угол x2 и y2 находится внутри другого объекта.

Так как мне улучшить обнаружение столкновений?

enter image description here

Это изображение, которое я нашел в Интернете, должно обнаружить столкновение в моей программе.

// Simon

Ответы [ 4 ]

2 голосов
/ 04 августа 2011

Если это круги, то вот небольшой псевдокод для вас:

if (Math.sqrt(Math.pow(bitmap1.centerX-bitmap2.centerX, 2) + Math.pow(bitmap1.centerY-bitmap2.centerY, 2))<=bitmap1.width) 
    return true;
else
    return false;

Поскольку теперь вам нужны прямоугольники (и предполагается, что они имеют разные размеры):

if (Math.abs(bitmap1.centerX-bitmap2.centerX)<=(bitmap1.width+bitmap2.width)/2f
    && Math.abs(bitmap1.centerY-bitmap2.centerY)<=(bitmap1.height+bitmap2.height)/2f)
    return true;
else
    return false;

Надеюсь, это поможет!

1 голос
/ 10 января 2012

Для обнаружения столкновения прямоугольника

bool isIntersect(Rectangle a, Rectangle b){
    return a.Left < b.Right && a.Top < b.Bottom &&
           b.Left < a.Right && b.Top < a.Bottom;
}

Для обнаружения столкновения двух кругов

bool isIntersect(Circle a, Circle b)
{ 
Vector<ClassWithLengthRadiusProp> vDistanceProp = a.Center - b.Center;
    return vDistanceProp.Length < a.Radius + b.Radius;
}

ИЛИ (Точный с Sqrt)

bool isIntersect(Circle a, Circle b)
{
   Vector<ClassWithLengthRadiusProp> vDistanceProp = a.Center - b.Center;
    float radiusSum = a.Radius + b.Radius;
    float squaredDistanceLength = vDistanceProp .x * vDistanceProp .x +
                                  vDistanceProp .y * vDistanceProp .y;

    return squaredDistanceLength < radiusSum * radiusSum;
}
0 голосов
/ 06 августа 2012

Класс android.graphics.Rect содержит несколько полезных функций, которые делают это в одной строке.Вы можете проверить пересечь.

0 голосов
/ 04 августа 2011
if(r1.lowerLeft.x < r2.lowerLeft.x + r2.width 
   && r1.lowerLeft.x + r1.width > r2.lowerLeft.x 
   && r1.lowerLeft.y < r2.lowerLeft.y + r2.height 
   && r1.lowerLeft.y + r1.height > r2.lowerLeft.y)
   return true;

   else
   return false;

Это должно быть сделано, если вы не хотите обнаруживать столкновения окружности. r1 и r2 и определены как Rects

...