35 #ifndef AIMS_MATH_GRADIENT_H
36 #define AIMS_MATH_GRADIENT_H
456 template <
class C>
inline
460 int beginx=0,endx=0,offx1=0,offx2=0;
462 std::vector<int> dims = data->getSize();
463 std::vector<float> vs = data->getVoxelSize();
495 for (
int t=0;t<dims[3];t++)
496 for (
int z=0;z<dims[2];z++)
497 for (
int y=0;y<dims[1];y++)
498 for (
int x=beginx;x<endx;x++)
499 grad(x,y,z,t) = (C)( ((
float)data->at(x+offx2,y,z,t) -
500 (float)data->at(x-offx1,y,z,t)) / divx);
505 template <
class C>
inline
509 int beginy=0,endy=0,offy1=0,offy2=0;
511 std::vector<int> dims = data->getSize();
512 std::vector<float> vs = data->getVoxelSize();
521 offy1=1;offy2=1;divy=2 * vs[1];
break;
523 offy1=1;offy2=0;divy=vs[1];
break;
525 offy1=0;offy2=1;divy=vs[1];
break;
528 for (
int t=0;t<dims[3];t++)
529 for (
int z=0;z<dims[2];z++)
530 for (
int y=beginy;y<endy;y++)
531 for (
int x=0;x<dims[0];x++)
532 grad(x,y,z,t) = (C)(((
float)data->at(x,y+offy2,z,t) -
533 (float)data->at(x,y-offy1,z,t)) / divy);
538 template <
class C>
inline
542 int beginz=0,endz=0,offz1=0,offz2=0;
544 std::vector<int> dims = data->getSize();
545 std::vector<float> vs = data->getVoxelSize();
554 offz1=1;offz2=1;divz=2 * vs[2];
break;
556 offz1=1;offz2=0;divz=vs[2];
break;
558 offz1=0;offz2=1;divz=vs[2];
break;
561 for (
int t=0;t<dims[3];t++)
562 for (
int z=beginz;z<endz;z++)
563 for (
int y=0;y<dims[1];y++)
564 for (
int x=0;x<dims[0];x++)
565 grad(x,y,z,t) = (C)(((
float)data->at(x,y,z+offz2,t) -
566 (float)data->at(x,y,z-offz1,t)) / divz);
571 template <
class C>
inline
575 int begint=0,endt=0,offt1=0,offt2=0;
577 std::vector<int> dims = data->getSize();
578 std::vector<float> vs = data->getVoxelSize();
587 offt1=1;offt2=1;divt=2 * vs[3];
break;
589 offt1=1;offt2=0;divt=vs[3];
break;
591 offt1=0;offt2=1;divt=vs[3];
break;
594 for (
int t=begint;t<endt;t++)
595 for (
int z=0;z<dims[2];z++)
596 for (
int y=0;y<dims[1];y++)
597 for (
int x=0;x<dims[0];x++)
598 grad(x,y,z,t) = (C)(((
float)data->at(x,y,z,t+offt2) -
599 (float)data->at(x,y,z,t-offt1)) / divt);
606 template <
class C>
inline
608 {
return(X(X(data)));
611 template <
class C>
inline
613 {
return(X(Y(data)));
616 template <
class C>
inline
618 {
return(X(Z(data)));
621 template <
class C>
inline
623 {
return(X(T(data)));
627 template <
class C>
inline
629 {
return(Y(X(data)));
632 template <
class C>
inline
634 {
return(Y(Y(data)));
637 template <
class C>
inline
639 {
return(Y(Z(data)));
642 template <
class C>
inline
644 {
return(Y(T(data)));
648 template <
class C>
inline
650 {
return(Z(X(data)));
653 template <
class C>
inline
655 {
return(Z(Y(data)));
658 template <
class C>
inline
660 {
return(Z(Z(data)));
663 template <
class C>
inline
665 {
return(Z(T(data)));
669 template <
class C>
inline
671 {
return(T(X(data)));
674 template <
class C>
inline
676 {
return(T(Y(data)));
679 template <
class C>
inline
681 {
return(T(Z(data)));
684 template <
class C>
inline
686 {
return(T(T(data)));
692 template <
class C>
inline
694 {
return(X(XX(data)));
697 template <
class C>
inline
699 {
return(X(XY(data)));
702 template <
class C>
inline
704 {
return(X(XZ(data)));
707 template <
class C>
inline
709 {
return(X(XT(data)));
713 template <
class C>
inline
715 {
return(X(YX(data)));
718 template <
class C>
inline
720 {
return(X(YY(data)));
723 template <
class C>
inline
725 {
return(X(YZ(data)));
728 template <
class C>
inline
730 {
return(X(YT(data)));
734 template <
class C>
inline
736 {
return(X(ZX(data)));
739 template <
class C>
inline
741 {
return(X(ZY(data)));
744 template <
class C>
inline
746 {
return(X(ZZ(data)));
749 template <
class C>
inline
751 {
return(X(ZT(data)));
755 template <
class C>
inline
757 {
return(X(TX(data)));
760 template <
class C>
inline
762 {
return(X(TY(data)));
765 template <
class C>
inline
767 {
return(X(TZ(data)));
770 template <
class C>
inline
772 {
return(X(TT(data)));
776 template <
class C>
inline
778 {
return(Y(XX(data)));
781 template <
class C>
inline
783 {
return(Y(XY(data)));
786 template <
class C>
inline
788 {
return(Y(XZ(data)));
791 template <
class C>
inline
793 {
return(Y(XT(data)));
797 template <
class C>
inline
799 {
return(Y(YX(data)));
802 template <
class C>
inline
804 {
return(Y(YY(data)));
807 template <
class C>
inline
809 {
return(Y(YZ(data)));
812 template <
class C>
inline
814 {
return(Y(YT(data)));
818 template <
class C>
inline
820 {
return(Y(ZX(data)));
823 template <
class C>
inline
825 {
return(Y(ZY(data)));
828 template <
class C>
inline
830 {
return(Y(ZZ(data)));
833 template <
class C>
inline
835 {
return(Y(ZT(data)));
839 template <
class C>
inline
841 {
return(Y(TX(data)));
844 template <
class C>
inline
846 {
return(Y(TY(data)));
849 template <
class C>
inline
851 {
return(Y(TZ(data)));
854 template <
class C>
inline
856 {
return(Y(TT(data)));
860 template <
class C>
inline
862 {
return(Z(XX(data)));
865 template <
class C>
inline
867 {
return(Z(XY(data)));
870 template <
class C>
inline
872 {
return(Z(XZ(data)));
875 template <
class C>
inline
877 {
return(Z(XT(data)));
881 template <
class C>
inline
883 {
return(Z(YX(data)));
886 template <
class C>
inline
888 {
return(Z(YY(data)));
891 template <
class C>
inline
893 {
return(Z(YZ(data)));
896 template <
class C>
inline
898 {
return(Z(YT(data)));
902 template <
class C>
inline
904 {
return(Z(ZX(data)));
907 template <
class C>
inline
909 {
return(Z(ZY(data)));
912 template <
class C>
inline
914 {
return(Z(ZZ(data)));
917 template <
class C>
inline
919 {
return(Z(ZT(data)));
923 template <
class C>
inline
925 {
return(Z(TX(data)));
928 template <
class C>
inline
930 {
return(Z(TY(data)));
933 template <
class C>
inline
935 {
return(Z(TZ(data)));
938 template <
class C>
inline
940 {
return(Z(TT(data)));
944 template <
class C>
inline
946 {
return(T(XX(data)));
949 template <
class C>
inline
951 {
return(T(XY(data)));
954 template <
class C>
inline
956 {
return(T(XZ(data)));
959 template <
class C>
inline
961 {
return(T(XT(data)));
965 template <
class C>
inline
967 {
return(T(YX(data)));
970 template <
class C>
inline
972 {
return(T(YY(data)));
975 template <
class C>
inline
977 {
return(T(YZ(data)));
980 template <
class C>
inline
982 {
return(T(YT(data)));
986 template <
class C>
inline
988 {
return(T(ZX(data)));
991 template <
class C>
inline
993 {
return(T(ZY(data)));
996 template <
class C>
inline
998 {
return(T(ZZ(data)));
1001 template <
class C>
inline
1003 {
return(T(ZT(data)));
1007 template <
class C>
inline
1009 {
return(T(TX(data)));
1012 template <
class C>
inline
1014 {
return(T(TY(data)));
1017 template <
class C>
inline
1019 {
return(T(TZ(data)));
1022 template <
class C>
inline
1024 {
return(T(TT(data)));
The template class for estimating gradients.
carto::VolumeRef< C > XYY(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dxdy2 = XYY(data)
carto::VolumeRef< C > XXZ(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dx2dz = XXZ(data)
carto::VolumeRef< C > YZX(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dydzdx = YZX(data)
carto::VolumeRef< C > TYY(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dtdy2 = TYY(data)
carto::VolumeRef< C > YZ(const carto::rc_ptr< carto::Volume< C > > &data)
d2(data)/dydz = YZ(data)
carto::VolumeRef< C > ZTZ(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dzdtdz = ZTZ(data)
carto::VolumeRef< C > T(const carto::rc_ptr< carto::Volume< C > > &data)
d(data)/dt = AimsGradientT(data)
carto::VolumeRef< C > XYX(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dxdydx = XYX(data)
carto::VolumeRef< C > TXX(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dtdx2 = TXX(data)
carto::VolumeRef< C > YZY(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dydzdy = YZY(data)
carto::VolumeRef< C > ZZX(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dz2dx = ZZX(data)
carto::VolumeRef< C > ZTY(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dzdtdy = ZTY(data)
carto::VolumeRef< C > YYX(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dy2dx = YYX(data)
carto::VolumeRef< C > YTZ(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dydtdz = YTZ(data)
carto::VolumeRef< C > TTT(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dt3 = TTT(data)
carto::VolumeRef< C > TTX(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dt2dx = TTX(data)
carto::VolumeRef< C > YZZ(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dydz2 = YZZ(data)
carto::VolumeRef< C > ZTX(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dzdtdx = ZTX(data)
carto::VolumeRef< C > ZYX(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dzdydx = ZYX(data)
carto::VolumeRef< C > TY(const carto::rc_ptr< carto::Volume< C > > &data)
d2(data)/dtdy = TY(data)
carto::VolumeRef< C > TZT(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dtdzdt = TZT(data)
AimsGradient(int type=AIMS_GRADIENT_CENTRAL)
One argument can be give to the constructor :
carto::VolumeRef< C > ZXX(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dzdx2 = ZXX(data)
carto::VolumeRef< C > YT(const carto::rc_ptr< carto::Volume< C > > &data)
d2(data)/dydt = YT(data)
carto::VolumeRef< C > YTX(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dydtdx = YTX(data)
carto::VolumeRef< C > TYT(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dtdydt = TYT(data)
carto::VolumeRef< C > TYZ(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dtdydz = TYZ(data)
carto::VolumeRef< C > TT(const carto::rc_ptr< carto::Volume< C > > &data)
d2(data)/dt2 = TT(data)
carto::VolumeRef< C > TTZ(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dt2dz = TTZ(data)
carto::VolumeRef< C > XYZ(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dxdydz = XYZ(data)
carto::VolumeRef< C > ZXZ(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dzdxdz = ZXZ(data)
carto::VolumeRef< C > XTZ(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dxdtdz = XTZ(data)
int _type
Type of the gradient.
carto::VolumeRef< C > XZY(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dxdzdy = XZY(data)
carto::VolumeRef< C > YTT(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dydt2 = YTT(data)
carto::VolumeRef< C > TXY(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dtdxdy = TXY(data)
carto::VolumeRef< C > TX(const carto::rc_ptr< carto::Volume< C > > &data)
d2(data)/dtdx = TX(data)
carto::VolumeRef< C > XXT(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dx2dt = XXT(data)
carto::VolumeRef< C > ZXT(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dzdxdt = ZXT(data)
carto::VolumeRef< C > ZYZ(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dzdydz = ZYZ(data)
carto::VolumeRef< C > XZT(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dxdzdt = XZT(data)
carto::VolumeRef< C > YXT(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dydxdt = YXT(data)
carto::VolumeRef< C > Z(const carto::rc_ptr< carto::Volume< C > > &data)
d(data)/dz = AimsGradientZ(data)
carto::VolumeRef< C > YYY(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dy3 = YYY(data)
carto::VolumeRef< C > TTY(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dt2dy = TTY(data)
carto::VolumeRef< C > YZT(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dydzdt = YZT(data)
carto::VolumeRef< C > X(const carto::rc_ptr< carto::Volume< C > > &data)
d(data)/dx = AimsGradientX(data)
carto::VolumeRef< C > ZX(const carto::rc_ptr< carto::Volume< C > > &data)
d2(data)/dzdx = ZX(data)
carto::VolumeRef< C > XZX(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dxdzdx = XZX(data)
carto::VolumeRef< C > YXX(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dydx2 = YXX(data)
virtual ~ AimsGradient()
Destructor does nothing.
carto::VolumeRef< C > YYT(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dy2dt = YYT(data)
carto::VolumeRef< C > ZXY(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dzdxdy = ZXY(data)
carto::VolumeRef< C > TXZ(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dtdxdz = TXZ(data)
carto::VolumeRef< C > XY(const carto::rc_ptr< carto::Volume< C > > &data)
d2(data)/dxdy = XY(data)
carto::VolumeRef< C > YXZ(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dydxdz = YXZ(data)
carto::VolumeRef< C > TZY(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dtdzdy = TZY(data)
carto::VolumeRef< C > ZZZ(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dz3 = ZZZ(data)
carto::VolumeRef< C > XTY(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dxdtdy = XTY(data)
carto::VolumeRef< C > YYZ(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dy2dz = YYZ(data)
carto::VolumeRef< C > ZT(const carto::rc_ptr< carto::Volume< C > > &data)
d2(data)/dzdt = ZT(data)
carto::VolumeRef< C > ZZT(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dz2dt = ZZT(data)
carto::VolumeRef< C > TZZ(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dtdz2 = TZZ(data)
carto::VolumeRef< C > Y(const carto::rc_ptr< carto::Volume< C > > &data)
d(data)/dy = AimsGradientY(data)
carto::VolumeRef< C > YX(const carto::rc_ptr< carto::Volume< C > > &data)
d2(data)/dydx = YX(data)
carto::VolumeRef< C > XXY(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dx2dy = XXY(data)
carto::VolumeRef< C > YTY(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dydtdy = YTY(data)
carto::VolumeRef< C > YXY(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dydxdy = YXY(data)
carto::VolumeRef< C > TXT(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dtdxdt = TXT(data)
carto::VolumeRef< C > YY(const carto::rc_ptr< carto::Volume< C > > &data)
d2(data)/dy2 = YY(data)
carto::VolumeRef< C > XYT(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dxdydt = XYT(data)
carto::VolumeRef< C > ZYT(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dzdydt = ZYT(data)
carto::VolumeRef< C > ZZY(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dz2dy = ZZY(data)
carto::VolumeRef< C > TYX(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dtdydx = TYX(data)
carto::VolumeRef< C > XX(const carto::rc_ptr< carto::Volume< C > > &data)
d2(data)/dx2 = XX(data)
carto::VolumeRef< C > XT(const carto::rc_ptr< carto::Volume< C > > &data)
d2(data)/dxdt = XT(data)
carto::VolumeRef< C > ZZ(const carto::rc_ptr< carto::Volume< C > > &data)
d2(data)/dz2 = ZZ(data)
carto::VolumeRef< C > ZY(const carto::rc_ptr< carto::Volume< C > > &data)
d2(data)/dzdy = ZY(data)
carto::VolumeRef< C > TZX(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dtdzdx = TZX(data)
carto::VolumeRef< C > TZ(const carto::rc_ptr< carto::Volume< C > > &data)
d2(data)/dtdz = TZ(data)
carto::VolumeRef< C > XXX(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dx3 = XXX(data)
carto::VolumeRef< C > ZYY(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dzdy2 = ZYY(data)
carto::VolumeRef< C > XTX(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dxdtdx = XTX(data)
carto::VolumeRef< C > XZZ(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dxdz2 = XZZ(data)
carto::VolumeRef< C > XTT(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dxdt2 = XTT(data)
carto::VolumeRef< C > ZTT(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dzdt2 = ZTT(data)
carto::VolumeRef< C > XZ(const carto::rc_ptr< carto::Volume< C > > &data)
d2(data)/dxdz = XZ(data)
void fillBorder(const T &value)
virtual void copyHeaderFrom(const PropertySet &other)
AimsGradientMethod
Gradient methods.
AimsFirstOrderGradient
First order.
AimsThirdOrderGradient
Third order.
AimsSecondOrderGradient
Second order.