diff options
| author | Diederik van Lierop <mail@diedenrezi.nl> | 2007-12-27 10:24:31 +0000 |
|---|---|---|
| committer | dvlierop2 <dvlierop2@users.sourceforge.net> | 2007-12-27 10:24:31 +0000 |
| commit | 1a5d905c41e448464621e57c9dd2e47afade25af (patch) | |
| tree | f39412aac0b9e8fcc3b4d6d25663c1f675a43029 /src/libnr | |
| parent | BUG: 178803: Save As... -> filetype PDF via Cairo crashes (diff) | |
| download | inkscape-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.cpp | 19 | ||||
| -rw-r--r-- | src/libnr/nr-path.h | 2 | ||||
| -rw-r--r-- | src/libnr/nr-point-fns.cpp | 18 | ||||
| -rw-r--r-- | src/libnr/nr-point-fns.h | 2 |
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__ */ /* |
