/* * opsu! - an open-source osu! client * Copyright (C) 2014, 2015 Jeffrey Han * * opsu! is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * opsu! is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with opsu!. If not, see . */ package itdelatrisu.opsu.objects.curves; import itdelatrisu.opsu.ErrorHandler; import itdelatrisu.opsu.OsuHitObject; import java.util.LinkedList; import org.newdawn.slick.Color; import org.newdawn.slick.SlickException; /** * Representation of Catmull Curve with equidistant points. * * @author fluddokt (https://github.com/fluddokt) */ public class CatmullCurve extends EqualDistanceMultiCurve { /** * Constructor. * @param hitObject the associated OsuHitObject * @param color the color of this curve */ public CatmullCurve(OsuHitObject hitObject, Color color) { super(hitObject, color); LinkedList catmulls = new LinkedList(); int ncontrolPoints = hitObject.getSliderX().length + 1; LinkedList points = new LinkedList(); // temporary list of points to separate different curves // repeat the first and last points as controls points // aabb // aabc abcc // aabc abcd bcdd points.addLast(new Vec2f(getX(0), getY(0))); for (int i = 0; i < ncontrolPoints; i++) { points.addLast(new Vec2f(getX(i), getY(i))); if (points.size() >= 4) { try { catmulls.add(new CentripetalCatmullRom(points.toArray(new Vec2f[0]))); } catch (SlickException e) { ErrorHandler.error(null, e, true); } points.removeFirst(); } } points.addLast(new Vec2f(getX(ncontrolPoints - 1), getY(ncontrolPoints - 1))); if (points.size() >= 4) { try { catmulls.add(new CentripetalCatmullRom(points.toArray(new Vec2f[0]))); } catch (SlickException e) { ErrorHandler.error(null, e, true); } } init(catmulls); } }