/*******************************************************************************
* Copyright 2010 Simon Mieth
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
******************************************************************************/
package org.kabeja.math;
import java.util.Iterator;
public class NURBSFixedNTELSPointIterator implements Iterator <Point3D>{
private NURBS nurbs;
private int ntels;
private double dt = 0;
private double t = 0;
private int interval;
private int lastInterval;
/**
*
* @param nurbs
* The NURBS curve to draw
* @param ntels
* the ntels per interval to use
*/
public NURBSFixedNTELSPointIterator(NURBS nurbs, int ntels) {
this.nurbs = nurbs;
this.ntels = ntels;
if (this.nurbs.getKnots().length == (this.nurbs.getDegree() +
this.nurbs.controlPoints.length + 1)) {
this.lastInterval = this.nurbs.getKnots().length -
this.nurbs.getDegree() - 1;
this.interval = this.nurbs.getDegree();
} else if (this.nurbs.getKnots().length > 0) {
// find self the start and end interval
this.interval = 0;
double start = this.nurbs.getKnots()[0];
while (start == this.nurbs.getKnots()[this.interval + 1]) {
this.interval++;
}
this.lastInterval = this.nurbs.getKnots().length - 1;
double end = this.nurbs.getKnots()[this.lastInterval];
while (end == this.nurbs.getKnots()[this.lastInterval]) {
this.lastInterval--;
}
}
//init t
this.t = this.nurbs.getKnots()[this.nurbs.getDegree()];
this.nextInterval();
//fix for some broken nurbs
if ((this.interval - 1) < this.nurbs.getDegree()) {
this.interval = this.nurbs.getDegree() + 1;
}
}
public boolean hasNext() {
if (this.t < this.nurbs.getKnots()[this.interval]) {
return true;
} else if (this.interval < this.lastInterval) {
this.nextInterval();
return hasNext();
}
return false;
}
public Point3D next() {
Point3D p = this.nurbs.getPointAt(this.interval - 1, t);
// System.out.println("t="+t);
// Point p = this.nurbs.getPointAt(t);
this.t += this.dt;
return p;
}
public void remove() {
//nothing todo here
}
protected void nextInterval() {
this.interval++;
while ((this.t > this.nurbs.getKnots()[this.interval]) &&
(this.interval < this.lastInterval)) {
this.interval++;
}
double length = this.nurbs.getKnots()[this.interval] - this.t;
this.dt = length / this.ntels;
}
}