Exemplo n.º 1
0
Arquivo: bezier.c Projeto: GNOME/dia
static ObjectChange*
bezierline_move_handle(Bezierline *bezierline, Handle *handle,
		       Point *to, ConnectionPoint *cp,
		       HandleMoveReason reason, ModifierKeys modifiers)
{
  assert(bezierline!=NULL);
  assert(handle!=NULL);
  assert(to!=NULL);

  if (reason == HANDLE_MOVE_CREATE || reason == HANDLE_MOVE_CREATE_FINAL) {
    /* During creation, change the control points */
    BezierConn *bez = &bezierline->bez;
    Point dist = bez->bezier.points[0].p1;

    point_sub(&dist, to);
    dist.y = 0;
    point_scale(&dist, 0.332);

    bezierconn_move_handle(bez, handle, to, cp, reason, modifiers);

    bez->bezier.points[1].p1 = bez->bezier.points[0].p1;
    point_sub(&bez->bezier.points[1].p1, &dist);
    bez->bezier.points[1].p2 = *to;
    point_add(&bez->bezier.points[1].p2, &dist);
  } else {
    bezierconn_move_handle(&bezierline->bez, handle, to, cp, reason, modifiers);
  }

  bezierline_update_data(bezierline);

  return NULL;
}
Exemplo n.º 2
0
static void
bezierline_move_handle(Bezierline *bezierline, Handle *handle,
                       Point *to, HandleMoveReason reason, ModifierKeys modifiers)
{
    assert(bezierline!=NULL);
    assert(handle!=NULL);
    assert(to!=NULL);

    bezierconn_move_handle(&bezierline->bez, handle, to, reason);

    if (reason == HANDLE_MOVE_CREATE || reason == HANDLE_MOVE_CREATE_FINAL) {
        BezierConn *bez = &bezierline->bez;
        Point delta = bez->points[1].p3;

        point_sub(&delta, &bez->points[0].p1);
        point_scale(&delta, 1.0/3);
        bez->points[1].p1 = bez->points[0].p1;
        point_add(&bez->points[1].p1, &delta);
        bez->points[1].p2 = bez->points[1].p1;
        point_add(&bez->points[1].p2, &delta);
    }

    bezierline_update_data(bezierline);
}