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.

- Rejestracja:prawie 11 lat
- Ostatnio:około 4 lata
- Lokalizacja:okolice Łodzi
0
Wady: wolne działanie, mało optymalne
Zalety: łatwe do wykonania
- Sprawdź wszystkie pozycje pikseli otaczających zdjęcie.
- Sprawdź pozycje wszystkich pikseli drugiego zdjęcia. (lub) Sprawdź pozycje wszystkich pikseli otaczających drugie zdjęcie. Też powinno działać. Mam rację?
- Porównaj czy któreś pozycje są takie same - jeśli tak stykają się w przeciwnym się nie stykają.
edytowany 1x, ostatnio: Trebuh
- 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ć
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.