public class VerticalDecomposition extends RenderableObject implements GameStateListener
Modifier and Type | Class and Description |
---|---|
protected static class |
VerticalDecomposition.DecompositionPoint
A structure to represent a point in the vertical decomposition.
|
protected static class |
VerticalDecomposition.DecompVertex
Represents a vertex in the search structure of the decomposition.
|
static class |
VerticalDecomposition.DecompVertexType
Enum to denote the type of a decomposition vertex.
|
static class |
VerticalDecomposition.Line
A line instance with equality based
on its end points, extended with
information about decomposition trapezoids.
|
class |
VerticalDecomposition.Trapezoid
Defines the trapezoid structure that is used in the Vertical decomposition.
|
Modifier and Type | Field and Description |
---|---|
private boolean |
animate
True if the vertical decomposition is animated and showing
individual segment updates.
|
private java.util.List<VerticalDecomposition.Line> |
lines
All line segments ever added into the vertical decomposition.
|
private java.util.List<VerticalDecomposition.Line> |
orientedSegments
The list of segments that have been added to the decomposition.
|
private java.util.List<VerticalDecomposition.DecompositionPoint> |
points
The list of points added to the decomposition.
|
private VerticalDecomposition.DecompVertex |
searchStructure
The search structure of the decomposition.
|
private java.util.Map<VerticalDecomposition.Line,ConvexObject> |
segToObj
Map of segments to the object above them or to
null
if that object is the playing field. |
private java.util.List<VerticalDecomposition.Trapezoid> |
trapezoids
The trapezoids of the decomposition.
|
private java.util.List<VerticalDecomposition.Line> |
verticalSegments
The list of vertical segments.
|
Constructor and Description |
---|
VerticalDecomposition()
Constructs a new blank vertical decomposition with a corresponding
search structure vertex.
|
VerticalDecomposition(java.util.List<ConvexObject> objects)
Constructs a new vertical decomposition with the given objects.
|
Modifier and Type | Method and Description |
---|---|
void |
abort()
Called when the game is aborted (forcefully terminated).
|
private void |
addedBorderVerticalSegment(VerticalDecomposition.Line segment,
VerticalDecomposition.Trapezoid trap)
Handles the case where the added vertical
segment is on the inside of a single trapezoid.
|
private void |
addedCompletelyInsideSingleTrapezoid(VerticalDecomposition.Line segment,
VerticalDecomposition.Trapezoid trap)
Updates the structures for case when the added segment
fits entirely inside one trapezoid inside the decomposition.
|
private void |
addedInternalVerticalSegment(VerticalDecomposition.Line segment,
VerticalDecomposition.Trapezoid trap)
Handles the case where the added vertical segment is on the inside of a single trapezoid.
|
private void |
addedIntersectsMultipleTrapezoids(VerticalDecomposition.Line orientedSegment,
ConvexObject obj)
Updates the structures for case when the added segment
crosses more than one trapezoid inside the decomposition.
|
private void |
addedIntersectsSingleTrapezoid(VerticalDecomposition.Line segment)
Adds a segment that only crosses one trapezoid inside the decomposition.
|
private void |
addedOnRightBorder(VerticalDecomposition.Line segment,
VerticalDecomposition.Trapezoid trap)
Updates the structures for case when the added segment
fits inside one trapezoid of the decomposition, except
for its right ending point.
|
private void |
addedVerticalSegment(VerticalDecomposition.Line segment)
Updates the search structure for the case
of an added vertical segment.
|
void |
addObject(ConvexObject obj)
Adds a new convex object to this vertical decomposition.
|
private void |
addPoint(VerticalDecomposition.DecompositionPoint point)
Adds a decomposition point to the list of decomposition points.
|
private void |
addSegment(java.awt.geom.Line2D seg,
ConvexObject obj)
Adds a line segment belonging to an object to
the vertical decomposition and updates the structures.
|
private void |
addSegmentEndpointsAsTrapezoidBoundingPoints(VerticalDecomposition.Trapezoid start,
VerticalDecomposition.Trapezoid end,
VerticalDecomposition.Line segment)
If the endpoints of the inserted segment are not bounding points of trapezoids
whose boundaries they lie on, they are added to their bounding points.
|
private void |
addTrapezoid(VerticalDecomposition.Trapezoid trap)
Adds a trapezoid to the list of trapezoids.
|
void |
claim(Player player,
ConvexObject obj)
Called when a player claims a new object.
|
private void |
distributeRightPoints(VerticalDecomposition.Trapezoid trap,
VerticalDecomposition.Trapezoid top,
VerticalDecomposition.Trapezoid bot,
VerticalDecomposition.Line segment)
Distributes the right bounding points of a given trapezoid between the two trapezoids that it is being split into.
|
void |
end()
Called when the game ends.
|
private java.util.Queue<VerticalDecomposition.Trapezoid> |
findIntersectedTrapezoids(java.awt.geom.Line2D seg,
ConvexObject obj)
Computes a list of trapezoids intersected by a line segment, excluding the leftmost and rightmost intersected trapezoids.
|
private void |
finishBotTrapezoid(VerticalDecomposition.Trapezoid trap,
VerticalDecomposition.Line segment,
VerticalDecomposition.Trapezoid bot)
Finishes a trapezoid that has just received one of the given parent trapezoid's right points below the given segment,
and assigns neighbourhoods between itself and the current trapezoid's neighbours.
|
private void |
finishTopTrapezoid(VerticalDecomposition.Trapezoid trap,
VerticalDecomposition.Line segment,
VerticalDecomposition.Trapezoid top)
Finishes a trapezoid that has just received one of the given parent trapezoid's right points above the given segment,
and assigns neighbourhoods between itself and the current trapezoid's neighbours.
|
java.util.List<java.awt.geom.Line2D> |
getDecompLines()
Gets a list of lines that represent the vertical
decomposition lines.
|
private VerticalDecomposition.Trapezoid |
getFirstIntersectedTrapezoid(java.awt.geom.Line2D seg)
Gets the first trapezoid to the right that is run through by a given segment.
|
int |
getHeight()
Computes the height of the vertical decomposition as the
length of the longest path to any trapezoid in the search structure.
|
java.awt.geom.Line2D |
getLastLine()
Gets the last line segment added into the vertical decomposition.
|
java.util.List<? extends java.awt.geom.Line2D> |
getLines()
Gets all lines that were ever added to the vertical decomposition.
|
ConvexObject |
getObjectOfSegment(VerticalDecomposition.Line segment)
Gets the object that the segment points to.
|
private VerticalDecomposition.DecompositionPoint |
getOrCreatePoint(java.awt.geom.Point2D point)
Gets the decomposition point at the given point or adds a new point if it doesn't exist and returns it.
|
private VerticalDecomposition.DecompositionPoint |
getPoint(java.awt.geom.Point2D point)
Gets a decomposition point for a given query point.
|
java.util.List<VerticalDecomposition.Trapezoid> |
getTrapezoids()
Gets all the trapezoids that make up the vertical decomposition.
|
private VerticalDecomposition.Trapezoid |
handleFirstTrapezoid(VerticalDecomposition.Trapezoid trap,
java.awt.geom.Point2D leftp)
Handles the special case of the current trapezoid being the first
of the many intersected by the inserted segment.
|
private VerticalDecomposition.Trapezoid |
handleLastTrapezoid(VerticalDecomposition.Trapezoid trap,
java.awt.geom.Point2D rightp)
Handles the special case of the current trapezoid being the last
of the many intersected by the inserted segment.
|
boolean |
isAnimated()
Checks if the vertical decomposition is animated,
meaning it is showing individual segment updates.
|
void |
merge(Player player,
ConvexObject source,
ConvexObject target,
ConvexObject result,
java.util.List<ConvexObject> absorbed)
Called when a player performs a merge.
|
private VerticalDecomposition.Trapezoid |
newBot(VerticalDecomposition.Trapezoid trap,
VerticalDecomposition.Line segment)
Creates a new trapezoid from the part of a given
trapezoid that lies below a given segment.
|
private VerticalDecomposition.Trapezoid |
newTop(VerticalDecomposition.Trapezoid trap,
VerticalDecomposition.Line segment)
Creates a new trapezoid from the part of a given
trapezoid that lies above a given segment.
|
ConvexObject |
queryObject(double x,
double y)
Queries the convex object that is at the given position.
|
VerticalDecomposition.Trapezoid |
queryTrapezoid(double x,
double y)
Queries the trapezoid that is at the given position.
|
VerticalDecomposition.Trapezoid |
queryTrapezoid(java.awt.geom.Point2D point)
Queries the trapezoid that is at the given position.
|
private void |
removePoint(VerticalDecomposition.DecompositionPoint point)
Removes a decomposition point from the list of decomposition points.
|
private void |
removeTrapezoid(VerticalDecomposition.Trapezoid trap)
Removes a trapezoid from the structure, freeing its neighbours
and disassociating it from its decomposition vertex.
|
void |
render(java.awt.Graphics2D g)
Renders this object.
|
private void |
replaceOverlappedSegment(VerticalDecomposition.Line shortLine,
VerticalDecomposition.Line line)
Replaces a given line segment and line segments between its end points and points collinear with the line,
with a segment that overlaps the union of the shorter line segments.
|
void |
setAnimated(boolean animated)
Sets whether the vertical decomposition is animated and
showing individual segment updates.
|
getAnimation, hasAnimation, renderOrAnimate, runAnimation, setAnimation
private final java.util.List<VerticalDecomposition.Trapezoid> trapezoids
private final VerticalDecomposition.DecompVertex searchStructure
private java.util.List<VerticalDecomposition.Line> orientedSegments
private java.util.List<VerticalDecomposition.Line> verticalSegments
private java.util.Map<VerticalDecomposition.Line,ConvexObject> segToObj
null
if that object is the playing field.private java.util.List<VerticalDecomposition.DecompositionPoint> points
private java.util.List<VerticalDecomposition.Line> lines
private boolean animate
public VerticalDecomposition()
Constants.PLAYFIELD_WIDTH
and Constants.PLAYFIELD_HEIGHT
.public VerticalDecomposition(java.util.List<ConvexObject> objects) throws java.lang.InterruptedException
Constants.PLAYFIELD_WIDTH
and Constants.PLAYFIELD_HEIGHT
.objects
- The objects that the vertical decomposition
will contain at the beginning.java.lang.InterruptedException
- When the game is aborted.public java.util.List<? extends java.awt.geom.Line2D> getLines()
public java.awt.geom.Line2D getLastLine()
public ConvexObject getObjectOfSegment(VerticalDecomposition.Line segment)
segment
- The segment for which to fetch its object.null
in case the segment is oriented from right to
left during addition (on the top of the object).public void setAnimated(boolean animated)
animated
- True to animate segment updates.public java.util.List<VerticalDecomposition.Trapezoid> getTrapezoids()
private void addTrapezoid(VerticalDecomposition.Trapezoid trap)
trap
- The trapezoid to be added to the list.private void removeTrapezoid(VerticalDecomposition.Trapezoid trap)
trap
- The trapezoid to be removed.public void addObject(ConvexObject obj) throws java.lang.InterruptedException
obj
- The convex object to add.java.lang.InterruptedException
- When the game is aborted.public boolean isAnimated()
public ConvexObject queryObject(double x, double y)
null
is returned.x
- The x-coordinate of the query point.y
- The y-coordinate of the query point.null
if there is no convex object at
the given position.public VerticalDecomposition.Trapezoid queryTrapezoid(double x, double y)
null
is returned.x
- The x-coordinate of the query point.y
- The y-coordinate of the query point.null
is there is no convex object at
the given position.public VerticalDecomposition.Trapezoid queryTrapezoid(java.awt.geom.Point2D point)
null
is returned.point
- The query point.null
is there is no convex object at
the given position.public int getHeight()
VerticalDecomposition.Trapezoid.getDepth()
public java.util.List<java.awt.geom.Line2D> getDecompLines()
private VerticalDecomposition.DecompositionPoint getOrCreatePoint(java.awt.geom.Point2D point)
point
- The point at which to add a new decomposition point.private void addPoint(VerticalDecomposition.DecompositionPoint point)
point
- The decomposition point to add to the list.private void removePoint(VerticalDecomposition.DecompositionPoint point)
point
- The decomposition point to remove from the list.private VerticalDecomposition.DecompositionPoint getPoint(java.awt.geom.Point2D point)
point
- The query point to look for in the list.null
otherwise.private VerticalDecomposition.Trapezoid getFirstIntersectedTrapezoid(java.awt.geom.Line2D seg)
seg
- The query segment. The first point is assumed to lie to the left, or below the second point.private void replaceOverlappedSegment(VerticalDecomposition.Line shortLine, VerticalDecomposition.Line line)
shortLine
- The central line segment (short merge line).line
- The overlapping union segment.private void addSegment(java.awt.geom.Line2D seg, ConvexObject obj) throws java.lang.InterruptedException
seg
- The line segment to add to the decomposition.obj
- The object that the segment belongs to.java.lang.InterruptedException
- When the game is aborted.private void addedVerticalSegment(VerticalDecomposition.Line segment)
segment
- The added segment. Its first point
is always the lower leftmost point.private void addedInternalVerticalSegment(VerticalDecomposition.Line segment, VerticalDecomposition.Trapezoid trap)
segment
- The added vertical segment.trap
- The trapezoid that contains the segment.private void addedBorderVerticalSegment(VerticalDecomposition.Line segment, VerticalDecomposition.Trapezoid trap)
segment
- The added vertical segment.trap
- The trapezoid whose border
the segment lies on.private void addedIntersectsSingleTrapezoid(VerticalDecomposition.Line segment)
segment
- The segment to add to the decomposition.private void addedCompletelyInsideSingleTrapezoid(VerticalDecomposition.Line segment, VerticalDecomposition.Trapezoid trap)
segment
- The segment that was added.trap
- The trapezoid that the segment is contained inside.private void addedOnRightBorder(VerticalDecomposition.Line segment, VerticalDecomposition.Trapezoid trap)
segment
- The segment that was added.trap
- The trapezoid that the segment is contained inside.private void addedIntersectsMultipleTrapezoids(VerticalDecomposition.Line orientedSegment, ConvexObject obj)
orientedSegment
- The segment that was added to the decomposition.obj
- The object that orientedSegment should point towards.private void addSegmentEndpointsAsTrapezoidBoundingPoints(VerticalDecomposition.Trapezoid start, VerticalDecomposition.Trapezoid end, VerticalDecomposition.Line segment)
start
- The starting Trapezoid that was intersected by the segment.end
- The ending Trapezoid that was intersected by the segment.segment
- THe newly added segment.private VerticalDecomposition.Trapezoid handleFirstTrapezoid(VerticalDecomposition.Trapezoid trap, java.awt.geom.Point2D leftp)
trap
- The trapezoid intersected by the inserted segment.leftp
- The left point of the inserted segment.private VerticalDecomposition.Trapezoid handleLastTrapezoid(VerticalDecomposition.Trapezoid trap, java.awt.geom.Point2D rightp)
trap
- The trapezoid intersected by the inserted segment.rightp
- The right point of the inserted segment.private VerticalDecomposition.Trapezoid newTop(VerticalDecomposition.Trapezoid trap, VerticalDecomposition.Line segment)
trap
- The trapezoid that is split.segment
- The newly inserted segment that splits the trapezoid.private VerticalDecomposition.Trapezoid newBot(VerticalDecomposition.Trapezoid trap, VerticalDecomposition.Line segment)
trap
- The trapezoid that is split.segment
- The newly inserted segment that splits the trapezoid.private void distributeRightPoints(VerticalDecomposition.Trapezoid trap, VerticalDecomposition.Trapezoid top, VerticalDecomposition.Trapezoid bot, VerticalDecomposition.Line segment)
trap
- The initial trapezoid that is being split.top
- The top trapezoid resulting from the split.bot
- The bottom trapezoid resulting from the split.segment
- The inserted line segment that splits the trapezoid into top and bot.private void finishTopTrapezoid(VerticalDecomposition.Trapezoid trap, VerticalDecomposition.Line segment, VerticalDecomposition.Trapezoid top)
trap
- The parent trapezoid.segment
- The splitting segment, which is the bottom bounding segment of top.top
- The top trapezoid created by splitting trap with segment.private void finishBotTrapezoid(VerticalDecomposition.Trapezoid trap, VerticalDecomposition.Line segment, VerticalDecomposition.Trapezoid bot)
trap
- The parent trapezoid.segment
- The splitting segment, which is the top bounding segment of bot.bot
- The bottom trapezoid created by splitting trap with segment.private java.util.Queue<VerticalDecomposition.Trapezoid> findIntersectedTrapezoids(java.awt.geom.Line2D seg, ConvexObject obj)
seg
- The line segment.obj
- The object that the segment is added for.public void claim(Player player, ConvexObject obj)
GameStateListener
claim
in interface GameStateListener
player
- The player that made the claim.obj
- The object that was claimed.public void merge(Player player, ConvexObject source, ConvexObject target, ConvexObject result, java.util.List<ConvexObject> absorbed) throws java.lang.InterruptedException
GameStateListener
merge
in interface GameStateListener
player
- The player that performed the merge.source
- The object the merge was started from.target
- The target object of the merge.result
- The object resulting from the merge.absorbed
- The objects absorbed in the merge.java.lang.InterruptedException
- When the player was
interrupted while making its move. Signalling
that the game was aborted.public void end()
GameStateListener
end
in interface GameStateListener
public void abort()
GameStateListener
abort
in interface GameStateListener
public void render(java.awt.Graphics2D g)
RenderableObject
render
in class RenderableObject
g
- The graphics context to use.