Использование CGRectIntersectsRect для обнаружения столкновений

У меня есть длинное прямоугольное изображение, которое повернуто под разными углами. Однако рамка прямоугольного изображения не вращается вместе с изображением, а вместо этого вращение заставляет рамку увеличиваться в размерах, чтобы соответствовать повернутому изображению. Поэтому, когда я использовал CGRectIntersectsRect, обнаружение столкновений полностью отключено, потому что другое изображение, сталкивающееся с прямоугольным изображением, столкнется, прежде чем оно даже достигнет видимой области прямоугольного изображения. Если вы действительно не понимаете, о чем я говорю, взгляните на рисунок в формате ascii:

нормальный прямоугольный кадр изображения, O -> пикселей, |, - -> кадр

|----------|
|OOOOOOOOOO|
|----------|

после вращения

|----------|
|O         |
| O        |
|  O       |
|   O      |
|    O     |
|     O    |
|      O   |
|       O  |
|        O |
|----------|

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


person Coke2Code    schedule 09.04.2010    source источник
comment
Это будет называться столкновением OBB (ориентированной ограничивающей рамки) - google.co.uk/ поиск? q = obb + collision   -  person Chris Burt-Brown    schedule 09.04.2010


Ответы (2)


Если вы используете Mac, вы можете использовать -[NSImage hitTestRect:withImageDestinationRect:context:hints:flipped:], чтобы решить, пересекает ли конкретный прямоугольник непрозрачные пиксели вашего изображения. См. Комментарий в заголовке для использования.

person Ken    schedule 09.04.2010
comment
Я нашел его в документации, но не могу его использовать. мое автоматическое завершение предложения останавливается на hitTest, а hitTestRect нет. погуглил тоже, но не вернул никакой полезной информации - person Coke2Code; 09.04.2010
comment
Загляните в заголовки. NSImage.h. - person Ken; 02.12.2010

Вы не можете использовать свойство frame объекта UIView для столкновений с повернутыми объектами, поскольку frame перестает действовать, как только вы начинаете преобразовывать представление. Вам нужно придумать какое-то нестандартное решение. Что именно это будет, зависит от многих вещей, особенно от производительности.

Вы можете создать геометрическую огибающую столкновения для изображения, многоугольник, который вы можете вращать вместе с изображением. Или вы можете использовать обнаружение столкновений с точностью до пикселя в сочетании с простой проверкой границ, чтобы избежать дорогостоящей проверки пикселей, когда это возможно. А если вы действительно хотите пофантазировать, вы можете прибегнуть к полному физическому симулятору, например, Box2D. .

Если вам нужен лучший совет, дайте нам более подробную информацию. Как часто нужно проверять наличие столкновений? Один раз? 40 раз в секунду?

person zoul    schedule 09.04.2010
comment
У меня действительно нет более подробной информации, которую я могу дать вам сейчас. Моя основная цель здесь - обнаружить столкновение между CGrect и повернутым прямоугольным изображением. Поскольку CGRectIntersectRect в этом случае не сработает, мне придется взглянуть на ваши предложения - person Coke2Code; 09.04.2010