#ifndef __GEOM_PATH_INTERSECTION_H #define __GEOM_PATH_INTERSECTION_H #include "path.h" #include "crossing.h" #include "sweep.h" namespace Geom { int winding(Path const &path, Point p); bool path_direction(Path const &p); inline bool contains(Path const & p, Point i, bool evenodd = true) { return (evenodd ? winding(p, i) % 2 : winding(p, i)) != 0; } template Crossings curve_sweep(Path const &a, Path const &b) { T t; Crossings ret; std::vector bounds_a = bounds(a), bounds_b = bounds(b); std::vector > ixs = sweep_bounds(bounds_a, bounds_b); for(unsigned i = 0; i < a.size(); i++) { for(std::vector::iterator jp = ixs[i].begin(); jp != ixs[i].end(); jp++) { Crossings cc = t.crossings(a[i], b[*jp]); offset_crossings(cc, i, *jp); ret.insert(ret.end(), cc.begin(), cc.end()); } } return ret; } struct SimpleCrosser : public Crosser { Crossings crossings(Curve const &a, Curve const &b); Crossings crossings(Path const &a, Path const &b) { return curve_sweep(a, b); } CrossingSet crossings(std::vector const &a, std::vector const &b) { return Crosser::crossings(a, b); } }; struct MonoCrosser : public Crosser { Crossings crossings(Path const &a, Path const &b) { return crossings(std::vector(1,a), std::vector(1,b))[0]; } CrossingSet crossings(std::vector const &a, std::vector const &b); }; typedef SimpleCrosser DefaultCrosser; std::vector path_mono_splits(Path const &p); CrossingSet crossings_among(std::vector const & p); Crossings self_crossings(Path const & a); inline Crossings crossings(Path const & a, Path const & b) { DefaultCrosser c = DefaultCrosser(); return c.crossings(a, b); } inline CrossingSet crossings(std::vector const & a, std::vector const & b) { DefaultCrosser c = DefaultCrosser(); return c.crossings(a, b); } } #endif