00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
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
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
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
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
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
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
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
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
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
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
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
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
00349
00350
00351 ncols = nu;
00352
00353 for( col = 0; col <= ncols; col++ )
00354 {
00355
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
00378
00379
00380
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
00392
00393 nrows = nv + rv;
00394
00395 for( row = 0; row <= nrows; row++ )
00396 {
00397
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
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
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
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
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 )
00550 ra = 0;
00551 else
00552 ra = p - sa;
00553
00554 b = FindSpanMultip( u2, n, p, U, &sb );
00555 if( sb > p )
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
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
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
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
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
00662
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 )
00684 ra = 0;
00685 else
00686 ra = pv - sa;
00687
00688 b = FindSpanMultip( v2, nv, pv, V, &sb );
00689 if( sb > pv )
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 )
00702 rc = 0;
00703 else
00704 rc = pu - sc;
00705
00706 d = FindSpanMultip( u2, nu, pu, U, &sd );
00707 if( sd > pu )
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
00731
00732
00733
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
00753
00754 for( i = 0; i < b-sb-a; i++ )
00755 Vh[pv+1+i] = V[a+1+i];
00756
00757
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
00779
00780
00781
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
00801
00802 for( i = 0; i < d-sd-c; i++ )
00803 Uh[pu+1+i] = U[c+1+i];
00804
00805
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
00834
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