vector<ofPoint*> ofxGetPointsFromPath(ofPath &path) { vector<ofPoint*> points; vector<ofSubPath> &subpaths = path.getSubPaths(); for (int i=0; i<subpaths.size(); i++) { vector<ofSubPath::Command> &commands = subpaths[i].getCommands(); for (int j=0; j<commands.size(); j++) { points.push_back(&commands[j].to); } } return points; }
//----------------------------------------------------------------------------------- void ofxCairoTexture::draw(ofPath & shape){ cairo_new_path(cr); vector<ofSubPath> & paths = shape.getSubPaths(); for(int i=0;i<(int)paths.size();i++){ draw(paths[i]); } cairo_fill_rule_t cairo_poly_mode; if(shape.getWindingMode()==OF_POLY_WINDING_ODD) cairo_poly_mode=CAIRO_FILL_RULE_EVEN_ODD; else cairo_poly_mode=CAIRO_FILL_RULE_WINDING; cairo_set_fill_rule(cr,cairo_poly_mode); ofColor prevColor; if(shape.getUseShapeColor()){ //printf("using color!\n"); prevColor = ofGetStyle().color; } if(shape.isFilled()){ if(shape.getUseShapeColor()){ ofColor c = shape.getFillColor() * ofGetStyle().color; c.a = shape.getFillColor().a/255. * ofGetStyle().color.a; //printf("color %i %i %i %i!\n", shape.getFillColor().r, shape.getFillColor().g, shape.getFillColor().b, shape.getFillColor().a); //printf("style %f %f %f %f!\n", (float)ofGetStyle().color.r/255.0, (float)ofGetStyle().color.g/255.0, (float)ofGetStyle().color.b/255.0, (float)ofGetStyle().color.a/255.0); //printf("alpha %f %f!\n", (float)c.a, ofGetStyle().color.a); cairo_set_source_rgba(cr, (float)c.r/255.0, (float)c.g/255.0, (float)c.b/255.0, (float)c.a/255.0); } if(shape.hasOutline()){ cairo_fill_preserve( cr ); }else{ cairo_fill(cr); } } if(shape.hasOutline()){ float lineWidth = ofGetStyle().lineWidth; if(shape.getUseShapeColor()){ ofColor c = shape.getFillColor() * ofGetStyle().color; c.a = shape.getFillColor().a/255. * ofGetStyle().color.a; cairo_set_source_rgba(cr, (float)c.r/255.0, (float)c.g/255.0, (float)c.b/255.0, (float)c.a/255.0); } cairo_set_line_width( cr, shape.getStrokeWidth() ); cairo_stroke( cr ); cairo_set_line_width( cr, lineWidth ); } if(shape.getUseShapeColor()){ setColor(prevColor); } ofPopStyle(); }
vector<ofPolyline> ofxGetPolylinesFromPath(ofPath path) { vector<ofPolyline> polylines; vector<ofSubPath> &subpaths = path.getSubPaths(); for (int i=0; i<subpaths.size(); i++) { ofPolyline poly; vector<ofSubPath::Command> &commands = subpaths[i].getCommands(); for (int j=0; j<commands.size()-1; j++) { poly.addVertex(commands[i].to); } polylines.push_back(poly); } return polylines; }
void ofxSimplifyPath(ofPath &path, int iterations, float amount, float distance) { //wat doet amount?? should be distance??? for (int iteration=0; iteration<iterations; iteration++) { vector<ofSubPath> &subpaths = path.getSubPaths(); for (int i=0; i<subpaths.size(); i++) { vector<ofSubPath::Command> &commands = subpaths[i].getCommands(); if (commands.size()<amount) continue; for (int j=1; j<commands.size()-2; j++) { //laat eerste en laatste punt met rust if (commands[j].to.distance(commands[j+1].to)<distance) { commands[j].to = (commands[j].to+commands[j+1].to)/2; commands.erase(commands.begin()+j+1); } } } } path.flagShapeChanged(); }
void ofxSimplifyPath(ofPath &path, int iterations, float amount) { for (int iteration=0; iteration<iterations; iteration++) { vector<ofSubPath> &subpaths = path.getSubPaths(); for (int i=0; i<subpaths.size(); i++) { vector<ofSubPath::Command> &commands = subpaths[i].getCommands(); if (commands.size()<amount) continue; for (int j=0; j<commands.size()-1; j++) { if (commands[j].to.distance(commands[j+1].to)<3) { commands[j].to = (commands[j].to+commands[j+1].to)/2; commands.erase(commands.begin()+j+1); } } } } path.flagShapeChanged(); }