Exemplo n.º 1
0
//------------------------------------------------------------
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;
}
Exemplo n.º 2
0
//--------------------------------------------------
ofPoint ofPolyline::getPointAtLength(float f) const {
    if(points.size() < 2) return ofPoint();
    updateCache();
    return getPointAtIndexInterpolated(getIndexAtLength(f));
}
Exemplo n.º 3
0
//--------------------------------------------------
float ofPolyline::getIndexAtPercent(float f) const {
    return getIndexAtLength(f * getPerimeter());
}