2009-01-21 01:00:31 +01:00
|
|
|
/* libsegl - Sebas Extended GL Library
|
|
|
|
* Collection of Opengl/3D-Math helpers
|
|
|
|
*
|
|
|
|
* Copyright (c) 2008 by Sebastian Lohff, seba@seba-geek.de
|
|
|
|
* http://www.seba-geek.de
|
|
|
|
*
|
|
|
|
* This library is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU Library General Public
|
|
|
|
* License as published by the Free Software Foundation; either
|
|
|
|
* version 2 of the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This library 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
|
|
|
|
* Library General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU Library General Public
|
|
|
|
* License along with this library; if not, write to the
|
|
|
|
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
|
|
|
|
* Boston, MA 02110-1301, USA.
|
|
|
|
*/
|
|
|
|
|
2008-06-08 14:09:56 +02:00
|
|
|
#include "catmullromspline.h"
|
|
|
|
|
2008-08-10 17:14:54 +02:00
|
|
|
namespace segl {
|
|
|
|
|
2008-06-08 14:09:56 +02:00
|
|
|
CatmullRomSpline::CatmullRomSpline(float _s) {
|
|
|
|
cr = new Matrix(4, 4);
|
|
|
|
setS(_s);
|
|
|
|
}
|
|
|
|
|
|
|
|
void CatmullRomSpline::makeMatrix() {
|
|
|
|
cr->set(-s , 0, 0);
|
|
|
|
cr->set( 2-s , 0, 1);
|
|
|
|
cr->set( s-2 , 0, 2);
|
|
|
|
cr->set( s , 0, 3);
|
|
|
|
|
|
|
|
cr->set( 2*s , 1, 0);
|
|
|
|
cr->set( s-3 , 1, 1);
|
|
|
|
cr->set( 3-2*s, 1, 2);
|
|
|
|
cr->set(-s , 1, 3);
|
|
|
|
|
|
|
|
cr->set(-s, 2, 0);
|
|
|
|
cr->set( 0, 2, 1);
|
|
|
|
cr->set( s, 2, 2);
|
|
|
|
cr->set( 0, 2, 3);
|
|
|
|
|
|
|
|
cr->set( 0, 3, 0);
|
|
|
|
cr->set( 1, 3, 1);
|
|
|
|
cr->set( 0, 3, 2);
|
|
|
|
cr->set( 0, 3, 3);
|
|
|
|
}
|
|
|
|
|
|
|
|
Matrix CatmullRomSpline::getPosition(float u, Matrix &controlpoints) {
|
|
|
|
// Matrix controlpoints(4, a.getN());
|
|
|
|
// for(int i=0; i<a.getN(); i++) {
|
|
|
|
// controlpoints.set(a.get(0, i), 0, i);
|
|
|
|
// controlpoints.set(b.get(0, i), 1, i);
|
|
|
|
// controlpoints.set(c.get(0, i), 2, i);
|
|
|
|
// controlpoints.set(d.get(0, i), 3, i);
|
|
|
|
// }
|
|
|
|
Matrix param(1, 4);
|
|
|
|
param.set(u*u*u, 0, 0);
|
|
|
|
param.set(u*u, 0, 1);
|
|
|
|
param.set(u, 0, 2);
|
|
|
|
param.set(1, 0, 3);
|
|
|
|
|
|
|
|
return param * (*cr) * controlpoints;
|
|
|
|
}
|
|
|
|
|
|
|
|
Punkt3D CatmullRomSpline::getPosition(float u, Punkt3D a, Punkt3D b, Punkt3D c, Punkt3D d) {
|
|
|
|
Matrix erg(1, 3);
|
|
|
|
Matrix controlpoints(4, 3);
|
|
|
|
|
|
|
|
controlpoints.set(a.x, 0, 0);
|
|
|
|
controlpoints.set(a.y, 0, 1);
|
|
|
|
controlpoints.set(a.z, 0, 2);
|
|
|
|
|
|
|
|
controlpoints.set(b.x, 1, 0);
|
|
|
|
controlpoints.set(b.y, 1, 1);
|
|
|
|
controlpoints.set(b.z, 1, 2);
|
|
|
|
|
|
|
|
controlpoints.set(c.x, 2, 0);
|
|
|
|
controlpoints.set(c.y, 2, 1);
|
|
|
|
controlpoints.set(c.z, 2, 2);
|
|
|
|
|
|
|
|
controlpoints.set(d.x, 3, 0);
|
|
|
|
controlpoints.set(d.y, 3, 1);
|
|
|
|
controlpoints.set(d.z, 3, 2);
|
|
|
|
|
|
|
|
erg = getPosition(u, controlpoints);
|
|
|
|
|
|
|
|
return Punkt3D(erg.get(0,0), erg.get(0,1), erg.get(0,2));
|
|
|
|
}
|
|
|
|
|
|
|
|
Punkt2D CatmullRomSpline::getPosition(float u, Punkt2D a, Punkt2D b, Punkt2D c, Punkt2D d) {
|
|
|
|
Matrix erg(1, 2);
|
|
|
|
Matrix controlpoints(4, 2);
|
|
|
|
|
|
|
|
controlpoints.set(a.x, 0, 0);
|
|
|
|
controlpoints.set(a.y, 0, 1);
|
|
|
|
|
|
|
|
controlpoints.set(b.x, 1, 0);
|
|
|
|
controlpoints.set(b.y, 1, 1);
|
|
|
|
|
|
|
|
controlpoints.set(c.x, 2, 0);
|
|
|
|
controlpoints.set(c.y, 2, 1);
|
|
|
|
|
|
|
|
controlpoints.set(d.x, 3, 0);
|
|
|
|
controlpoints.set(d.y, 3, 1);
|
|
|
|
|
|
|
|
erg = getPosition(u, controlpoints);
|
|
|
|
|
|
|
|
return Punkt2D(erg.get(0,0), erg.get(0,1));
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CatmullRomSpline::setS(float _s) {
|
|
|
|
s = _s;
|
|
|
|
makeMatrix();
|
|
|
|
}
|
|
|
|
|
|
|
|
CatmullRomSpline::~CatmullRomSpline() {
|
|
|
|
delete(cr);
|
|
|
|
}
|
2008-08-10 17:14:54 +02:00
|
|
|
|
|
|
|
} // namespace segl
|