3.06.2014 / 20:19 | |
samogost Пользователь Сейчас: Offline
Имя: Сергей Откуда: Липецк Регистрация: 05.11.2013
| Вот три метода с комментариями для проверки столкновения непрозрачных пикселей двух картинок с оптимизацией.
//проверка столкновения непрозрачных пикселей двух картинок private boolean isCollisionDetected(Bitmap bitmap1, int x1, int y1, Bitmap bitmap2, int x2, int y2) { Rect bounds1 = new Rect(x1, y1, x1 + bitmap1.getWidth(), y1 + bitmap1.getHeight()); Rect bounds2 = new Rect(x2, y2, x2 + bitmap2.getWidth(), y2 + bitmap2.getHeight()); 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 bitmap1Pixel = bitmap1.getPixel(i - x1, j - y1); int bitmap2Pixel = bitmap2.getPixel(i - x2, j - y2); if ((isFilled(bitmap1Pixel)) && (isFilled(bitmap2Pixel))) { return true; } } } } return false; }
//получить прямоугольную область , которая образуется пересечением двух прямоугольников private Rect getCollisionBounds(Rect rect1, Rect rect2) { int left = Math.max(rect1.left, rect2.left); int top = Math.max(rect1.top, rect2.top); int right = Math.min(rect1.right, rect2.right); int bottom = Math.min(rect1.bottom, rect2.bottom); return new Rect(left, top, right, bottom); }
//проверить пиксель на непрозрачность private boolean isFilled(int pixel) { return pixel != 0; }
Изменено samogost (3.06 / 20:25) (всего 1 раз) |
3.06.2014 / 21:50 | |
andreyKorotayev Пользователь Сейчас: Offline
Имя: Андрей Откуда: Запорожье Регистрация: 19.05.2014
| Спасибо тебе большое |
3.06.2014 / 22:08 | |
andreyKorotayev Пользователь Сейчас: Offline
Имя: Андрей Откуда: Запорожье Регистрация: 19.05.2014
| Чет не получаеться запустить мяч под нужным мне углом делал вроде все как надо, запускаю к примеру под углом 90 градусов по идее он должен двигаться прямо вверх но летит хз под каким углом
|
3.06.2014 / 22:16 | |
andreyKorotayev Пользователь Сейчас: Offline
Имя: Андрей Откуда: Запорожье Регистрация: 19.05.2014
| Дайте краткий отрывок кода где запускаешь под произвольным углом с заданой скоростью
|
3.06.2014 / 22:30 | |
aNNiMON Супервизор Сейчас: Offline
Имя: Витёк Регистрация: 11.01.2010
| andreyKorotayev, уж не в градусах ты там с синусами работаешь? Переводи в радианы Math.toRadians(90) или сразу оперируй радианами: 90 градусов = Math.PI / 2
__________________
let live |
3.06.2014 / 22:44 | |
andreyKorotayev Пользователь Сейчас: Offline
Имя: Андрей Откуда: Запорожье Регистрация: 19.05.2014
| double angle=90.0d; Я просто писал dx=((float) Math.cos (angle))*speed и так же с синусами, а почему в синус надо другую меру измерения использовать?
|
3.06.2014 / 23:03 | |
andreyKorotayev Пользователь Сейчас: Offline
Имя: Андрей Откуда: Запорожье Регистрация: 19.05.2014
| Спасибо, я угол в радианы перевел и все заработало верно |
3.06.2014 / 23:48 | |
aNNiMON Супервизор Сейчас: Offline
Имя: Витёк Регистрация: 11.01.2010
| andreyKorotayev (03.06.2014/22:44)почему в синус надо другую меру измерения использовать?Потому что в доках ясно сказано Parameters: a - an angle, in radians. __________________
let live |
4.06.2014 / 00:08 | |
SeTSeR Пользователь Сейчас: Offline
Имя: Сергей Откуда: Где-то возле Москвы Регистрация: 01.07.2012
| Токмо я не понял, зачем синусы/косинусы? По одной координате скорость мяча прибавляется/отнимается от скорости отбивающей доски, по другой - меняет знак Согласен, ещё со времён когда я писал на MobileBasic, без всяких косинусов и синусов сделал MarioPong Изменено Magatino (4.06 / 00:28) (всего 1 раз) |
4.06.2014 / 01:06 | |
andreyKorotayev Пользователь Сейчас: Offline
Имя: Андрей Откуда: Запорожье Регистрация: 19.05.2014
| Так что угла 45 градусов достаточно + ускорение? Не заморачиваться с геометрией?
|