freerouting/src/main/java/eu/mihosoft/freerouting/autoroute/FreeSpaceExpansionRoom.java

144 lines
3.4 KiB
Java

/*
* Copyright (C) 2014 Alfons Wirtz
* website www.freerouting.net
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License at <http://www.gnu.org/licenses/>
* for more details.
*
* FreeSpaceExpansionRoom.java
*
* Created on 29. Dezember 2003, 08:37
*/
package eu.mihosoft.freerouting.autoroute;
import eu.mihosoft.freerouting.geometry.planar.TileShape;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
/**
* Expansion Areas used by the maze search algorithm.
*
* @author Alfons Wirtz
*/
public abstract class FreeSpaceExpansionRoom implements ExpansionRoom
{
/**
* Creates a new instance of FreeSpaceExpansionRoom.
* The shape is normally unbounded at construction time of this room.
* The final (completed) shape will be a subshape of the start shape, which
* does not overlap with any obstacle, and is as big as possible.
* p_contained_points will remain contained in the shape, after it is completed.
*/
public FreeSpaceExpansionRoom(TileShape p_shape, int p_layer)
{
shape = p_shape;
layer = p_layer;
doors = new LinkedList<ExpansionDoor>();
}
/**
* Adds p_door to the list of doors of this room.
*/
public void add_door(ExpansionDoor p_door)
{
this.doors.add(p_door);
}
/**
* Returns the list of doors of this room to neighbour expansion rooms
*/
public List<ExpansionDoor> get_doors()
{
return this.doors;
}
/**
* Removes all doors from this room.
*/
public void clear_doors()
{
this.doors = new LinkedList<ExpansionDoor>();
}
public void reset_doors()
{
for (ExpandableObject curr_door : this.doors)
{
curr_door.reset();
}
}
public boolean remove_door(ExpandableObject p_door)
{
return this.doors.remove(p_door);
}
/**
* Gets the shape of this room
*/
public TileShape get_shape()
{
return this.shape;
}
/**
* sets the shape of this room
*/
public void set_shape(TileShape p_shape)
{
this.shape = p_shape;
}
public int get_layer()
{
return this.layer;
}
/**
* Checks, if this room has already a door to p_other
*/
public boolean door_exists(ExpansionRoom p_other)
{
if (doors == null)
{
return false;
}
Iterator<ExpansionDoor> it = doors.iterator();
while (it.hasNext())
{
ExpansionDoor curr_door = it.next();
if (curr_door.first_room == p_other || curr_door.second_room == p_other)
{
return true;
}
}
return false;
}
/** The layer of this room */
private final int layer;
/** The shape of this room */
private TileShape shape;
/** The list of doors to neighbour expansion rooms */
private List<ExpansionDoor> doors;
}