org.apache.commons.math3.geometry.euclidean.twod

## Class NestedLoops

- java.lang.Object
- - org.apache.commons.math3.geometry.euclidean.twod.NestedLoops

     class NestedLoops
    extends java.lang.Object

This class represent a tree of nested 2D boundary loops.

This class is used for piecewise polygons construction. Polygons are built using the outline edges as representative of boundaries, the orientation of these lines are meaningful. However, we want to allow the user to specify its outline loops without having to take care of this orientation. This class is devoted to correct mis-oriented loops.

Orientation is computed assuming the piecewise polygon is finite, i.e. the outermost loops have their exterior side facing points at infinity, and hence are oriented counter-clockwise. The orientation of internal loops is computed as the reverse of the orientation of their immediate surrounding loop.

Since:
  3.0
Version:
  $Id: NestedLoops.java 1416643 2012-12-03 19:37:14Z tn $

### Field Summary

Fields
`private Vector2D[]` `loop` Boundary loop.
`private boolean` `originalIsClockwise` Indicator for original loop orientation.
`private Region<Euclidean2D>` `polygon` Polygon enclosing a finite region.
`private java.util.ArrayList<NestedLoops>` `surrounded` Surrounded loops.

### Constructor Summary

Constructors
`` `NestedLoops()` Simple Constructor.
`private` `NestedLoops(Vector2D[] loop)` Constructor.

### Method Summary

Methods
`private void` `add(NestedLoops node)` Add a loop in a tree.
`void` `add(Vector2D[] bLoop)` Add a loop in a tree.
`void` `correctOrientation()` Correct the orientation of the loops contained in the tree.
`private void` `setClockWise(boolean clockwise)` Set the loop orientation.

### Methods inherited from class java.lang.Object

`clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

### Field Detail

#### loop

    private Vector2D[] loop

Boundary loop.

#### surrounded

    private java.util.ArrayList<NestedLoops> surrounded

Surrounded loops.

#### polygon

    private Region<Euclidean2D> polygon

Polygon enclosing a finite region.

#### originalIsClockwise

    private boolean originalIsClockwise

Indicator for original loop orientation.

### Constructor Detail

#### NestedLoops

    public NestedLoops()

Simple Constructor.

Build an empty tree of nested loops. This instance will become the root node of a complete tree, it is not associated with any loop by itself, the outermost loops are in the root tree child nodes.

#### NestedLoops

    private NestedLoops(Vector2D[] loop)
                 throws MathIllegalArgumentException

Constructor.

Build a tree node with neither parent nor children

Parameters:
  `loop` - boundary loop (will be reversed in place if needed)
Throws:
  `MathIllegalArgumentException` - if an outline has an open boundary loop

### Method Detail

#### add

    public void add(Vector2D[] bLoop)
             throws MathIllegalArgumentException

Add a loop in a tree.

Parameters:
  `bLoop` - boundary loop (will be reversed in place if needed)
Throws:
  `MathIllegalArgumentException` - if an outline has crossing boundary loops or open boundary loops

#### add

    private void add(NestedLoops node)
              throws MathIllegalArgumentException

Add a loop in a tree.

Parameters:
  `node` - boundary loop (will be reversed in place if needed)
Throws:
  `MathIllegalArgumentException` - if an outline has boundary loops that cross each other

#### correctOrientation

    public void correctOrientation()

Correct the orientation of the loops contained in the tree.

This is this method that really inverts the loops that where provided through the `add` method if they are mis-oriented

#### setClockWise

    private void setClockWise(boolean clockwise)

Set the loop orientation.

Parameters:
  `clockwise` - if true, the loop should be set to clockwise orientation