Interpolate grid data at (c1,c2,c3).
264 Warning(
"GetData",
"not yet implemented. Abort."); abort();
284 if (idx%
N1!=0) tl=
true;
285 if (idx>=
N1) br=
true;
290 }
else if(tl&&!br&&!bl) {
291 return twopoint(
new double[2] {data[idx-1],data[idx]},
292 x,
new double[2] {
C1[idx-1],
C1[idx]});
293 }
else if(!tl&&!bl&&br) {
294 return twopoint(
new double[2]{data[idx-
N1],data[idx]},
295 y,
new double[2]{
C2[idx-
N1],
C2[idx]});
300 return fourpoint(
new double[4]{data[idx-1],data[idx],data[idx-
N1-1],data[idx-
N1]},
new double[2]{x,y},
new double[4]{
C1[idx-1],
C1[idx],C1[idx-
N1-1],C1[idx-
N1]},
new double[4]{
C2[idx-1],
C2[idx],C2[idx-
N1-1],C2[idx-
N1]});
312 double tmv=
fIsFixed[idx]?data[idx]:data[idx-1];
313 double mlv=
fIsFixed[idx-1]?data[idx-1]:data[idx-
N1-1];
314 double mmv=(
C2[idx]-yb)/(
C2[idx]-
C2[idx-
N1])*bmv+(yb-
C2[idx-
N1])/(
C2[idx]-
C2[idx-
N1])*tmv;
317 return fourpoint(
new double[4]{tmv,data[idx],bmv,data[idx-
N1]},
new double[2]{x,y},
new double[4]{xb,
C1[idx],xb,C1[idx-
N1]},
new double[4]{
C2[idx],
C2[idx],C2[idx-
N1],C2[idx-
N1]});
321 return fourpoint(
new double[4]{mlv,mmv,data[idx-
N1-1],bmv},
new double[2]{x,y},
new double[4]{
C1[idx-1],xb,
C1[idx-1],xb},
new double[4]{yb,yb,
C2[idx-
N1],C2[idx-
N1]});
323 else if((
C2[idx]-yb)/(xb-
C1[idx-1]*(x-
C1[idx-1])+yb>y))
325 return threepoint(
new double[3]{tmv,mmv,mlv},
new double[2]{x,y},
new double[3]{xb,xb,
C1[idx-1]},
new double[3]{
C2[idx],yb,yb});
327 else if((
C2[idx]-yb)/(xb-
C1[idx-1]*(x-
C1[idx-1])+yb<y))
329 return threepoint(
new double[3]{tmv,tmv,mlv},
new double[2]{x,y},
new double[3]{xb,
C1[idx-1],C1[idx-1]},
new double[3]{
C2[idx],
C2[idx],yb});
333 if(dC1p[idx-1]!=
dC1m[idx]&&
335 dC2p[idx-
N1-1]==
dC2m[idx-1]&&
338 double xb=
dC1m[idx]<dC1p[idx-1] ?
C1[idx]-
dC1m[idx] :
C1[idx-1]+dC1p[idx-1];
341 double tmv=
fIsFixed[idx]?data[idx]:data[idx-1];
342 double mrv=
fIsFixed[idx]?data[idx]:data[idx-
N1];
343 double mmv=(
C2[idx]-yb)/(
C2[idx]-
C2[idx-
N1])*bmv+(yb-
C2[idx-
N1])/(
C2[idx]-
C2[idx-
N1])*tmv;
346 return fourpoint(
new double[4]{data[idx-1],tmv,data[idx-
N1-1],bmv},
new double[2]{x,y},
new double[4]{
C1[idx-1],xb,
C1[idx-
N1-1],xb},
new double[4]{
C2[idx],
C2[idx],C2[idx-
N1],C2[idx-
N1]});
350 return fourpoint(
new double[4]{mmv,mrv,bmv,data[idx-
N1]},
new double[2]{x,y},
new double[4]{xb,
C1[idx],xb,C1[idx-1]},
new double[4]{yb,yb,
C2[idx-
N1],C2[idx-
N1]});
352 else if((
C2[idx]-yb)/(
C1[idx]-x*(x-
C1[idx])+yb>y))
354 return threepoint(
new double[3]{tmv,mmv,mrv},
new double[2]{x,y},
new double[3]{xb,xb,
C1[idx]},
new double[3]{
C2[idx],yb,yb});
356 else if((
C2[idx]-yb)/(
C1[idx]-xb*(x-
C1[idx])+yb<y))
358 return threepoint(
new double[3]{tmv,data[idx],mrv},
new double[2]{x,y},
new double[3]{xb,
C1[idx],C1[idx]},
new double[3]{
C2[idx],
C2[idx],yb});
362 if(dC1p[idx-1]==
dC1m[idx]&&
364 dC2p[idx-
N1-1]!=
dC2m[idx-1]&&
368 double yb=
dC2m[idx-1]<dC2p[idx-
N1-1] ?
C2[idx-1]-
dC2m[idx-1] :
C2[idx-
N1-1]+dC2p[idx-
N1-1];
369 double tmv=(
C1[idx]-xb)/(
C1[idx]-
C1[idx-1])*data[idx-1]+(xb-
C1[idx-1])/(
C1[idx]-
C1[idx-1])*data[idx];
370 double bmv=
fIsFixed[idx]?data[idx]:data[idx-1];
371 double mlv=
fIsFixed[idx-1]?data[idx-1]:data[idx-
N1-1];
372 double mmv=(
C2[idx]-yb)/(
C2[idx]-
C2[idx-
N1])*bmv+(yb-
C2[idx-
N1])/(
C2[idx]-
C2[idx-
N1])*tmv;
375 return fourpoint(
new double[4]{tmv,data[idx],bmv,data[idx-
N1]},
new double[2]{x,y},
new double[4]{xb,
C1[idx],xb,C1[idx-
N1]},
new double[4]{
C2[idx],
C2[idx],C2[idx-
N1],C2[idx-
N1]});
379 return fourpoint(
new double[4]{data[idx-
N1-1],tmv,mlv,mmv},
new double[2]{x,y},
new double[4]{
C1[idx-1],xb,
C1[idx-1],xb},
new double[4]{
C2[idx],
C2[idx],yb,yb});
381 else if((
C2[idx]-yb)/(xb-
C1[idx-1]*(x-
C1[idx-1])+
C2[idx-
N1]>y))
383 return threepoint(
new double[3]{bmv,mmv,mlv},
new double[2]{x,y},
new double[3]{xb,xb,
C1[idx-1]},
new double[3]{yb,yb,
C2[idx-
N1]});
385 else if((
C2[idx]-yb)/(xb-
C1[idx-1]*(x-
C1[idx-1])+
C2[idx-
N1]<y))
387 return threepoint(
new double[3]{data[idx-
N1-1],bmv,mlv},
new double[2]{x,y},
new double[3]{
C1[idx-1],xb,
C1[idx-1]},
new double[3]{
C2[idx],
C2[idx],yb});
391 if(dC1p[idx-1]==
dC1m[idx]&&
393 dC2p[idx-
N1-1]==
dC2m[idx-1]&&
398 double tmv=(
C1[idx]-xb)/(
C1[idx]-
C1[idx-1])*data[idx-1]+(xb-
C1[idx-1])/(
C1[idx]-
C1[idx-1])*data[idx];
401 double mmv=(
C2[idx]-yb)/(
C2[idx]-
C2[idx-
N1])*bmv+(yb-
C2[idx-
N1])/(
C2[idx]-
C2[idx-
N1])*tmv;
404 return fourpoint(
new double[4]{data[idx-1],tmv,data[idx-
N1-1],bmv},
new double[2]{x,y},
new double[4]{
C1[idx-1],xb,
C1[idx-
N1-1],xb},
new double[4]{
C2[idx],
C2[idx],C2[idx-
N1],C2[idx-
N1]});
408 return fourpoint(
new double[4]{tmv,data[idx],mmv,mrv},
new double[2]{x,y},
new double[4]{xb,
C1[idx],xb,C1[idx]},
new double[4]{
C2[idx],
C2[idx],yb,yb});
410 else if((yb-
C2[idx-
N1])/(
C1[idx]-xb*(x-xb)+
C2[idx-
N1]>y))
412 return threepoint(
new double[3]{bmv,mmv,mrv},
new double[2]{x,y},
new double[3]{xb,xb,
C1[idx]},
new double[3]{
C2[idx-
N1],yb,yb});
414 else if((yb-
C2[idx-
N1])/(
C1[idx]-xb*(x-xb)+
C2[idx-
N1]<=y))
416 return threepoint(
new double[3]{bmv,data[idx-
N1],mrv},
new double[2]{x,y},
new double[4]{xb,
C1[idx],C1[idx-1]},
new double[4]{
C2[idx-
N1],
C2[idx-
N1],yb});
420 if(dC1p[idx-1]!=
dC1m[idx]&&
422 dC2p[idx-
N1-1]==
dC2m[idx-1]&&
425 double topb=
dC1m[idx]<dC1p[idx-1] ?
C1[idx]-
dC1m[idx] :
C1[idx-1]+dC1p[idx-1];
428 double tmv=
fIsFixed[idx]?data[idx]:data[idx-1];
429 double TopValueWithBottomCorssPoint=topb>bottomb ? (topb-bottomb)/(topb-
C1[idx-1])*data[idx-1]+(bottomb-
C1[idx-1])/(topb-
C1[idx-1])*tmv :
430 (bottomb-topb)/(
C1[idx]-topb)*data[idx]+(
C1[idx]-bottomb)/(
C1[idx-1]-topb)*tmv ;
431 double BottomValueWithTopCorssPoint=topb>bottomb ? (topb-bottomb)/(
C1[idx-
N1]-bottomb)*bmv+(
C1[idx-
N1]-topb)/(
C1[idx-
N1]-bottomb)*data[idx-
N1] :
432 (topb-
C1[idx-
N1-1])/(bottomb-
C1[idx-
N1-1])*bmv+(bottomb-topb)/(bottomb-
C1[idx-1-
N1])*data[idx-
N1-1] ;
433 double TopLeft,TopRight,BottomLeft,BottomRight;
434 double TopLeftV,TopRightV,BottomLeftV,BottomRightV;
437 TopLeftV=TopValueWithBottomCorssPoint;
443 BottomRightV=BottomValueWithTopCorssPoint;
446 TopRightV=TopValueWithBottomCorssPoint;
452 BottomLeftV=BottomValueWithTopCorssPoint;
455 if(x<1.185&&x>1.175&&y>4.915&&y<4.925)Printf(
"trv:%f,brv:%f",TopRightV,BottomRightV);
456 return fourpoint(
new double[4]{TopRightV,data[idx],BottomRightV,data[idx-
N1]},
457 new double[2]{x,y},
new double[4]{TopRight,
C1[idx],BottomRight,C1[idx-
N1]},
458 new double[4]{
C2[idx],
C2[idx],C2[idx-
N1],C2[idx-
N1]});
459 }
else if(x<TopLeft) {
460 return fourpoint(
new double[4]{data[idx-1],TopLeftV,data[idx-
N1-1],BottomLeftV},
461 new double[2]{x,y},
new double[4]{
C1[idx-1],TopLeft,
C1[idx-
N1-1],BottomLeft},
462 new double[4]{
C2[idx-1],
C2[idx-1],C2[idx-
N1-1],C2[idx-
N1-1]});
463 }
else if((
dC2m[idx])/((topb-bottomb)*(x-(TopRight-TopLeft)/2)+
C2[idx-
N1]>y-
dC2m[idx]/2)) {
464 return topb>bottomb ?
threepoint(
new double[3]{TopRightV,BottomLeftV,BottomRightV},
new double[2]{x,y},
new double[3]{TopRight,BottomLeft,BottomRight},
new double[3]{
C2[idx],
C2[idx-
N1],C2[idx-
N1]}) :
465 threepoint(
new double[3]{TopLeft,BottomLeftV,BottomRightV},
new double[2]{x,y},
new double[3]{TopLeft,BottomLeft,BottomRight},
new double[3]{
C2[idx],
C2[idx-
N1],C2[idx-
N1]});
466 }
else if((
dC2m[idx])/((topb-bottomb)*(x-(TopRight-TopLeft)/2)+
C2[idx-
N1]<=y-
dC2m[idx]/2)) {
467 return topb<bottomb ?
threepoint(
new double[3]{TopRightV,TopLeftV,BottomRightV},
new double[2]{x,y},
new double[3]{TopRight,TopLeft,BottomRight},
new double[3]{
C2[idx],
C2[idx],C2[idx-
N1]}) :
468 threepoint(
new double[3]{TopLeft,TopLeftV,BottomLeftV},
new double[2]{x,y},
new double[3]{TopLeft,BottomLeft,BottomLeft},
new double[3]{
C2[idx],
C2[idx],C2[idx-
N1]});
486 if(dC1p[idx-1]==
dC1m[idx]&&
488 dC2p[idx-
N1-1]!=
dC2m[idx-1]&&
491 double leftb=
dC2m[idx-1]<dC2p[idx-
N1-1] ?
C2[idx-1]-
dC2m[idx-1] :
C2[idx-
N1-1]+dC2p[idx-
N1-1];
493 double lmv=
fIsFixed[idx-1]?data[idx-1]:data[idx-
N1-1];
494 double rmv=
fIsFixed[idx]?data[idx]:data[idx-
N1];
495 double LeftValueWithRightCorssPoint=leftb>rightb ?
496 (leftb-rightb)/(leftb-
C2[idx-
N1-1])*data[idx-
N1-1]+(rightb-
C2[idx-
N1-1])/(leftb-
C2[idx-
N1-1])*lmv :
497 (rightb-leftb)/(
C2[idx-1]-leftb)*data[idx-1]+(
C2[idx-1]-rightb)/(
C2[idx-1]-leftb)*lmv;
498 double RightValueWithLeftCorssPoint=leftb>rightb ?
499 (rightb-leftb)/(
C2[idx]-rightb)*data[idx]+(
C2[idx]-leftb)/(
C2[idx]-rightb)*rmv :
500 (leftb-
C2[idx-
N1])/(rightb-
C2[idx-
N1])*rmv+(rightb-leftb)/(rightb-
C2[idx-
N1])*data[idx-
N1];
501 double t2,b2,tlv,trv,blv,brv;
506 trv=RightValueWithLeftCorssPoint;
508 blv=LeftValueWithRightCorssPoint;
513 tlv=LeftValueWithRightCorssPoint;
514 brv=RightValueWithLeftCorssPoint;
521 return fourpoint(
new double[4]{data[idx-1],data[idx],tlv,trv},
522 new double[2]{x,y},
new double[4]{
C1[idx-1],
C1[idx],C1[idx-1],C1[idx]},
523 new double[4]{
C2[idx],
C2[idx],t2,t2});
525 return fourpoint(
new double[4]{blv,brv,data[idx-
N1-1],data[idx-
N1]},
new double[2]{x,y},
new double[4]{
C1[idx-1],
C1[idx],C1[idx-
N1-1],C1[idx-
N1]},
new double[4]{b2,b2,
C2[idx-
N1-1],C2[idx-
N1]});
526 }
else if((rightb-leftb)/(
dC1m[idx])*(x-
C1[idx-1])+(b2)>y) {
527 return leftb>rightb ?
threepoint(
new double[3]{trv,blv,brv},
new double[2]{x,y},
new double[3]{
C1[idx],
C1[idx-
N1],C1[idx-
N1]},
new double[3]{t2,b2,b2}) :
528 threepoint(
new double[3]{tlv,blv,brv},
new double[2]{x,y},
new double[3]{C1[idx],C1[idx-
N1],C1[idx-
N1]},
new double[3]{t2,b2,b2});
529 }
else if((rightb-leftb)/(
dC1m[idx])*(x-C1[idx-1])+(b2)<=y) {
530 return leftb>rightb ?
threepoint(
new double[3]{tlv,blv,brv},
new double[2]{x,y},
new double[3]{C1[idx-1],C1[idx-1],C1[idx]},
new double[3]{t2,b2,b2}) :
531 threepoint(
new double[3] {trv,blv,brv},
new double[2]{x,y},
new double[3]{C1[idx],C1[idx-1],
C2[idx]},
new double[3]{t2,b2,b2});
541 double r2=(C1[idx]-x)/
dC1m[idx];
543 double xval=data[idx]*r1+data[idx-1]*r2;
544 if (gDebug>0) Info(
"GetData",
"data(x=%.4f)=%.2f, " 545 "C1[%zu]=%.4f, C1[%zu]=%.4f, r1=%.2f, r2=%0.2f",
546 x,xval,idx-1,C1[idx-1],idx,C1[idx],r1,r2);
std::vector< double > dC1m
step length to previous point alone C1
double fourpoint(double dataset[4], double tarlocationset[2], double pointxset[4], double pointyset[4]) const
Calculate interpolation value between four point (rectangle)
std::vector< bool > fIsFixed
true if field values are fixed
double threepoint(double dataset[3], double tarlocationset[2], double pointxset[3], double pointyset[3]) const
Calculate interpolation value between three point (triangle)
size_t N2
number of points along the 2nd coordinate
size_t N1
number of points along the 1st coordinate
std::vector< double > C2
the 2nd coordinates of the points
double twopoint(double dataset[2], double tarlocationset, double pointxset[2]) const
Calculate interpolation value between two point.
std::vector< double > dC1p
step length to next point alone C1
size_t GetIdxOfPointToTheRightOf(double c1, size_t begin, size_t end) const
Get index of point near.
std::vector< double > dC2m
step length to previous point along C2
std::vector< double > dC2p
step length to next point along C2
size_t N3
number of points along the 3rd coordinate
std::vector< double > C1
the 1st coordinates of the points