pixel perfect collision

pixel perfect collision
M9
  • Rejestracja:prawie 10 lat
  • Ostatnio:ponad 8 lat
  • Postów:31
0

Cześć, jakiś czas temu ktoś polecił mi ten sposób wykrywania kolizji między dwoma zdjęciami. Problem jest w tym że to nie jest takie proste, a wszystkie fora poświęcone tej metodzie są po angielsku. Więc jeśli ktoś już kiedyś miał z czymś takim do czynienia i mógłby w miarę sensownie wytłumaczyć to byłbym wdzięczny.

Trebuh
  • Rejestracja:prawie 11 lat
  • Ostatnio:około 4 lata
  • Lokalizacja:okolice Łodzi
0

Wady: wolne działanie, mało optymalne
Zalety: łatwe do wykonania

  1. Sprawdź wszystkie pozycje pikseli otaczających zdjęcie.
  2. Sprawdź pozycje wszystkich pikseli drugiego zdjęcia. (lub) Sprawdź pozycje wszystkich pikseli otaczających drugie zdjęcie. Też powinno działać. Mam rację?
  3. Porównaj czy któreś pozycje są takie same - jeśli tak stykają się w przeciwnym się nie stykają.

GG: 10101100010110000100011101 (BIN)
"Nie wszystko napisane w internecie jest prawdą" - Józef Piłsudski.
edytowany 1x, ostatnio: Trebuh
M9
  • Rejestracja:prawie 10 lat
  • Ostatnio:ponad 8 lat
  • Postów:31
0

@Trebuh Teoretycznie jest to zrozumiałe gorzej z wykonaniem. Popracuje trochę nad tym. Jak już mówiłem każde forum jest w innym języku

edytowany 1x, ostatnio: Marcin902
Trebuh
Czego nie rozumiesz? Może pomogę wytłumaczyć.
M9
  • Rejestracja:prawie 10 lat
  • Ostatnio:ponad 8 lat
  • Postów:31
0

@Trebuh Próbuje rozgryźć przykładowy algorytm, mógłbyś rzucić okiem? Mogę go tu wrzucić

Kopiuj
public class CollisionUtil {
public static boolean isCollisionDetected(Sprite sprite1, Sprite sprite2){
    Rect bounds1 = sprite1.getBounds();
    Rect bounds2 = sprite2.getBounds();

    if( Rect.intersects(bounds1, bounds2) ){
        Rect collisionBounds = getCollisionBounds(bounds1, bounds2);
        for (int i = collisionBounds.left; i < collisionBounds.right; i++) {
            for (int j = collisionBounds.top; j < collisionBounds.bottom; j++) {
                int sprite1Pixel = getBitmapPixel(sprite1, i, j);
                int sprite2Pixel = getBitmapPixel(sprite2, i, j); 
                if( isFilled(sprite1Pixel) && isFilled(sprite2Pixel)) {
                    return true;
                }
            }
        }
    }
    return false;
}

private static int getBitmapPixel(Sprite sprite, int i, int j) {
    return sprite.getBitmap().getPixel(i-(int)sprite.getX(), j-(int)sprite.getY());
}

private static Rect getCollisionBounds(Rect rect1, Rect rect2) {
    int left = (int) Math.max(rect1.left, rect2.left);
    int top = (int) Math.max(rect1.top, rect2.top);
    int right = (int) Math.min(rect1.right, rect2.right);
    int bottom = (int) Math.min(rect1.bottom, rect2.bottom);
    return new Rect(left, top, right, bottom);
}

private static boolean isFilled(int pixel) {
    return pixel != Color.TRANSPARENT;
}
} 
edytowany 3x, ostatnio: Marcin902

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.