summaryrefslogtreecommitdiffstats
path: root/src/libnr
diff options
context:
space:
mode:
authorbulia byak <buliabyak@gmail.com>2007-10-16 05:09:08 +0000
committerbuliabyak <buliabyak@users.sourceforge.net>2007-10-16 05:09:08 +0000
commit2da0bbf909d02f2cc4d6060d72e3ab9bcd1b23ee (patch)
tree14272a1c92fb70bd8c23e21667267d0e7cdab850 /src/libnr
parentassociate an item with the line, for grdrag (diff)
downloadinkscape-2da0bbf909d02f2cc4d6060d72e3ab9bcd1b23ee.tar.gz
inkscape-2da0bbf909d02f2cc4d6060d72e3ab9bcd1b23ee.zip
add some utility functions from gradient code
(bzr r3905)
Diffstat (limited to 'src/libnr')
-rw-r--r--src/libnr/nr-point-fns.cpp42
-rw-r--r--src/libnr/nr-point-fns.h6
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__ */
/*