package wordcloud.collide.checkers; import wordcloud.collide.Collidable; import wordcloud.collide.Vector2d; import wordcloud.image.CollisionRaster; /** * Created by kenny on 7/1/14. */ public class RectanglePixelCollisionChecker implements CollisionChecker { private static final RectangleCollisionChecker RECTANGLE_COLLISION_CHECKER = new RectangleCollisionChecker(); /* ax,ay ___________ax + a.width | | | | | bx, by_________|__ bx + b.width | |(INTERSECTION)| | |__|______________| | ay + height | |______________________| by + height */ @Override public boolean collide(Collidable collidable, Collidable collidable2) { // check if bounding boxes intersect if(!RECTANGLE_COLLISION_CHECKER.collide(collidable, collidable2)) { return false; } final Vector2d position = collidable.getPosition(); final Vector2d position2 = collidable2.getPosition(); final CollisionRaster collisionRaster = collidable.getCollisionRaster(); final CollisionRaster collisionRaster2 = collidable2.getCollisionRaster(); // get the overlapping box int startX = Math.max(position.getX(), position2.getX()); int endX = Math.min(position.getX() + collidable.getWidth(), position2.getX() + collidable2.getWidth()); int startY = Math.max(position.getY(), position2.getY()); int endY = Math.min(position.getY() + collidable.getHeight(), position2.getY() + collidable2.getHeight()); for(int y = startY ; y < endY ; y++) { for(int x = startX ; x < endX ; x++) { // compute offsets for surface if((!collisionRaster2.isTransparent(x - position2.getX(), y - position2.getY())) && (!collisionRaster.isTransparent(x - position.getX(), y - position.getY()))) { return true; } } } return false; } }