diff options
| author | bulia byak <buliabyak@gmail.com> | 2007-10-16 05:09:08 +0000 |
|---|---|---|
| committer | buliabyak <buliabyak@users.sourceforge.net> | 2007-10-16 05:09:08 +0000 |
| commit | 2da0bbf909d02f2cc4d6060d72e3ab9bcd1b23ee (patch) | |
| tree | 14272a1c92fb70bd8c23e21667267d0e7cdab850 | |
| parent | associate an item with the line, for grdrag (diff) | |
| download | inkscape-2da0bbf909d02f2cc4d6060d72e3ab9bcd1b23ee.tar.gz inkscape-2da0bbf909d02f2cc4d6060d72e3ab9bcd1b23ee.zip | |
add some utility functions from gradient code
(bzr r3905)
| -rw-r--r-- | src/libnr/nr-point-fns.cpp | 42 | ||||
| -rw-r--r-- | src/libnr/nr-point-fns.h | 6 |
2 files changed, 48 insertions, 0 deletions
diff --git a/src/libnr/nr-point-fns.cpp b/src/libnr/nr-point-fns.cpp index a92c2b00b..a18e878b4 100644 --- a/src/libnr/nr-point-fns.cpp +++ b/src/libnr/nr-point-fns.cpp @@ -61,6 +61,48 @@ NR::Point abs(NR::Point const &b) return ret; } +NR::Point * +get_snap_vector (NR::Point p, NR::Point o, double snap, double initial) +{ + double r = NR::L2 (p - o); + if (r < 1e-3) + return NULL; + double angle = NR::atan2 (p - o); + // snap angle to snaps increments, starting from initial: + double a_snapped = initial + floor((angle - initial)/snap + 0.5) * snap; + // calculate the new position and subtract p to get the vector: + return new NR::Point (o + r * NR::Point(cos(a_snapped), sin(a_snapped)) - p); +} + +NR::Point +snap_vector_midpoint (NR::Point p, NR::Point begin, NR::Point end, double snap) +{ + double length = NR::L2(end - begin); + NR::Point be = (end - begin) / length; + double r = NR::dot(p - begin, be); + + if (r < 0.0) return begin; + if (r > length) return end; + + double snapdist = length * snap; + double r_snapped = (snap==0) ? r : floor(r/(snapdist + 0.5)) * snapdist; + + return (begin + r_snapped * be); +} + +double +get_offset_between_points (NR::Point p, NR::Point begin, NR::Point end) +{ + double length = NR::L2(end - begin); + NR::Point be = (end - begin) / length; + double r = NR::dot(p - begin, be); + + if (r < 0.0) return 0.0; + if (r > length) return 1.0; + + return (r / length); +} + /* Local Variables: diff --git a/src/libnr/nr-point-fns.h b/src/libnr/nr-point-fns.h index 9f9a8f9e2..a8c38466f 100644 --- a/src/libnr/nr-point-fns.h +++ b/src/libnr/nr-point-fns.h @@ -90,6 +90,12 @@ Point abs(Point const &b); } /* namespace NR */ +NR::Point *get_snap_vector (NR::Point p, NR::Point o, double snap, double initial); + +NR::Point snap_vector_midpoint (NR::Point p, NR::Point begin, NR::Point end, double snap); + +double get_offset_between_points (NR::Point p, NR::Point begin, NR::Point end); + #endif /* !__NR_POINT_OPS_H__ */ /* |
