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; }