//------------------------------------------------------------ ofxPolyline ofxPolyline::getResampledAndVerticesBySpacing(float spacing) { // Get resampled points while keeping vertices ofxPolyline polyline; polyline.setStrokeLinecap(getStrokeLinecap()); polyline.setStrokeLinejoin(getStrokeLinejoin()); float totalLength = getPerimeter(); int currentIndex = 1; ofVec2f prevPoint = ofVec2f(FLT_MAX, FLT_MAX); for(float f=0; f<totalLength; f += spacing) { float index = getIndexAtLength(f); while (index > currentIndex) { ofVec2f newPoint = (*this)[currentIndex]; // Don't add if this point is very close to the prev point if (!newPoint.match(prevPoint)) { polyline.lineTo(newPoint); prevPoint = newPoint; } currentIndex++; } ofVec2f newPoint = getPointAtLength(f); // Don't add if this point is very close to the prev point if (!newPoint.match(prevPoint)) { polyline.lineTo(newPoint); prevPoint = newPoint; } } if(!isClosed()) { if(polyline.size() > 0) { polyline[polyline.size()-1] = (*this)[size()-1]; } polyline.setClosed(false); } else { polyline.setClosed(true); } return polyline; }
//-------------------------------------------------- ofPoint ofPolyline::getPointAtLength(float f) const { if(points.size() < 2) return ofPoint(); updateCache(); return getPointAtIndexInterpolated(getIndexAtLength(f)); }
//-------------------------------------------------- float ofPolyline::getIndexAtPercent(float f) const { return getIndexAtLength(f * getPerimeter()); }