diff options
| author | Johan B. C. Engelen <jbc.engelen@swissonline.ch> | 2007-08-30 18:32:36 +0000 |
|---|---|---|
| committer | johanengelen <johanengelen@users.sourceforge.net> | 2007-08-30 18:32:36 +0000 |
| commit | 13e73fa386cd7843d7079ec7c162ef43d15097c4 (patch) | |
| tree | ab4c7a4f76528e9139a85aa1c1267ecf2c6df8fe /src/2geom/path-intersection.h | |
| parent | updated Slovak (sk) translation in trunk (diff) | |
| download | inkscape-13e73fa386cd7843d7079ec7c162ef43d15097c4.tar.gz inkscape-13e73fa386cd7843d7079ec7c162ef43d15097c4.zip | |
Update to 2Geom rev. 1113
(bzr r3622)
Diffstat (limited to 'src/2geom/path-intersection.h')
| -rw-r--r-- | src/2geom/path-intersection.h | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/src/2geom/path-intersection.h b/src/2geom/path-intersection.h new file mode 100644 index 000000000..3401386e0 --- /dev/null +++ b/src/2geom/path-intersection.h @@ -0,0 +1,65 @@ +#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<typename T> +Crossings curve_sweep(Path const &a, Path const &b) { + T t; + Crossings ret; + std::vector<Rect> bounds_a = bounds(a), bounds_b = bounds(b); + std::vector<std::vector<unsigned> > ixs = sweep_bounds(bounds_a, bounds_b); + for(unsigned i = 0; i < a.size(); i++) { + for(std::vector<unsigned>::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<Path> { + Crossings crossings(Curve const &a, Curve const &b); + Crossings crossings(Path const &a, Path const &b) { return curve_sweep<SimpleCrosser>(a, b); } + CrossingSet crossings(std::vector<Path> const &a, std::vector<Path> const &b) { return Crosser<Path>::crossings(a, b); } +}; + +struct MonoCrosser : public Crosser<Path> { + Crossings crossings(Path const &a, Path const &b) { return crossings(std::vector<Path>(1,a), std::vector<Path>(1,b))[0]; } + CrossingSet crossings(std::vector<Path> const &a, std::vector<Path> const &b); +}; + +typedef SimpleCrosser DefaultCrosser; + +std::vector<double> path_mono_splits(Path const &p); + +CrossingSet crossings_among(std::vector<Path> const & p); +inline Crossings self_crossings(Path const & a) { return crossings_among(std::vector<Path>(1, a))[0]; } + +inline Crossings crossings(Path const & a, Path const & b) { + DefaultCrosser c = DefaultCrosser(); + return c.crossings(a, b); +} + +inline CrossingSet crossings(std::vector<Path> const & a, std::vector<Path> const & b) { + DefaultCrosser c = DefaultCrosser(); + return c.crossings(a, b); +} + +} + +#endif |
