public void InsertData(Node RootNode, Point DataPoint) throws Exception{
    	
    	//find the Node for this datapoint
    	Node NodeToWorkWith = SearchTree(RootNode, DataPoint.X, DataPoint.Z);
    	
    	//check to see if datapoint already exists
		if(NodeToWorkWith.Data == DataPoint) throw new Exception("You asshole, that one already exists");
		
		//check to see if the datapoint is on a boundary line
		if(DataPoint.X == NodeToWorkWith.UpperLeft.X || DataPoint.X == NodeToWorkWith.UpperRight.X ||
			DataPoint.Z == NodeToWorkWith.UpperLeft.Z || DataPoint.Z == NodeToWorkWith.LowerLeft.Z){
			System.out.println("Point is on boundary");
			return;
		}
    	
    	//check to see if this node already has a datapoint
    	if(NodeToWorkWith.Data != null){
    		
    		//if it does we need to partition it
    		//get the points for the child nodes corners
			Point Up = new Point(NodeToWorkWith.UpperLeft.X + ((NodeToWorkWith.UpperRight.X - NodeToWorkWith.UpperLeft.X)/2), 0 , NodeToWorkWith.UpperLeft.Z);
			Point Down = new Point(NodeToWorkWith.LowerLeft.X + ((NodeToWorkWith.LowerRight.X - NodeToWorkWith.LowerLeft.X)/2),0,NodeToWorkWith.LowerLeft.Z);
			Point Left = new Point(NodeToWorkWith.LowerLeft.X,0,NodeToWorkWith.LowerLeft.Z +((NodeToWorkWith.UpperLeft.Z - NodeToWorkWith.LowerLeft.Z)/2));
			Point Right = new Point(NodeToWorkWith.LowerRight.X,0,NodeToWorkWith.LowerRight.Z +((NodeToWorkWith.UpperRight.Z - NodeToWorkWith.LowerRight.Z)/2));
			Point Center = new Point(NodeToWorkWith.LowerLeft.X + ((NodeToWorkWith.LowerRight.X - NodeToWorkWith.LowerLeft.X)/2),0,NodeToWorkWith.LowerRight.Z +((NodeToWorkWith.UpperRight.Z - NodeToWorkWith.LowerRight.Z)/2));
			
			//create the Child Nodes
			Node NorthWestChild = new Node(NodeToWorkWith,NodeToWorkWith.UpperLeft, Up, Left, Center);
			Node NorthEastChild = new Node(NodeToWorkWith, Up, NodeToWorkWith.UpperRight, Center, Right);
			Node SouthWestChild = new Node(NodeToWorkWith, Left, Center, NodeToWorkWith.LowerLeft, Down);
			Node SouthEastChild = new Node(NodeToWorkWith,Center,Right,Down, NodeToWorkWith.LowerRight);
			
			//set the children of the current node
			NodeToWorkWith.NorthWest = NorthWestChild;
			NodeToWorkWith.NorthEast = NorthEastChild;
			NodeToWorkWith.SouthWest = SouthWestChild;
			NodeToWorkWith.SouthEast = SouthEastChild;
			
			//now we try to insert the two datapoints
			InsertData(NodeToWorkWith,NodeToWorkWith.Data);
			InsertData(NodeToWorkWith, DataPoint);
			
    	}
    	else{
    		NodeToWorkWith.Data = DataPoint;
    	}
    	
    	
    }