void draw(cairo_t *cr, std::ostringstream *notify, int width, int height, bool save, std::ostringstream *timer_stream) { D2<SBasis> skeleton = skel_handles.asBezier(); D2<SBasis> pattern = pat_handles.asBezier(); cairo_set_line_width(cr,1.); cairo_pw_d2_sb(cr, Piecewise<D2<SBasis> >(skeleton)); cairo_set_source_rgba(cr,0.0,0.0,1.0,1.0); cairo_stroke(cr); cairo_pw_d2_sb(cr, Piecewise<D2<SBasis> >(pattern)); cairo_set_source_rgba(cr,1.0,0.0,1.0,1.0); cairo_stroke(cr); origin_handle.pos[0]=150; Geom::Point origin = origin_handle.pos; Piecewise<D2<SBasis> > uskeleton = arc_length_parametrization(Piecewise<D2<SBasis> >(skeleton),2,.1); uskeleton = remove_short_cuts(uskeleton,.01); Piecewise<D2<SBasis> > n = rot90(derivative(uskeleton)); n = force_continuity(remove_short_cuts(n,.1)); Piecewise<SBasis> x=Piecewise<SBasis>(pattern[0]-origin[0]); Piecewise<SBasis> y=Piecewise<SBasis>(pattern[1]-origin[1]); Interval pattBnds = *bounds_exact(x); int nbCopies = int(uskeleton.cuts.back()/pattBnds.extent()); //double pattWidth = uskeleton.cuts.back()/nbCopies; double pattWidth = pattBnds.extent(); double offs = 0; x-=pattBnds.min(); //x*=pattWidth/pattBnds.extent(); Piecewise<D2<SBasis> >output; for (int i=0; i<nbCopies; i++){ output.concat(compose(uskeleton,x+offs)+y*compose(n,x+offs)); offs+=pattWidth; } //Perform cut for last segment double tt = uskeleton.cuts.back() - offs; if(tt > 0.) { vector<double> rs = roots(x - tt); rs.push_back(0); rs.push_back(1); //regard endpoints std::sort(rs.begin(), rs.end()); std::unique(rs.begin(), rs.end()); //enumerate indices of sections to the left of the line for(unsigned i = (x[0].at0()>tt ? 1 : 0); i < rs.size()-1; i+=2) { Piecewise<SBasis> port = portion(x+offs, rs[i], rs[i+1]); output.concat(compose(uskeleton,port)+portion(y, rs[i], rs[i+1])*compose(n,port)); } } cairo_pw_d2_sb(cr, output); cairo_set_source_rgba(cr,1.0,0.0,1.0,1.0); cairo_stroke(cr); Toy::draw(cr, notify, width, height, save,timer_stream); }
Piecewise<SBasis> convole(SBasisOf<double> const &f, Interval dom_f, SBasisOf<double> const &g, Interval dom_g, bool f_cst_ends = false){ if ( dom_f.extent() < dom_g.extent() ) return convole(g, dom_g, f, dom_f); Piecewise<SBasis> result; SBasisOf<SBasisOf<double> > u,v; u.push_back(LinearOf<SBasisOf<double> >(SBasisOf<double>(LinearOf<double>(0,1)))); v.push_back(LinearOf<SBasisOf<double> >(SBasisOf<double>(LinearOf<double>(0,0)), SBasisOf<double>(LinearOf<double>(1,1)))); SBasisOf<SBasisOf<double> > v_u = (v - u)*(dom_f.extent()/dom_g.extent()); v_u += SBasisOf<SBasisOf<double> >(SBasisOf<double>(-dom_g.min()/dom_g.extent())); SBasisOf<SBasisOf<double> > gg = multi_compose(g,v_u); SBasisOf<SBasisOf<double> > ff = SBasisOf<SBasisOf<double> >(f); SBasisOf<SBasisOf<double> > hh = integral(ff*gg,0); result.cuts.push_back(dom_f.min()+dom_g.min()); //Note: we know dom_f.extent() >= dom_g.extent()!! //double rho = dom_f.extent()/dom_g.extent(); double t0 = dom_g.min()/dom_f.extent(); double t1 = dom_g.max()/dom_f.extent(); double t2 = t0+1; double t3 = t1+1; SBasisOf<double> a,b,t; SBasis seg; a = SBasisOf<double>(LinearOf<double>(0,0)); b = SBasisOf<double>(LinearOf<double>(0,t1-t0)); t = SBasisOf<double>(LinearOf<double>(t0,t1)); seg = toSBasis(compose(hh,b,t)-compose(hh,a,t)); result.push(seg,dom_f.min() + dom_g.max()); if (dom_f.extent() > dom_g.extent()){ a = SBasisOf<double>(LinearOf<double>(0,t2-t1)); b = SBasisOf<double>(LinearOf<double>(t1-t0,1)); t = SBasisOf<double>(LinearOf<double>(t1,t2)); seg = toSBasis(compose(hh,b,t)-compose(hh,a,t)); result.push(seg,dom_f.max() + dom_g.min()); } a = SBasisOf<double>(LinearOf<double>(t2-t1,1.)); b = SBasisOf<double>(LinearOf<double>(1.,1.)); t = SBasisOf<double>(LinearOf<double>(t2,t3)); seg = toSBasis(compose(hh,b,t)-compose(hh,a,t)); result.push(seg,dom_f.max() + dom_g.max()); result*=dom_f.extent(); //--constant ends correction-------------- if (f_cst_ends){ SBasis ig = toSBasis(integraaal(g))*dom_g.extent(); ig -= ig.at0(); Piecewise<SBasis> cor; cor.cuts.push_back(dom_f.min()+dom_g.min()); cor.push(reverse(ig)*f.at0(),dom_f.min()+dom_g.max()); cor.push(Linear(0),dom_f.max()+dom_g.min()); cor.push(ig*f.at1(),dom_f.max()+dom_g.max()); result+=cor; } //---------------------------------------- return result; }
Geom::Piecewise<Geom::D2<Geom::SBasis> > doEffect_pwd2 (Geom::Piecewise<Geom::D2<Geom::SBasis> > & pwd2_in, Geom::Piecewise<Geom::D2<Geom::SBasis> > & pattern) { using namespace Geom; Piecewise<D2<SBasis> > uskeleton = arc_length_parametrization(pwd2_in, 2, .1); uskeleton = remove_short_cuts(uskeleton,.01); Piecewise<D2<SBasis> > n = rot90(derivative(uskeleton)); n = force_continuity(remove_short_cuts(n,.1)); D2<Piecewise<SBasis> > patternd2 = make_cuts_independent(pattern); Piecewise<SBasis> x = Piecewise<SBasis>(patternd2[0]); Piecewise<SBasis> y = Piecewise<SBasis>(patternd2[1]); Interval pattBnds = *bounds_exact(x); x -= pattBnds.min(); Interval pattBndsY = *bounds_exact(y); y -= (pattBndsY.max()+pattBndsY.min())/2; int nbCopies = int(uskeleton.cuts.back()/pattBnds.extent()); double scaling = 1; double pattWidth = pattBnds.extent() * scaling; if (scaling != 1.0) { x*=scaling; } double offs = 0; Piecewise<D2<SBasis> > output; for (int i=0; i<nbCopies; i++){ output.concat(compose(uskeleton,x+offs)+y*compose(n,x+offs)); offs+=pattWidth; } return output; }