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

gunu_divide.cpp

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 #include "stdafx.h"
00021 
00022 #include <iostream>
00023 
00024 #include "gul_types.h"
00025 #include "gul_vector.h"
00026 #include "gunu_basics.h"
00027 #include "gunu_divide.h"
00028 
00029 namespace gunu {
00030 
00031 using gul::rtr;
00032 using gul::point;
00033 using gul::point1;
00034 using gul::point2;
00035 using gul::hpoint;
00036 using gul::hpoint1;
00037 using gul::hpoint2;
00038 using gul::set;
00039 using gul::euclid;
00040 using gul::ortho;
00041 
00042 /*----------------------------------------------------------------------
00043   Splits a NURBS curve at point 'u' into two parts
00044 ----------------------------------------------------------------------- */ 
00045 template< class T, class HP >
00046 void SplitCurve( const curve<T,HP> *Curve, const T u,
00047                  curve<T,HP> *C1, curve<T,HP> *C2 ) 
00048 {
00049   int i,j,k,s,r,ir,n,n1,n2,p;
00050   T alpha;
00051   Ptr< T > U,U1,U2;
00052   Ptr< HP > P,R,NP,Q1,Q2;
00053 
00054   p = Curve->p;
00055   n = Curve->cpt.n;
00056   P = Curve->cpt.Pw;
00057   U = Curve->knt.U;
00058   k = FindSpanMultip( u, n, p, U, &s );
00059   r = p - s;
00060   
00061 /* Speicher fuer Ausgabekurven C1,C2 reservieren */
00062 
00063   n1 = k - s;
00064   n2 = n + r - (k - s);
00065 
00066   Q1.reserve_pool( n1+1 );
00067   Q2.reserve_pool( n2+1 );
00068   U1.reserve_pool( n1 + p + 2 );
00069   U2.reserve_pool( n2 + p + 2 );
00070     
00071   C1->p = p;
00072   C1->cpt.n = n1;
00073   C1->cpt.Pw = Q1;
00074   C1->knt.m = n1 + p + 1;
00075   C1->knt.U = U1;
00076 
00077   C2->p = p;
00078   C2->cpt.n = n2;
00079   C2->cpt.Pw = Q2;
00080   C2->knt.m = n2 + p + 1;
00081   C2->knt.U = U2;
00082 
00083 /* Array fuer Hilfspunkte reservieren */
00084 
00085   R.reserve_place( reserve_stack(HP,p+1), p+1 );
00086   if( p-s+r-1 > 0 ) NP.reserve_place( reserve_stack(HP, p-s+r-1), p-s+r-1 );
00087   
00088   for( i = 0; i <= p - s; i++ )
00089   {
00090     R[i] = P[k - p + i]; 
00091   }
00092 
00093   for( ir = 1; ir <= r; ir++ )
00094   {
00095     for( i = 0; i <= p - s - ir; i++ )
00096     {
00097       alpha = (u - U[k-p+ir+i]) / (U[k+i+1] - U[k-p+ir+i]);
00098 
00099       R[i] = (alpha * R[i+1]) + (((T)1.0 - alpha) * R[i]);
00100     }
00101 
00102     NP[ir - 1] = R[0];
00103     NP[p - s + r - 1 - ir] = R[p - s - ir];
00104   }
00105 
00106   for( i = 1; i < p - s - r; i++ ) 
00107   {
00108     NP[r - 1 + i] = R[i];
00109   }
00110 
00111   for( i = 0; i <= k - p; i++ )
00112   {
00113     Q1[i] = P[i];  
00114   }                                          
00115 
00116   for( i = 0; i <= p - s - 1; i++ )
00117   {
00118     j = k - p + 1 + i;
00119     Q1[j] = NP[i];
00120   }
00121 
00122   for( i = p - s - 1; i <= p - s + r - 2; i++ )
00123   {
00124     j = i - (p - s - 1);  
00125     Q2[j] = NP[i];
00126   }
00127     
00128   for( i = k - s; i <= n; i++ )
00129   {
00130     j = r + i - (k - s);
00131     Q2[j] = P[i];    
00132   }
00133 
00134 /* Knotenvektoren der 2 Teilkurven bilden */
00135 
00136   for( i = 0; i < k - s + 1; i++ )
00137     U1[i] = U[i];
00138   for( i = 0; i <= p; i++ )
00139     U1[k - s + 1 + i] = u;
00140   NormalizeKnotVector( n1, p, U1 );
00141 
00142   for( i = 0; i < n + p + 1 - k; i++ )
00143     U2[p+1+i] = U[k+1+i];
00144   for( i = 0; i <= p; i++ )
00145     U2[i] = u;
00146   NormalizeKnotVector( n2, p, U2 );
00147 }
00148 /*----------------------------------------------------------------------
00149   Splits a NURBS curve at point 'u' into two parts
00150 ----------------------------------------------------------------------- */ 
00151 template void SplitCurve( 
00152            const curve< float, hpoint<float> > *Curve, const float u,
00153            curve< float, hpoint<float> > *C1, 
00154            curve< float, hpoint<float> > *C2 );
00155 template void SplitCurve( 
00156            const curve< double, hpoint<double> > *Curve, const double u,
00157            curve< double, hpoint<double> > *C1, 
00158            curve< double, hpoint<double> > *C2 );
00159 template void SplitCurve( 
00160            const curve< float, hpoint2<float> > *Curve, const float u,
00161            curve< float, hpoint2<float> > *C1, 
00162            curve< float, hpoint2<float> > *C2 );
00163 template void SplitCurve( 
00164            const curve< double, hpoint2<double> > *Curve, const double u,
00165            curve< double, hpoint2<double> > *C1, 
00166            curve< double, hpoint2<double> > *C2 );
00167 
00168 template void SplitCurve( 
00169            const curve< float, point<float> > *Curve, const float u,
00170            curve< float, point<float> > *C1, 
00171            curve< float, point<float> > *C2 );
00172 template void SplitCurve( 
00173            const curve< double, point<double> > *Curve, const double u,
00174            curve< double, point<double> > *C1, 
00175            curve< double, point<double> > *C2 );
00176 template void SplitCurve( 
00177            const curve< float, point2<float> > *Curve, const float u,
00178            curve< float, point2<float> > *C1, 
00179            curve< float, point2<float> > *C2 );
00180 template void SplitCurve( 
00181            const curve< double, point2<double> > *Curve, const double u,
00182            curve< double, point2<double> > *C1, 
00183            curve< double, point2<double> > *C2 );
00184 
00185 
00186 
00187 /*----------------------------------------------------------------------
00188   Splits a NURBS surface at point (u,v) into four parts
00189 ----------------------------------------------------------------------- */ 
00190 template< class T, class HP >
00191 void SplitSurface( 
00192             const surface<T,HP> *Surf, const T u, const T v, 
00193             surface<T,HP> *S11, surface<T,HP> *S12, 
00194             surface<T,HP> *S21, surface<T,HP> *S22 )
00195 {
00196   int nrows,ncols;
00197   int i,j,ir;
00198   int pu,pv;
00199   int nu,nv,nu1,nu2,nv1,nv2;
00200   int ku,kv,su,sv,ru,rv,col,row;
00201 
00202   Ptr< T > U,V,U11,U12,U21,U22,V11,V12,V21,V22;
00203   Ptr< HP * > NR;
00204   Ptr< HP > NR_buf,R;
00205   Ptr< Ptr< HP > > NP,P,Q11,Q12,Q21,Q22;
00206   Ptr< Ptr< T > > alpha;
00207 
00208 /* Lokale Notation: */
00209 
00210   pu = Surf->pu;
00211   pv = Surf->pv;
00212   nu = Surf->net.nu;
00213   nv = Surf->net.nv;
00214   P =  Surf->net.Pw;
00215   U = Surf->knu.U;
00216   V = Surf->knv.U;
00217 
00218   ku = FindSpanMultip( u, nu, pu, U, &su );
00219   kv = FindSpanMultip( v, nv, pv, V, &sv );
00220   ru = pu - su;
00221   rv = pv - sv;
00222 
00223 /* Speicher fuer Ausgabeflaechen S11,S12,S21,S22 reservieren */
00224 
00225   nv1 = kv - sv;
00226   nv2 = nv + rv - (kv - sv);
00227 
00228   Q11.reserve_pool( nv1 + 1 );
00229   Q12.reserve_pool( nv1 + 1 );
00230   Q21.reserve_pool( nv2 + 1 );
00231   Q22.reserve_pool( nv2 + 1 );
00232 
00233   nu1 = ku - su; 
00234   nu2 = nu + ru - (ku - su);
00235 
00236   for( i = 0; i <= nv1; i++ )
00237   {
00238     Q11[i].reserve_pool( nu1 + 1 );
00239     Q12[i].reserve_pool( nu2 + 1 );
00240   }
00241   for( i = 0; i <= nv2; i++ )
00242   {
00243     Q21[i].reserve_pool( nu1 + 1 );
00244     Q22[i].reserve_pool( nu2 + 1 );
00245   }
00246   
00247   U11.reserve_pool( nu1 + pu + 2 );
00248   U21.reserve_pool( nu1 + pu + 2 );
00249   U12.reserve_pool( nu2 + pu + 2 );
00250   U22.reserve_pool( nu2 + pu + 2 );
00251 
00252   V11.reserve_pool( nv1 + pv + 2 );
00253   V12.reserve_pool( nv1 + pv + 2 );
00254   V21.reserve_pool( nv2 + pv + 2 );
00255   V22.reserve_pool( nv2 + pv + 2 );
00256 
00257   S11->pu = pu;
00258   S11->pv = pv;
00259   S11->net.nu = nu1;
00260   S11->net.nv = nv1;
00261   S11->net.Pw = Q11;
00262   S11->knu.m = nu1 + pu + 1;
00263   S11->knu.U = U11;
00264   S11->knv.m = nv1 + pv + 1;
00265   S11->knv.U = V11;
00266 
00267   S12->pu = pu;
00268   S12->pv = pv;
00269   S12->net.nu = nu2;
00270   S12->net.nv = nv1;
00271   S12->net.Pw = Q12;
00272   S12->knu.m = nu2 + pu + 1;
00273   S12->knu.U = U12;  
00274   S12->knv.m = nv1 + pv + 1;
00275   S12->knv.U = V12;
00276   
00277   S21->pu = pu;
00278   S21->pv = pv;
00279   S21->net.nu = nu1;
00280   S21->net.nv = nv2;
00281   S21->net.Pw = Q21;
00282   S21->knu.m = nu1 + pu + 1;
00283   S21->knu.U = U21;
00284   S21->knv.m = nv2 + pv + 1;
00285   S21->knv.U = V21;
00286 
00287   S22->pu = pu;
00288   S22->pv = pv;
00289   S22->net.nu = nu2;
00290   S22->net.nv = nv2;
00291   S22->net.Pw = Q22;
00292   S22->knu.m = nu2 + pu + 1;
00293   S22->knu.U = U22;  
00294   S22->knv.m = nv2 + pv + 1;
00295   S22->knv.U = V22;
00296 
00297 /* Array fuer alphas reservieren */
00298 
00299   nrows = rv > ru ? rv : ru;
00300   ncols = pv > pu ? pv : pu; 
00301 
00302   alpha.reserve_place( reserve_stack(Ptr< T >,nrows), nrows );
00303   for( i = 0; i < nrows; i++ )
00304     alpha[i].reserve_place( reserve_stack(T,ncols), ncols );
00305 
00306 /* Array fuer Hilfspunkte reservieren */
00307 
00308   R.reserve_place( reserve_stack(HP,ncols+1), ncols+1 );
00309 
00310   NR.reserve_place( reserve_stack(HP*,nv+rv+1), nv+rv+1 );
00311   for( i = 0; i <= kv - pv; i++ )
00312     NR[i] = P[i].get();
00313   for( i = kv - sv; i <= nv; i++ )
00314   {
00315     j = rv + i; 
00316     NR[j] = P[i].get();   
00317   } 
00318   if( rv > 0 )
00319   {
00320     NR_buf.reserve_place( reserve_stack(HP,(nu+1)*(pv-sv+rv-1)),
00321                           (nu+1)*(pv-sv+rv-1) );
00322 
00323     for( i = 0; i < pv - sv + rv - 1; i++ )
00324     {
00325       j = kv - pv + 1 + i; 
00326       NR[j] = &NR_buf[i * (nu + 1)];
00327     }
00328   }
00329   
00330   if( ru > 0 )
00331   {
00332     NP.reserve_place( reserve_stack(Ptr< HP >,nv+rv+1), nv+rv+1 );
00333     for( i = 0; i < nv+rv+1; i++ )
00334       NP[i].reserve_place( reserve_stack(HP,pu-su+ru-1), pu-su+ru-1 ); 
00335   }
00336 
00337 /* Alphas fuer V-Richtung berechnen: */
00338 
00339   for( ir = 1; ir <= rv; ir++ )
00340   {
00341     for( i = kv - pv + ir; i <= kv - sv; i++ )
00342     {
00343       alpha[ir - 1][i - (kv - pv + ir)] = 
00344                                    (v - V[i]) /  (V[i + pv - ir + 1] - V[i]);
00345     } 
00346   }
00347 
00348 /* Neue Kontrollpunkt-Zeilen berechnen, NR enthaelt nach Ausfuehrung 
00349    neue + unveraenderte Zeilen */
00350 
00351   ncols = nu;
00352   
00353   for( col = 0; col <= ncols; col++ )
00354   {
00355     /* Hilfspunkte R initialisieren */
00356 
00357     for( i = 0; i <= pv - sv; i++ )
00358     {
00359       R[i] = P[kv - pv + i][col];
00360     }
00361 
00362     for( ir = 1; ir <= rv; ir++ )
00363     {
00364       for( i = 0; i <= pv - sv - ir; i++ )
00365       {
00366         R[i] = (alpha[ir-1][i] * R[i+1]) + (((T)1.0 - alpha[ir-1][i]) * R[i]); 
00367       }
00368 
00369       NR[kv - pv + ir][col] = R[0];    
00370       NR[kv - sv + rv - ir][col] = R[pv - sv - ir];    
00371     }
00372 
00373     for( i = 1; i < pv - sv - rv; i++ ) 
00374       NR[kv - pv + rv + i][col] = R[i];
00375   }
00376 
00377 /* Neue Kontrollpunkte berechnen fuer jede Zeile row */
00378 /* NP enthaelt nach Ausfuehrung die neu entstandenen Kontrollpunkte */
00379 
00380 /* Alphas berechnen: */
00381 
00382   for( ir = 1; ir <= ru; ir++ )
00383   {
00384     for( i = ku - pu + ir; i <= ku - su; i++ )
00385     {
00386       alpha[ir - 1][i - (ku - pu + ir)] = 
00387                                     (u - U[i]) /  (U[i + pu - ir + 1] - U[i]);
00388     } 
00389   }
00390 
00391 /* Neue Kontrollpunkte NP berechnen, fuer jede Zeile row */
00392 
00393   nrows = nv + rv;
00394   
00395   for( row = 0; row <= nrows; row++ )
00396   {
00397     /* Hilfspunkte R initialisieren */
00398 
00399     for( i = 0; i <= pu - su; i++ )
00400     {
00401       R[i] = NR[row][ku - pu + i];
00402     }
00403 
00404     for( ir = 1; ir <= ru; ir++ )
00405     {
00406       for( i = 0; i <= pu - su - ir; i++ )
00407       {
00408         R[i] = (alpha[ir-1][i] * R[i+1]) + (((T)1.0 - alpha[ir-1][i]) * R[i]); 
00409       }
00410 
00411       NP[row][ir-1] = R[0];    
00412       NP[row][pu - su + ru - 1 - ir] = R[pu - su - ir];    
00413     }
00414 
00415     for( i = 1; i < pu - su - ru; i++ ) 
00416       NP[row][ru - 1 + i] = R[i];
00417   }
00418 
00419 /* Kontrollpunkt-Netze der 4 Teilflaechen bilden */
00420 
00421   for( row = 0; row <= kv - sv; row++ )
00422   {
00423     for( i = 0; i <= ku - pu; i++ )
00424     {
00425       Q11[row][i] = NR[row][i];  
00426     }
00427     
00428     for( i = 0; i <= pu - su - 1; i++ )
00429     {
00430       j = ku - pu + 1 + i;
00431       Q11[row][j] = NP[row][i];
00432     }
00433 
00434     for( i = pu - su - 1; i <= pu - su + ru - 2; i++ )
00435     {
00436       j = i - (pu - su - 1);  
00437       Q12[row][j] = NP[row][i];
00438     }
00439     
00440     for( i = ku - su; i <= nu; i++ )
00441     {
00442       j = ru + i - (ku - su);
00443       Q12[row][j] = NR[row][i];    
00444     }
00445   }
00446 
00447   for( row = kv - sv; row <= nv + rv; row++ )
00448   {
00449     for( i = 0; i <= ku - pu; i++ )
00450     {
00451       Q21[row - (kv - sv)][i] = NR[row][i];  
00452     }
00453     
00454     for( i = 0; i <= pu - su - 1; i++ )
00455     {
00456       j = ku - pu + 1 + i;
00457       Q21[row - (kv - sv)][j] = NP[row][i];
00458     }
00459   
00460     for( i = pu - su - 1; i <= pu - su + ru - 2; i++ )
00461     {
00462       j = i - (pu - su - 1);  
00463       Q22[row - (kv - sv)][j] = NP[row][i];
00464     }
00465 
00466     for( i = ku - su; i <= nu; i++ )
00467     {
00468       j = ru + i - (ku - su);
00469       Q22[row - (kv - sv)][j] = NR[row][i];    
00470     }
00471   }
00472 
00473 /* Knotenvektoren der 4 Teilflaechen bilden */
00474 
00475   for( i = 0; i <  ku - su + 1; i++ )
00476     U11[i] = U[i];
00477   for( i = 0; i <= pu; i++ )
00478     U11[ku - su + 1 + i] = u;
00479   NormalizeKnotVector( nu1, pu, U11 );
00480   for( i = 0; i < ku - su + pu + 2; i++ )
00481     U21[i] = U11[i];
00482 
00483   for( i = 0; i < nu + pu + 1 - ku; i++ )
00484     U12[pu+1+i] = U[ku+1+i];
00485   for( i = 0; i <= pu; i++ )
00486     U12[i] = u;
00487   NormalizeKnotVector( nu2, pu, U12 );
00488   for( i = 0; i < nu2 + pu + 2; i++ )
00489     U22[i] = U12[i];
00490 
00491 
00492   for( i = 0; i < kv - sv + 1; i++ )
00493     V11[i] = V[i];
00494   for( i = 0; i <= pv; i++ )
00495     V11[kv - sv + 1 + i] = v;
00496   NormalizeKnotVector( nv1, pv, V11 );
00497   for( i = 0; i < kv - sv + pv + 2; i++ )
00498     V12[i] = V11[i];
00499 
00500   for( i = 0; i < nv + pv + 1 - kv; i++ )
00501     V21[pv+1+i] = V[kv+1+i];
00502   for( i = 0; i <= pv; i++ )
00503     V21[i] = v;
00504   NormalizeKnotVector( nv2, pv, V21 );
00505   for( i = 0; i < nv2 + pv + 2; i++ )
00506     V22[i] = V21[i];
00507 }
00508 /*----------------------------------------------------------------------
00509   Splits a NURBS surface at point (u,v) into four parts
00510 ----------------------------------------------------------------------- */ 
00511 template void SplitSurface( 
00512    const surface< float, hpoint<float> > *Surf, const float u, const float v, 
00513    surface< float, hpoint<float> > *S11, surface< float, hpoint<float> > *S12, 
00514    surface< float, hpoint<float> > *S21, surface< float, hpoint<float> > *S22 );
00515 template void SplitSurface( 
00516 const surface< double, hpoint<double> > *Surf, const double u, const double v, 
00517 surface< double, hpoint<double> > *S11, surface< double, hpoint<double> > *S12, 
00518 surface< double, hpoint<double> > *S21, surface< double, hpoint<double> > *S22);
00519 
00520 template void SplitSurface( 
00521    const surface< float, point<float> > *Surf, const float u, const float v, 
00522    surface< float, point<float> > *S11, surface< float, point<float> > *S12, 
00523    surface< float, point<float> > *S21, surface< float, point<float> > *S22 );
00524 template void SplitSurface( 
00525 const surface< double, point<double> > *Surf, const double u, const double v, 
00526 surface< double, point<double> > *S11, surface< double, point<double> > *S12, 
00527 surface< double, point<double> > *S21, surface< double, point<double> > *S22);
00528 
00529 
00530 
00531 /*----------------------------------------------------------------------
00532   Extracts a part of a NURBS curve (ranging from 'u1' to 'u2')
00533 ----------------------------------------------------------------------*/  
00534 template< class T, class HP >
00535 GULAPI void ExtractCurve( 
00536          const T u1, const T u2,
00537          const int n, const int p, 
00538          Ptr< T > U, Ptr< HP > Pw,
00539          int *retn, Ptr< T > *retU, Ptr< HP > *retPw )
00540 {
00541   int a,ra,sa,b,rb,sb,N,i,r; 
00542   HP v1,v2;
00543   T alpha;
00544 
00545   Ptr< HP > Cw;
00546   Ptr< T > Uh;
00547 
00548   a = FindSpanMultip( u1, n, p, U, &sa );
00549   if( sa > p )          /* Klammerknoten am Anfang */
00550     ra = 0;
00551   else
00552     ra = p - sa;
00553 
00554   b = FindSpanMultip( u2, n, p, U, &sb );
00555   if( sb > p )         /* Klammerknoten am Ende */
00556   {
00557    sb = p;
00558    rb = 0;
00559    b += p;
00560   }
00561   else 
00562     rb = p - sb;
00563    
00564   N = (b-sb) - a + p;
00565 
00566   Cw.reserve_pool( N+1 );
00567   Uh.reserve_pool( N+p+2 );
00568  
00569 /* ---- Linken Knoten einfuegen, bis Vielfachheit = p ------------------- */
00570 
00571   for( i = 0; i <= p; i++ )
00572   {
00573     Cw[i] = Pw[a-p+i];
00574     Uh[i] = u1;
00575   }
00576      
00577   for( r = 1; r <= ra; r++ )
00578   {
00579     for( i = 0; i <= ra-r; i++ )
00580     {
00581       alpha = (u1 - U[a-p+r+i]) / (U[a+r+i] - U[a-p+r+i]);
00582       v1 = ((T)1.0-alpha) * Cw[i];
00583       v2 = alpha * Cw[i+1];
00584       Cw[i] =  v1 + v2;
00585     }
00586   }     
00587 
00588 /* ---- Unveraenderten Teil uebernehmen ----------------------------------- */
00589 
00590   for( i = 0; i < (b-sb)-a; i++ )
00591   {
00592     Uh[p+1+i] = U[a+1+i];
00593     Cw[p+1+i] = Pw[a+1+i];
00594   }
00595   
00596 /* ---- Rechten Knoten einfuegen, bis Vielfachheit = p --------------------- */   
00597 
00598   for( r = 1; r <= rb; r++ )
00599   {
00600     for( i = 0; i <= rb-r; i++ )
00601     {
00602       alpha = (u2 - U[b-sb-i]) / (U[b-sb-i+p] - U[b-sb-i]);
00603       v1 = alpha * Cw[N-i];
00604       v2 = ((T)1.0-alpha) * Cw[N-i-1];
00605       Cw[N-i] = v1 + v2;      
00606     }
00607   }
00608 
00609   for( i = 0; i <= p; i++ )
00610     Uh[N+1+i] = u2;
00611 
00612   *retn = N;
00613   *retPw = Cw;
00614   *retU = Uh;  
00615 }         
00616 // template instantiation
00617 template GULAPI void ExtractCurve( 
00618          const float u1, const float u2,
00619          const int n, const int p, 
00620          Ptr< float > U, Ptr< hpoint<float> > Pw,
00621          int *retn, Ptr< float > *retU, Ptr< hpoint<float> > *retPw );
00622 template GULAPI void ExtractCurve( 
00623          const double u1, const double u2,
00624          const int n, const int p, 
00625          Ptr< double > U, Ptr< hpoint<double> > Pw,
00626          int *retn, Ptr< double > *retU, Ptr< hpoint<double> > *retPw );
00627 template GULAPI void ExtractCurve( 
00628          const float u1, const float u2,
00629          const int n, const int p, 
00630          Ptr< float > U, Ptr< hpoint2<float> > Pw,
00631          int *retn, Ptr< float > *retU, Ptr< hpoint2<float> > *retPw );
00632 template GULAPI void ExtractCurve( 
00633          const double u1, const double u2,
00634          const int n, const int p, 
00635          Ptr< double > U, Ptr< hpoint2<double> > Pw,
00636          int *retn, Ptr< double > *retU, Ptr< hpoint2<double> > *retPw );
00637 
00638 template GULAPI void ExtractCurve( 
00639          const float u1, const float u2,
00640          const int n, const int p, 
00641          Ptr< float > U, Ptr< point<float> > Pw,
00642          int *retn, Ptr< float > *retU, Ptr< point<float> > *retPw );
00643 template GULAPI void ExtractCurve( 
00644          const double u1, const double u2,
00645          const int n, const int p, 
00646          Ptr< double > U, Ptr< point<double> > Pw,
00647          int *retn, Ptr< double > *retU, Ptr< point<double> > *retPw );
00648 template GULAPI void ExtractCurve( 
00649          const float u1, const float u2,
00650          const int n, const int p, 
00651          Ptr< float > U, Ptr< point2<float> > Pw,
00652          int *retn, Ptr< float > *retU, Ptr< point2<float> > *retPw );
00653 template GULAPI void ExtractCurve( 
00654          const double u1, const double u2,
00655          const int n, const int p, 
00656          Ptr< double > U, Ptr< point2<double> > Pw,
00657          int *retn, Ptr< double > *retU, Ptr< point2<double> > *retPw );
00658 
00659 
00660 /*----------------------------------------------------------------------
00661   Extracts a part of a NURBS surface (ranging from 'u1' to 'u2' and 
00662   'v1' to 'v2')
00663 ----------------------------------------------------------------------*/  
00664 template< class T, class HP >
00665 GULAPI void ExtractSurface( 
00666          const T u1, const T u2,
00667          const T v1, const T v2,
00668          const int nu, const int pu, Ptr< T > U,
00669          const int nv, const int pv, Ptr< T > V,
00670          Ptr< Ptr< HP > > Pw,
00671          int *ret_nu, Ptr< T > *retU, 
00672          int *ret_nv, Ptr< T > *retV, 
00673          Ptr< Ptr< HP > > *retPw )
00674 {
00675   int a,sa,ra,b,sb,rb,c,sc,rc,d,sd,rd,r,Nv,Nu,i,j,row,col;
00676   HP V1,V2;
00677   T alpha;
00678 
00679   Ptr< Ptr< HP > > Sw;
00680   Ptr< T > Uh,Vh;
00681 
00682   a = FindSpanMultip( v1, nv, pv, V, &sa );
00683   if( sa > pv )          /* Klammerknoten am Anfang */
00684     ra = 0;
00685   else
00686     ra = pv - sa;
00687 
00688   b = FindSpanMultip( v2, nv, pv, V, &sb );
00689   if( sb > pv )         /* Klammerknoten am Ende */
00690   {
00691    sb = pv;
00692    rb = 0;
00693    b += pv;
00694   }
00695   else 
00696     rb = pv - sb;
00697    
00698   Nv = (b-sb) - a + pv;
00699 
00700   c = FindSpanMultip( u1, nu, pu, U, &sc );
00701   if( sc > pu )          /* Klammerknoten am Anfang */
00702     rc = 0;
00703   else
00704     rc = pu - sc;
00705 
00706   d = FindSpanMultip( u2, nu, pu, U, &sd );
00707   if( sd > pu )         /* Klammerknoten am Ende */
00708   {
00709    sd = pu;
00710    rd = 0;
00711    d += pu;
00712   }
00713   else 
00714     rd = pu - sd;
00715    
00716   Nu = (d-sd) - c + pu;
00717 
00718   Sw.reserve_pool( Nv+1 );
00719   for( i = 0; i < Nv+1; i++ )
00720     Sw[i].reserve_pool( Nu+1 ); 
00721 
00722   Uh.reserve_pool( Nu+pu+2 );
00723   Vh.reserve_pool( Nv+pv+2 );
00724 
00725   for( i = 0; i <= Nv; i++ )
00726     for( j = 0; j < Nu+1; j++ )
00727       Sw[i][j] = Pw[a-pv+i][c-pu+j];
00728  
00729 /*-----------------------------------------------------------------------
00730   V-Richtung
00731 ----------------------------------------------------------------------- */  
00732 
00733 /* ---- Oberen Knoten einfuegen, bis Vielfachheit = p ------------------- */
00734 
00735   for( i = 0; i <= pv; i++ )
00736     Vh[i] = v1;
00737 
00738   for( r = 1; r <= ra; r++ )
00739   {
00740     for( i = 0; i <= ra-r; i++ )
00741     {
00742       alpha = (v1 - V[a-pv+r+i]) / (V[a+r+i] - V[a-pv+r+i]);
00743       for( col = 0; col <= Nu; col++ )
00744       {     
00745         V1 = ((T)1.0-alpha) * Sw[i][col];
00746         V2 = alpha * Sw[i+1][col];
00747         Sw[i][col] = V1 + V2;
00748       }
00749     }
00750   }     
00751 
00752 /* ---- Unveraenderten Teil uebernehmen ----------------------------------- */
00753 
00754   for( i = 0; i < b-sb-a; i++ )
00755     Vh[pv+1+i] = V[a+1+i];
00756 
00757 /* ---- Unteren Knoten einfuegen, bis Vielfachheit = p --------------------- */   
00758 
00759   for( r = 1; r <= rb; r++ )
00760   {
00761     for( i = 0; i <= rb-r; i++ )
00762     {
00763       alpha = (v2 - V[b-sb-i]) / (V[b-sb-i+pv] - V[b-sb-i]);
00764       for( col = 0; col <= Nu; col++ )
00765       {     
00766         V1 = alpha * Sw[Nv-i][col];
00767         V2 = ((T)1.0-alpha) * Sw[Nv-i-1][col];
00768         Sw[Nv-i][col] = V1 + V2;      
00769       }
00770     }
00771   }
00772 
00773   for( i = 0; i <= pv; i++ )
00774     Vh[Nv+1+i] = v2;
00775 
00776 
00777 /*-----------------------------------------------------------------------
00778   U-Richtung
00779 ----------------------------------------------------------------------- */  
00780 
00781 /* ---- Linken Knoten einfuegen, bis Vielfachheit = p ------------------- */
00782 
00783   for( i = 0; i <= pu; i++ )
00784     Uh[i] = u1;
00785 
00786   for( r = 1; r <= rc; r++ )
00787   {
00788     for( i = 0; i <= rc-r; i++ )
00789     {
00790       alpha = (u1 - U[c-pu+r+i]) / (U[c+r+i] - U[c-pu+r+i]);
00791       for( row = 0; row <= Nv; row++ )
00792       {     
00793         V1 = ((T)1.0-alpha) * Sw[row][i];
00794         V2 = alpha * Sw[row][i+1];
00795         Sw[row][i] = V1 + V2;
00796       }
00797     }
00798   }  
00799 
00800 /* ---- Unveraenderten Teil uebernehmen ----------------------------------- */
00801 
00802   for( i = 0; i < d-sd-c; i++ )
00803     Uh[pu+1+i] = U[c+1+i];
00804 
00805 /* ---- Rechten Knoten einfuegen, bis Vielfachheit = p --------------------- */   
00806 
00807   for( r = 1; r <= rd; r++ )
00808   {
00809     for( i = 0; i <= rd-r; i++ )
00810     {
00811       alpha = (u2 - U[d-sd-i]) / (U[d-sd-i+pu] - U[d-sd-i]);
00812       for( row = 0; row <= Nv; row++ )
00813       {     
00814         V1 = alpha * Sw[row][Nu-i];
00815         V2 = ((T)1.0-alpha) * Sw[row][Nu-i-1];
00816         Sw[row][Nu-i] = V1 + V2;      
00817       }
00818     }
00819   }
00820 
00821   for( i = 0; i <= pu; i++ )
00822     Uh[Nu+1+i] = u2;
00823 
00824 /* ------------------------------------------------------------------------- */
00825 
00826   *ret_nu = Nu;
00827   *ret_nv = Nv;
00828   *retU = Uh;
00829   *retV = Vh;
00830   *retPw = Sw;  
00831 }
00832 /*----------------------------------------------------------------------
00833   Extracts a part of a NURBS surface (ranging from 'u1' to 'u2' and 
00834   'v1' to 'v2')
00835 ----------------------------------------------------------------------*/  
00836 template GULAPI void ExtractSurface( 
00837          const float u1, const float u2,
00838          const float v1, const float v2,
00839          const int nu, const int pu, Ptr< float > U,
00840          const int nv, const int pv, Ptr< float > V,
00841          Ptr< Ptr< hpoint<float> > > Pw,
00842          int *ret_nu, Ptr< float > *retU, 
00843          int *ret_nv, Ptr< float > *retV, 
00844          Ptr< Ptr < hpoint<float> > > *retPw );
00845 template GULAPI void ExtractSurface( 
00846          const double u1, const double u2,
00847          const double v1, const double v2,
00848          const int nu, const int pu, Ptr< double > U,
00849          const int nv, const int pv, Ptr< double > V,
00850          Ptr< Ptr< hpoint<double> > > Pw,
00851          int *ret_nu, Ptr< double > *retU, 
00852          int *ret_nv, Ptr< double > *retV, 
00853          Ptr< Ptr < hpoint<double> > > *retPw );
00854 template GULAPI void ExtractSurface( 
00855          const float u1, const float u2,
00856          const float v1, const float v2,
00857          const int nu, const int pu, Ptr< float > U,
00858          const int nv, const int pv, Ptr< float > V,
00859          Ptr< Ptr< point<float> > > Pw,
00860          int *ret_nu, Ptr< float > *retU, 
00861          int *ret_nv, Ptr< float > *retV, 
00862          Ptr< Ptr < point<float> > > *retPw );
00863 template GULAPI void ExtractSurface( 
00864          const double u1, const double u2,
00865          const double v1, const double v2,
00866          const int nu, const int pu, Ptr< double > U,
00867          const int nv, const int pv, Ptr< double > V,
00868          Ptr< Ptr< point<double> > > Pw,
00869          int *ret_nu, Ptr< double > *retU, 
00870          int *ret_nv, Ptr< double > *retV, 
00871          Ptr< Ptr < point<double> > > *retPw );
00872 
00873 template GULAPI void ExtractSurface( 
00874          const float u1, const float u2,
00875          const float v1, const float v2,
00876          const int nu, const int pu, Ptr< float > U,
00877          const int nv, const int pv, Ptr< float > V,
00878          Ptr< Ptr< point1<float> > > Pw,
00879          int *ret_nu, Ptr< float > *retU, 
00880          int *ret_nv, Ptr< float > *retV, 
00881          Ptr< Ptr < point1<float> > > *retPw );
00882 template GULAPI void ExtractSurface( 
00883          const double u1, const double u2,
00884          const double v1, const double v2,
00885          const int nu, const int pu, Ptr< double > U,
00886          const int nv, const int pv, Ptr< double > V,
00887          Ptr< Ptr< point1<double> > > Pw,
00888          int *ret_nu, Ptr< double > *retU, 
00889          int *ret_nv, Ptr< double > *retV, 
00890          Ptr< Ptr < point1<double> > > *retPw );
00891 template GULAPI void ExtractSurface( 
00892          const float u1, const float u2,
00893          const float v1, const float v2,
00894          const int nu, const int pu, Ptr< float > U,
00895          const int nv, const int pv, Ptr< float > V,
00896          Ptr< Ptr< hpoint1<float> > > Pw,
00897          int *ret_nu, Ptr< float > *retU, 
00898          int *ret_nv, Ptr< float > *retV, 
00899          Ptr< Ptr < hpoint1<float> > > *retPw );
00900 template GULAPI void ExtractSurface( 
00901          const double u1, const double u2,
00902          const double v1, const double v2,
00903          const int nu, const int pu, Ptr< double > U,
00904          const int nv, const int pv, Ptr< double > V,
00905          Ptr< Ptr< hpoint1<double> > > Pw,
00906          int *ret_nu, Ptr< double > *retU, 
00907          int *ret_nv, Ptr< double > *retV, 
00908          Ptr< Ptr < hpoint1<double> > > *retPw );
00909 
00910 }
00911 
00912 
00913 
00914 
00915 
00916 
00917 
00918 
00919 
00920 
00921 
00922 
00923 
00924 

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