package com.interview.flag.g; import java.util.ArrayList; import java.util.Iterator; import java.util.List; /** * Created_By: stefanie * Date: 15-1-26 * Time: 下午7:51 */ public class G34_CollisionDetection_Quadtree { G34_QuadtreeNode<G34_QuadtreeNode.Rectangle> tree; public G34_CollisionDetection_Quadtree(G34_QuadtreeNode.Rectangle bound){ tree = new G34_QuadtreeNode(0, bound); } public void add(G34_QuadtreeNode.Rectangle rectangle){ tree.insert(rectangle); } public List<G34_QuadtreeNode.Rectangle> collision(G34_QuadtreeNode.Rectangle rectangle){ List candidates = new ArrayList(); tree.retrieve(candidates, rectangle); Iterator<G34_QuadtreeNode.Rectangle> iterator = candidates.iterator(); while(iterator.hasNext()){ G34_QuadtreeNode.Rectangle item = iterator.next(); if(!hasIntersection(rectangle, item)) iterator.remove(); } return candidates; } private boolean hasIntersection(G34_QuadtreeNode.Rectangle r1, G34_QuadtreeNode.Rectangle r2){ if(r1.y >= r2.y + r2.height || r2.y >= r1.y + r1.height || r1.x >= r2.x + r2.width || r2.x >= r1.x + r1.width) return false; return true; } public static void main(String[] args){ G34_CollisionDetection_Quadtree detector = new G34_CollisionDetection_Quadtree(new G34_QuadtreeNode.Rectangle(0,0,10,10)); detector.add(new G34_QuadtreeNode.Rectangle(0, 2, 3, 2)); detector.add(new G34_QuadtreeNode.Rectangle(1, 6, 4, 3)); detector.add(new G34_QuadtreeNode.Rectangle(7, 3, 2, 1)); detector.add(new G34_QuadtreeNode.Rectangle(4, 5, 2, 4)); detector.add(new G34_QuadtreeNode.Rectangle(6, 8, 1, 1)); detector.add(new G34_QuadtreeNode.Rectangle(7, 7, 1, 2)); detector.add(new G34_QuadtreeNode.Rectangle(2, 2, 2, 1)); detector.add(new G34_QuadtreeNode.Rectangle(3, 8, 2, 1)); detector.add(new G34_QuadtreeNode.Rectangle(0, 4, 4, 5)); detector.add(new G34_QuadtreeNode.Rectangle(8, 1, 1, 3)); detector.add(new G34_QuadtreeNode.Rectangle(7, 2, 1, 1)); List<G34_QuadtreeNode.Rectangle> collision = detector.collision(new G34_QuadtreeNode.Rectangle(5,5,1,1)); System.out.println("Collision for (5,5,6,6)"); for(G34_QuadtreeNode.Rectangle rectangle : collision) rectangle.print(); //(4, 5) to (6, 9) collision = detector.collision(new G34_QuadtreeNode.Rectangle(3,3,4,4)); System.out.println("Collision for (3,3,7,7)"); for(G34_QuadtreeNode.Rectangle rectangle : collision) rectangle.print(); //(0, 4) to (4, 9); (4, 5) to (6, 9); (1, 6) to (5, 9) collision = detector.collision(new G34_QuadtreeNode.Rectangle(3,3,6,5)); System.out.println("Collision for (3,3,9,8)"); for(G34_QuadtreeNode.Rectangle rectangle : collision) rectangle.print(); //(0, 4) to (4, 9); (4, 5) to (6, 9); (1, 6) to (5, 9); (7, 7) to (8, 9); (8, 1) to (9, 4); (7, 3) to (9, 4) } }