Beispiel #1
0
  public StraightLine(
      String name, double initialAngle, double finalAngle, ArrayList<KeyFrame> frames) {
    super(name, new Point2D.Double(), null, null, initialAngle, finalAngle);
    this.frames = frames;
    order = 1000;

    int n = frames.size();
    start = frames.get(0).getPosition();
    end = frames.get(n - 1).getPosition();

    boolean forward = true;

    path = new Path2D.Double();
    path.moveTo(start.getX(), start.getY());
    for (int i = 1; i < n; i++) {
      KeyFrame frame = frames.get(i);
      TrajectoryMovement movement = frame.getMovement();
      switch (movement) {
        case LINE:
          // handles backward moves by adding an extra moveto instruction
          if (forward == frame.getMovementSpeed() < 0) {
            Point2D p = path.getCurrentPoint();
            path.moveTo(p.getX(), p.getY());
            forward = !forward;
          }
          Point2D p = frame.getPosition();
          path.lineTo(p.getX(), p.getY());
          break;
        case BEZIER:
          p = frame.getPosition();
          Point2D[] cp = frame.getControlPoints();
          path.curveTo(cp[0].getX(), cp[0].getY(), cp[1].getX(), cp[1].getY(), p.getX(), p.getY());
          break;
        default:
          break;
      }
    }

    String description = getTrajectoryDescription();
    setProperty(KEY_DESCRIPTION, description);
  }
  private KeyFrame interpolateBezier(KeyFrame start, KeyFrame end, double timestamp) {
    double ds = start.getTimestamp();
    double duration = end.getTimestamp() - ds;
    double d = (timestamp - ds) / duration;
    Point2D[] points = end.getControlPoints();
    Point2D s = start.getPosition();
    Point2D e = end.getPosition();
    Point2D p = Bezier.getPoint(d, s, points[0], points[1], e);
    double angle = Bezier.getAngle(d, s, points[0], points[1], e);

    KeyFrame frame =
        new KeyFrame(
            TrajectoryMovement.BEZIER,
            start.getMovementSpeed(),
            angle,
            0,
            0,
            p,
            timestamp,
            start.getSourceLine(),
            points);
    return frame;
  }