/*! * \brief Return the segment of the bezier closest to a given point. * @param bezier The bezier object * @param point A point to find the closest segment to. * @param line_width Line width of the bezier line. * @return The index of the segment closest to point. * \memberof BezierCommon */ int beziercommon_closest_segment (BezierCommon *bezier, const Point *point, real line_width) { Point last; int i; real dist = G_MAXDOUBLE; int closest; closest = 0; last = bezier->points[0].p1; /* the first point is just move-to so there is no need to consider p2,p3 of it */ for (i = 1; i < bezier->num_points; i++) { real new_dist = distance_bez_seg_point(&last, &bezier->points[i], line_width, point); if (new_dist < dist) { dist = new_dist; closest = i - 1; } if (bezier->points[i].type == BEZ_CURVE_TO) last = bezier->points[i].p3; else last = bezier->points[i].p1; } return closest; }
static gboolean _segment_has_point (const BezierSegment *bs, const Point *pt) { BezPoint bp; real dist; bp.type = BEZ_CURVE_TO; bp.p1 = bs->p1; bp.p2 = bs->p2; bp.p3 = bs->p3; dist = distance_bez_seg_point (&bs->p0, &bp, 0, pt); return dist <= 0.0; }
int beziershape_closest_segment(BezierShape *bezier, Point *point, real line_width) { Point last; int i; real dist = G_MAXDOUBLE; int closest; closest = 0; last = bezier->points[0].p1; /* the first point is just move-to so there is no need to consider p2,p3 of it */ for (i = 1; i < bezier->numpoints; i++) { real new_dist = distance_bez_seg_point(&last, &bezier->points[i].p1, &bezier->points[i].p2, &bezier->points[i].p3, line_width, point); if (new_dist < dist) { dist = new_dist; closest = i; } last = bezier->points[i].p3; } return closest; }