/**
* File: CirculinearDomain2DUtils.java
* Project: javaGeom
*
* Distributed under the LGPL License.
*
* Created: 16 mai 09
*/
package math.geom2d.circulinear;
import java.util.ArrayList;
import java.util.Collection;
import math.geom2d.Shape2D;
/**
* Some utilities for working with circulinear curves.
* @author dlegland
*
*/
public class CirculinearDomains2D {
public final static CirculinearDomain2D computeBuffer(
CirculinearDomain2D domain, double dist) {
ArrayList rings =
new ArrayList();
// iterate on all continuous curves
for(CirculinearContour2D contour : domain.contours()) {
// split the curve into a set of non self-intersecting curves
for(CirculinearContinuousCurve2D simpleCurve :
CirculinearCurves2D.splitContinuousCurve(contour)) {
CirculinearContour2D boundary =
new BoundaryPolyCirculinearCurve2D(
simpleCurve.smoothPieces(), contour.isClosed());
// compute the rings composing the simple curve buffer
rings.addAll(computeBufferSimpleRing(boundary, dist));
}
}
// All the rings are created, we can now create a new domain with the
// set of rings
return new GenericCirculinearDomain2D(
new CirculinearContourArray2D(rings));
}
/**
* Computes the rings that form the domain of a circulinear curve which
* does not self-intersect.
*/
public final static Collection
computeBufferSimpleRing(CirculinearContour2D curve, double d) {
// prepare an array to store the set of rings
ArrayList rings =
new ArrayList();
// the parallel in the positive side
CirculinearContinuousCurve2D parallel1 = curve.parallel(d);
// split each parallel into continuous curves
CirculinearCurveArray2D curves =
new CirculinearCurveArray2D();
// select only curve parts which do not cross original curve
for(CirculinearContinuousCurve2D split :
CirculinearCurves2D.splitContinuousCurve(parallel1)) {
if(CirculinearCurves2D.findIntersections(curve, split).size()==0)
curves.add(split);
}
// create a new boundary for each parallel curve
for(CirculinearContinuousCurve2D split : curves) {
rings.add(
new BoundaryPolyCirculinearCurve2D(
split.smoothPieces(), split.isClosed()));
}
// prepare an array to store the set of rings
ArrayList rings2 =
new ArrayList();
// iterate on the set of rings
for(CirculinearContour2D ring : rings)
// split rings into curves which do not self-intersect
for(CirculinearContinuousCurve2D split :
CirculinearCurves2D.splitContinuousCurve(ring)) {
// compute distance to original curve
// (assuming it is sufficient to compute distance to vertices
// of the reference curve).
double dist = CirculinearCurves2D.getDistanceCurvePoints(
curve, split.singularPoints());
// check if distance condition is verified
if(dist-d<-Shape2D.ACCURACY)
continue;
// convert the set of elements to a Circulinear ring
rings2.add(
new BoundaryPolyCirculinearCurve2D(
split.smoothPieces(), split.isClosed()));
}
// return the set of created rings
return rings2;
}
}
Ads help maintain this website.