Main Page   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Namespace Members   Compound Members   File Members  

gunu_refine.h

Go to the documentation of this file.
00001 /* LIBGUL - Geometry Utility Library
00002  * Copyright (C) 1998-1999 Norbert Irmer
00003  *
00004  * This library is free software; you can redistribute it and/or
00005  * modify it under the terms of the GNU Library General Public
00006  * License as published by the Free Software Foundation; either
00007  * version 2 of the License, or (at your option) any later version.
00008  *
00009  * This library is distributed in the hope that it will be useful,
00010  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00011  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00012  * Library General Public License for more details.
00013  *
00014  * You should have received a copy of the GNU Library General Public
00015  * License along with this library; if not, write to the
00016  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
00017  * Boston, MA 02111-1307, USA.
00018  */ 
00019 
00020 #ifndef GUNU_REFINE_H
00021 #define GUNU_REFINE_H
00022 
00023 namespace gunu {
00024 
00025 using gul::Ptr;
00026 
00027 /*-------------------------------------------------------------------------*//**
00028   Inserts 'r'+1 knots given by the refinement vector 'X' into the knot vector
00029   of a curve (and calculates the changed control points).
00030   no validity checks are made, multiplicity of the inserted knots mustn't
00031   exceed the degree 'p', memory for the new knot vector 'Ubar' and control
00032   point vector 'Q' must be reserved by the caller: Ubar: n+p+2+r, Q: n+1+r    */
00033 /*----------------------------------------------------------------------------*/
00034 template< class T, class HP >
00035 void RefineCurve( int n, int p, const Ptr<T>& U, const Ptr<HP> P, 
00036                   const Ptr<T> X, int r, Ptr<T>& Ubar, Ptr<HP> Q );
00037 
00038 /*-------------------------------------------------------------------------*//**
00039   Inserts 'r'+1 knots given by the refinement vector 'X' into the U or 
00040   V knot vector of a surface (and calculates the changed control points).
00041   no validity checks are made, multiplicity of the inserted knots mustn't
00042   exceed the degree 'pu' or 'pv', memory for the new knot vectors 'Ubar' 
00043   and Vbar and the control point matrix 'Q' must be reserved by the caller:
00044   Ubar: nu+pu+2+r, Q: [nv]*[nu+1+r], if 'dir' == u_direction,
00045   Vbar: nv+pv+2+r, Q: [nv+1+r]*[nu], if 'dir' == v_direction                  */
00046 /*----------------------------------------------------------------------------*/
00047 
00048 template< class T, class HP >
00049 void RefineSurfaceU( 
00050        int nu, int pu, const Ptr<T>& U, int nv, int pv, const Ptr<T>& V, 
00051        const Ptr< Ptr< HP > >& P, const Ptr<T>& X, int r,
00052        Ptr<T>& Ubar, Ptr<T>& Vbar, Ptr< Ptr< HP > >& Q );
00053 
00054 template< class T, class HP >
00055 void RefineSurfaceV( 
00056        int nu, int pu, const Ptr<T>& U, int nv, int pv, const Ptr<T>& V, 
00057        const Ptr< Ptr< HP > >& P, const Ptr<T>& X, int r,
00058        Ptr<T>& Ubar, Ptr<T>& Vbar, Ptr< Ptr< HP > >& Q );
00059 
00060 template< class T, class HP >
00061 void RefineSurface( 
00062        int nu, int pu, const Ptr<T>& U, int nv, int pv, const Ptr<T>& V, 
00063        const Ptr< Ptr< HP > >& P, const Ptr<T>& X, int r, int dir, 
00064        Ptr<T>& Ubar, Ptr<T>& Vbar, Ptr< Ptr< HP > >& Q )
00065 {
00066   if( dir == gul::u_direction )
00067     RefineSurfaceU( nu,pu,U,nv,pv,V,P,X,r,Ubar,Vbar,Q );
00068   else
00069     RefineSurfaceV( nu,pu,U,nv,pv,V,P,X,r,Ubar,Vbar,Q );
00070 }
00071 
00072 /*-----------------------------------------------------------------
00073   Calculates the positions and multiplicities of the inner knots 
00074   and the last knot (knot vector must be clamped) of a knot vector
00075 -----------------------------------------------------------------*/ 
00076 template< class T >
00077 int BezierPositions( int n, int p, const Ptr<T>& U,
00078                      Ptr<int>& K, Ptr<int>& M );
00079 
00080 /*-------------------------------------------------------------------------*//**
00081   decompose a curve into its Bezier segments. returns the number of created
00082   segments                                                                    */
00083 /*----------------------------------------------------------------------------*/
00084 template< class T, class HP >
00085 void BezierDecomposeCurve( 
00086               int nK, const Ptr<int>& K, const Ptr<int>& M,
00087               int n, int p, const Ptr<T>& U, const Ptr<HP>& Pw, 
00088               Ptr< Ptr<HP> > *retQw );
00089 
00090 /*-------------------------------------------------------------------------*//**
00091  decompose a surface in u or v direction into its Bezier segments. 
00092  when for example decomposing in U-direction, the function returns
00093  a array containing bezier strips with [nv+1]*[pu+1] control point
00094  matrices, the function result is the number of created bezier segments       */ 
00095 /*----------------------------------------------------------------------------*/
00096 /* Example for decomposition in U-direction:
00097 
00098          -----------------------------------------> (U-direction)|
00099         |
00100         |  Bezier   : Bezier   : Bezier   :
00101         |  Stip     : Strip    : Strip : ...
00102 (nv)-   |  0        : 1        : 2        :
00103 rows    |           :          :          :
00104         |  <------> : <------> : <------> :
00105         |  (pu+1)-  : (pu+1)-  : (pu+1)-  :
00106         |  columns  : columns  : columns  :
00107         |           :          :          :
00108         |           :          :          :
00109         |           :          :          :
00110         V 
00111     (V-direction)
00112 */
00113 
00114 template< class T, class HP >
00115 void BezierDecomposeSurfaceU( 
00116               int nK, const Ptr<int>& K, const Ptr<int>& M,
00117               int nu, int pu, const Ptr<T>& U,
00118               int nv, int pv, const Ptr<T>& V,              
00119               const Ptr< Ptr<HP> >& Pw,
00120               Ptr< Ptr< Ptr<HP> > > *retQw );
00121 
00122 template< class T, class HP >
00123 void BezierDecomposeSurfaceV( 
00124               int nK, const Ptr<int>& K, const Ptr<int>& M,
00125               int nu, int pu, const Ptr<T>& U,
00126               int nv, int pv, const Ptr<T>& V,              
00127               const Ptr< Ptr<HP> >& Pw,
00128               Ptr< Ptr< Ptr<HP> > > *retQw );
00129 
00130 template< class T, class HP >
00131 inline void BezierDecomposeSurface( 
00132               int nu, int pu, const Ptr<T>& U,
00133               int nv, int pv, const Ptr<T>& V,              
00134               const Ptr< Ptr<HP> >& Pw, int dir,
00135               Ptr< Ptr< Ptr<HP> > > *retQw )
00136 {
00137   int nK;
00138   Ptr<int> K,M;
00139   
00140   if( dir == gul::u_direction )
00141   {
00142     nK = BezierPositions( nu, pu, U, K, M );
00143     BezierDecomposeSurfaceU( nK,K,M,nu,pu,U,nv,pv,V,Pw,retQw );
00144   }
00145   else
00146   {
00147     nK = BezierPositions( nv, pv, V, K, M );
00148     BezierDecomposeSurfaceV( nK,K,M,nu,pu,U,nv,pv,V,Pw,retQw );
00149   }
00150 }
00151 
00152 
00153 }
00154 
00155 #endif
00156 
00157 

Generated on Mon Jan 21 04:17:41 2002 for GUL 0.6 - Geometry Utility Library by doxygen1.2.13.1 written by Dimitri van Heesch, © 1997-2001