summaryrefslogtreecommitdiffstats
path: root/src/libnr
diff options
context:
space:
mode:
authorDiederik van Lierop <mail@diedenrezi.nl>2007-12-27 10:24:31 +0000
committerdvlierop2 <dvlierop2@users.sourceforge.net>2007-12-27 10:24:31 +0000
commit1a5d905c41e448464621e57c9dd2e47afade25af (patch)
treef39412aac0b9e8fcc3b4d6d25663c1f675a43029 /src/libnr
parentBUG: 178803: Save As... -> filetype PDF via Cairo crashes (diff)
downloadinkscape-1a5d905c41e448464621e57c9dd2e47afade25af.tar.gz
inkscape-1a5d905c41e448464621e57c9dd2e47afade25af.zip
1) Fix bug #178312
2) Fix constrained snapping to objects (bzr r4314)
Diffstat (limited to 'src/libnr')
-rw-r--r--src/libnr/nr-path.cpp19
-rw-r--r--src/libnr/nr-path.h2
-rw-r--r--src/libnr/nr-point-fns.cpp18
-rw-r--r--src/libnr/nr-point-fns.h2
4 files changed, 41 insertions, 0 deletions
diff --git a/src/libnr/nr-path.cpp b/src/libnr/nr-path.cpp
index 03882a7fd..a0011c9dc 100644
--- a/src/libnr/nr-path.cpp
+++ b/src/libnr/nr-path.cpp
@@ -503,3 +503,22 @@ nr_path_matrix_bbox_union(NRBPath const *bpath, NR::Matrix const &m,
}
}
+NArtBpath *nr_path_from_rect(NRRect const &r)
+{
+ NArtBpath *path = g_new (NArtBpath, 6);
+
+ path[0].code = NR_MOVETO;
+ path[0].setC(3, NR::Point(r.x0, r.y0));
+ path[1].code = NR_LINETO;
+ path[1].setC(3, NR::Point(r.x1, r.y0));
+ path[2].code = NR_LINETO;
+ path[2].setC(3, NR::Point(r.x1, r.y1));
+ path[3].code = NR_LINETO;
+ path[3].setC(3, NR::Point(r.x0, r.y1));
+ path[4].code = NR_LINETO;
+ path[4].setC(3, NR::Point(r.x0, r.y0));
+ path[5].code = NR_END;
+
+ return path;
+}
+
diff --git a/src/libnr/nr-path.h b/src/libnr/nr-path.h
index 95b4f726b..6fdc85694 100644
--- a/src/libnr/nr-path.h
+++ b/src/libnr/nr-path.h
@@ -46,6 +46,8 @@ void nr_path_matrix_point_bbox_wind_distance (NRBPath *bpath, NR::Matrix const &
void nr_path_matrix_bbox_union(NRBPath const *bpath, NR::Matrix const &m, NRRect *bbox);
+NArtBpath *nr_path_from_rect(NRRect const &r);
+
#endif
/*
diff --git a/src/libnr/nr-point-fns.cpp b/src/libnr/nr-point-fns.cpp
index a18e878b4..4428ed9b3 100644
--- a/src/libnr/nr-point-fns.cpp
+++ b/src/libnr/nr-point-fns.cpp
@@ -103,6 +103,24 @@ get_offset_between_points (NR::Point p, NR::Point begin, NR::Point end)
return (r / length);
}
+NR::Point
+project_on_linesegment(NR::Point const p, NR::Point const p1, NR::Point const p2)
+{
+ // p_proj = projection of p on the linesegment running from p1 to p2
+ // p_proj = p1 + u (p2 - p1)
+ // calculate u according to "Minimum Distance between a Point and a Line"
+ // see http://local.wasp.uwa.edu.au/~pbourke/geometry/pointline/
+
+ if (p1 == p2) { // to avoid div. by zero below
+ return p;
+ }
+
+ NR::Point const d1(p-p1); // delta 1
+ NR::Point const d2(p2-p1); // delta 2
+ double const u = (d1[NR::X] * d2[NR::X] + d1[NR::Y] * d2[NR::Y]) / (NR::L2(d2) * NR::L2(d2));
+
+ return (p1 + u*(p2-p1));
+}
/*
Local Variables:
diff --git a/src/libnr/nr-point-fns.h b/src/libnr/nr-point-fns.h
index a8c38466f..e927725b4 100644
--- a/src/libnr/nr-point-fns.h
+++ b/src/libnr/nr-point-fns.h
@@ -96,6 +96,8 @@ NR::Point snap_vector_midpoint (NR::Point p, NR::Point begin, NR::Point end, dou
double get_offset_between_points (NR::Point p, NR::Point begin, NR::Point end);
+NR::Point project_on_linesegment(NR::Point const p, NR::Point const p1, NR::Point const p2);
+
#endif /* !__NR_POINT_OPS_H__ */
/*