summaryrefslogtreecommitdiffstats
path: root/src/2geom/pathvector.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/2geom/pathvector.cpp')
-rw-r--r--src/2geom/pathvector.cpp32
1 files changed, 28 insertions, 4 deletions
diff --git a/src/2geom/pathvector.cpp b/src/2geom/pathvector.cpp
index 6d4e24c9f..39a00d8dc 100644
--- a/src/2geom/pathvector.cpp
+++ b/src/2geom/pathvector.cpp
@@ -90,19 +90,19 @@ Rect bounds_exact( PathVector const& pv )
/* Note: undefined for empty pathvectors or pathvectors with empty paths.
* */
-PathVectorPosition nearestPoint(PathVector const & path_in, Point const& _point, double *distance_squared)
+boost::optional<PathVectorPosition> nearestPoint(PathVector const & path_in, Point const& _point, double *distance_squared)
{
- PathVectorPosition retval;
+ boost::optional<PathVectorPosition> retval;
double mindsq = infinity();
unsigned int i = 0;
for (Geom::PathVector::const_iterator pit = path_in.begin(); pit != path_in.end(); ++pit) {
double dsq;
double t = pit->nearestPoint(_point, &dsq);
+ //std::cout << t << "," << dsq << std::endl;
if (dsq < mindsq) {
mindsq = dsq;
- retval.path_nr = i;
- retval.t = t;
+ retval = PathVectorPosition(i, t);
}
++i;
@@ -114,6 +114,30 @@ PathVectorPosition nearestPoint(PathVector const & path_in, Point const& _point,
return retval;
}
+std::vector<PathVectorPosition> allNearestPoints(PathVector const & path_in, Point const& _point, double *distance_squared)
+{
+ std::vector<PathVectorPosition> retval;
+
+ double mindsq = infinity();
+ unsigned int i = 0;
+ for (Geom::PathVector::const_iterator pit = path_in.begin(); pit != path_in.end(); ++pit) {
+ double dsq;
+ double t = pit->nearestPoint(_point, &dsq);
+ if (dsq < mindsq) {
+ mindsq = dsq;
+ retval.push_back(PathVectorPosition(i, t));
+ }
+
+ ++i;
+ }
+
+ if (distance_squared) {
+ *distance_squared = mindsq;
+ }
+ return retval;
+
+}
+
} // namespace Geom
#endif // SEEN_GEOM_PATHVECTOR_CPP