コード例 #1
0
ファイル: bezier-common.c プロジェクト: AmiGanguli/dia
/*!
 * \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;
}
コード例 #2
0
ファイル: path-math.c プロジェクト: mpuels/dia
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;
}
コード例 #3
0
ファイル: beziershape.c プロジェクト: krattai/monoflow
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;
}