/*
* Copyright (c) 2005 by L. Paul Chew.
*
* Permission is hereby granted, without written agreement and without
* license or royalty fees, to use, copy, modify, and distribute this
* software and its documentation for any purpose, subject to the following
* conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*/
package org.openjump.core.graph.delauneySimplexInsert;
import java.util.AbstractSet;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
/**
* A Simplex is an immutable set of vertices (usually Pnts).
*
* @author Paul Chew
*
* Created July 2005. Derived from an earlier, messier version.
*/
class Simplex extends AbstractSet implements Set {
private List vertices; // The simplex's vertices
private long idNumber; // The id number
private static long idGenerator = 0; // Used to create id numbers
public static boolean moreInfo = false; // True iff more info in toString
/**
* Constructor.
* @param collection a Collection holding the Simplex vertices
* @throws IllegalArgumentException if there are duplicate vertices
*/
public Simplex (Collection collection) {
this.vertices = Collections.unmodifiableList(new ArrayList(collection));
this.idNumber = idGenerator++;
Set noDups = new HashSet(this);
if (noDups.size() != this.vertices.size())
throw new IllegalArgumentException("Duplicate vertices in Simplex");
}
/**
* Constructor.
* @param vertices the vertices of the Simplex.
* @throws IllegalArgumentException if there are duplicate vertices
*/
public Simplex (Object[] vertices) {
this(Arrays.asList(vertices));
}
/**
* String representation.
* @return the String representation of this Simplex
*/
public String toString () {
if (!moreInfo) return "Simplex" + idNumber;
return "Simplex" + idNumber + super.toString();
}
/**
* Dimension of the Simplex.
* @return dimension of Simplex (one less than number of vertices)
*/
public int dimension () {
return this.vertices.size() - 1;
}
/**
* True iff simplices are neighbors.
* Two simplices are neighbors if they are the same dimension and they share
* a facet.
* @param simplex the other Simplex
* @return true iff this Simplex is a neighbor of simplex
*/
public boolean isNeighbor (Simplex simplex) {
HashSet h = new HashSet(this);
h.removeAll(simplex);
return (this.size() == simplex.size()) && (h.size() == 1);
}
/**
* Report the facets of this Simplex.
* Each facet is a set of vertices.
* @return an Iterable for the facets of this Simplex
*/
public List facets () {
List theFacets = new LinkedList();
for (Iterator it = this.iterator(); it.hasNext();) {
Object v = it.next();
Set facet = new HashSet(this);
facet.remove(v);
theFacets.add(facet);
}
return theFacets;
}
/**
* Report the boundary of a Set of Simplices.
* The boundary is a Set of facets where each facet is a Set of vertices.
* @return an Iterator for the facets that make up the boundary
*/
public static Set boundary (Set simplexSet) {
Set theBoundary = new HashSet();
for (Iterator it = simplexSet.iterator(); it.hasNext();) {
Simplex simplex = (Simplex) it.next();
for (Iterator otherIt = simplex.facets().iterator(); otherIt.hasNext();) {
Set facet = (Set) otherIt.next();
if (theBoundary.contains(facet)) theBoundary.remove(facet);
else theBoundary.add(facet);
}
}
return theBoundary;
}
/* Remaining methods are those required by AbstractSet */
/**
* @return Iterator for Simplex's vertices.
*/
public Iterator iterator () {
return this.vertices.iterator();
}
/**
* @return the size (# of vertices) of this Simplex
*/
public int size () {
return this.vertices.size();
}
/**
* @return the hashCode of this Simplex
*/
public int hashCode () {
return (int)(idNumber^(idNumber>>>32));
}
/**
* We want to allow for different simplices that share the same vertex set.
* @return true for equal Simplices
*/
public boolean equals (Object o) {
return (this == o);
}
}