/** ******************************************************************************* @file /gui/engine/AdvGeom.h @brief Krivky, cesty @author Vajicek @version 0.1 ******************************************************************************/ #ifndef ADVGEOM_H #define ADVGEOM_H #include "common/mm.h" #include "gui/engine/SceneGeom.h" #include "gui/common/mymath.h" namespace gui{ /** Obecna definice krivky. Tato trida je abstraktni. Odvozuji se od ni konkretni druhy krivek. */ class TGenericCurve //## { protected: // int controlPoints_c; ///< pocet kontrolenich bodu P3F *controlPoints; ///< kontrolni body // public: /// Prace s kontrolnimy body. //@{ /** Pridat kontrolni bod. @param p Ukazatel na bod. */ virtual void addPoint(P3F* p); /** Pridat kontrolni bod. @param x Souradnice x kontrolniho bodu. @param y Souradnice y kontrolniho bodu. @param z Souradnice z kontrolniho bodu. */ virtual void addPoint(float x, float y, float z); /** Ziskat kontrolni bod. @param i Poradi kontrolniho bodu, ktery chci ziskat. @return Ukazatel na kontrolni bod. */ virtual P3F* controlPoint(int i); /** Pocet kontrolnich bodu. @return pocet kontrolnich bodu */ virtual int controlPointCount(); /** Smaze vsechny kontrolni body. */ virtual void clear(); //@} /** Druha derivace. @param t vstupni parametr krivky @param p vystupni hodnota druhe derivace v bode P(t) */ virtual void evalSecDerivation(float t, P3F* p) = 0; /** Spocte hodnotu prvni derivace. @param t vstupni parametr krivky @param p vystupni hodnota prvni derivace v bode P(t) */ virtual void evalDerivation(float t, P3F* p) = 0; /** Spocte krivku v bode. @param t vstupni parametr krivky @param p vystupni hodnota P(t) */ virtual void eval(float t, P3F* p) = 0; /** Vyrobi transformaci do bodu na krivce @param t vstupni parametr krivky @param m vystupni matice lokalni soustavy krivky v bode t */ virtual void eval(float t, MX4 m) = 0; /** Vytvori krivku. Provede narocnejsi predpocet. */ virtual void build() = 0; /** Delka krivky. @return odhad delky krivky */ virtual float length() = 0; /** Konstruktor. */ TGenericCurve(); /** Dsrtruktor. Odstrani ridici body. */ virtual ~TGenericCurve(); }; /** Aproximacni krivka z bezierovych kubik. M = -1 3 -3 1 3 -6 3 0 -3 3 0 0 1 0 0 0 G = [P0,P1,P2,P3] T = [t^3,t^2,t,1] P(t) = T M G */ class TJoinQuadricBezierCurve: public TGenericCurve { private: /// Parametry krivky. //@{ MX4 M; int nsize; ///< celkovy pocet vzorku int size; ///< pocet vzorku na usek float delta; ///< relativni vzdalenost mezi vzorky = 1/size //@} /// Inverzni funkce oblouku. //@{ int inv_c; ///< pocet useku float* inv; ///< vzdalenost v bode useku //@} float len; ///< skutecna delka /** Vytvor matici pro segment. @param j segment @param m vystupni matice */ void matrix(int j, MX4 m); /** Zjisti index segmentu a polohu v nem. @param t vstupni hodnota parametru na cele krivce, vystupni hodnota na segmentu @return index segmentu */ int calcInv(float* t);//<0,1> -> usek a parametr public: /// Implementace krivky. //@{ void addPoint(float x, float y, float z); virtual void clear(); virtual void evalSecDerivation(float t, P3F* p); virtual void evalDerivation(float t, P3F* p); virtual void eval(float t, P3F* p); virtual void eval(float t, MX4 m); virtual void build(); virtual float length(); //@} /** Konstruktor. @param _size pocet useku na segmentu */ TJoinQuadricBezierCurve(int _size); /** Destruktor. */ ~TJoinQuadricBezierCurve(); }; /** Lomena cara. */ class TJoinLinearCurve: public TGenericCurve { public: /// Implementace krivky. //@{ virtual void evalSecDerivation(float t, P3F* p); virtual void evalDerivation(float t, P3F* p); virtual void eval(float t, P3F* p); virtual void eval(float t, MX4 m); virtual void build(); virtual float length(); //@} /** Konstruktor. */ TJoinLinearCurve(); }; /** Hermitovska kubika. */ class THermiteanCubic: public TGenericCurve { private: MX4 m; ///< matice pro hermitovskou kubiku MX4 mg; ///< matice*geometricke parametry float* cum; ///< vzdalenost v ekvidistantnich bodech int cum_c; ///< pocet bodu public: /** Parametrizace podle oblouku. @param t Relativni vzdalenost na krivkce. @return Parametr odpovidajici vzdalenosti. */ float arcParam(float t); /// Implementace krivky. //@{ virtual void evalSecDerivation(float t, P3F* p); virtual void evalDerivation(float t, P3F* p); virtual void eval(float t, P3F* p); virtual void eval(float t, MX4 m); virtual void build(); virtual float length(); //@} /** Konstruktor. Pocet useku na krivku. */ THermiteanCubic(int seg); /** Destruktor. */ ~THermiteanCubic(); }; /** Napojovana Hermitovska kubika. */ class TJoinHermiteanCubic: public TGenericCurve { private: MX4 m; ///< matice pro hermitovskou kubiku MX4* mg; ///< buffer pro matice skombinovane s geometrii float* cum; ///< zvdalenost od pocatku v mezihodnoutach int cum_c; ///< pocet mezihodnout int seg_c; ///< pocet mezihodnout na segmentu public: /** Pocet segmentu. @return Pocet segmentu. */ int curveCount(); /** Parametrizace podle oblouku. @param t Relativni vzdalenost na krivkce. @param[out] seg Ktery segment. @return Parametr odpovidajici vzdalenosti. */ float arcParam(float t, int* seg); /// Implementace krivky. //@{ virtual void evalSecDerivation(float t, P3F* p); virtual void evalDerivation(float t, P3F* p); virtual void eval(float t, P3F* p); virtual void eval(float t, MX4 m); virtual void build(); virtual float length(); //@} /** Konstruktor. @param seg Pocet useku na segment. */ TJoinHermiteanCubic(int seg); /** Destruktor. Rusi buffery na matice a cum. */ virtual ~TJoinHermiteanCubic(); }; }//namespace #endif /*****************************************************************************/