46 #ifndef _INCLUDED_Field3D_FieldInterp_H_ 47 #define _INCLUDED_Field3D_FieldInterp_H_ 71 template <
class Data_T>
79 typedef boost::intrusive_ptr<FieldInterp>
Ptr;
135 template <
class Data_T>
143 typedef boost::intrusive_ptr<LinearFieldInterp>
Ptr;
152 return "LinearFieldInterp";
194 template <
class Data_T>
202 typedef boost::intrusive_ptr<CubicFieldInterp>
Ptr;
211 return "CubicFieldInterp";
252 template <
class Field_T>
260 typedef boost::intrusive_ptr<LinearGenericFieldInterp>
Ptr;
269 return "LinearGenericFieldInterp";
279 value_type
sample(
const Field_T &data,
const V3d &vsP)
const;
311 template <
class Data_T>
319 typedef boost::intrusive_ptr<LinearMACFieldInterp>
Ptr;
328 return "LinearMACFieldInterp";
343 const V3d &vsP)
const;
374 template <
class Field_T>
382 typedef boost::intrusive_ptr<CubicGenericFieldInterp>
Ptr;
391 return "CubicGenericFieldInterp";
401 value_type
sample(
const Field_T &data,
const V3d &vsP)
const;
433 template <
class Data_T>
441 typedef boost::intrusive_ptr<CubicMACFieldInterp>
Ptr;
450 return "CubicMACFieldInterp";
492 template <
class Data_T>
500 typedef boost::intrusive_ptr<ProceduralFieldLookup>
Ptr;
509 return "ProceduralFieldLookup";
545 template <
class Data_T>
551 f->
mapping()->worldToVoxel(wsP, vsP);
552 return interp.
sample(*f, vsP);
574 template <
class S,
class T>
575 FIELD3D_VEC3_T<T>
operator * (S s,
const FIELD3D_VEC3_T<T> vec);
585 template <
class Data_T>
587 const Data_T &f3,
const Data_T &f4,
596 template <
class Data_T>
598 const Data_T &f3,
const Data_T &f4,
605 template <
class Data_T>
607 const V3d &vsP)
const 612 FIELD3D_VEC3_T<double> p(vsP - FIELD3D_VEC3_T<double>(0.5));
615 V3i c1(static_cast<int>(
floor(p.x)),
616 static_cast<int>(
floor(p.y)),
617 static_cast<int>(
floor(p.z)));
621 FIELD3D_VEC3_T<double> f1(
static_cast<FIELD3D_VEC3_T<double>
>(c2) - p);
623 FIELD3D_VEC3_T<double> f2(
static_cast<FIELD3D_VEC3_T<double>
>(1.0) - f1);
628 c1.x = std::max(dataWindow.min.x, std::min(c1.x, dataWindow.max.x));
629 c2.x = std::max(dataWindow.min.x, std::min(c2.x, dataWindow.max.x));
630 c1.y = std::max(dataWindow.min.y, std::min(c1.y, dataWindow.max.y));
631 c2.y = std::max(dataWindow.min.y, std::min(c2.y, dataWindow.max.y));
632 c1.z = std::max(dataWindow.min.z, std::min(c1.z, dataWindow.max.z));
633 c2.z = std::max(dataWindow.min.z, std::min(c2.z, dataWindow.max.z));
636 return static_cast<Data_T
> 637 (f1.x * (f1.y * (f1.z * data.
value(c1.x, c1.y, c1.z) +
638 f2.z * data.
value(c1.x, c1.y, c2.z)) +
639 f2.y * (f1.z * data.
value(c1.x, c2.y, c1.z) +
640 f2.z * data.
value(c1.x, c2.y, c2.z))) +
641 f2.x * (f1.y * (f1.z * data.
value(c2.x, c1.y, c1.z) +
642 f2.z * data.
value(c2.x, c1.y, c2.z)) +
643 f2.y * (f1.z * data.
value(c2.x, c2.y, c1.z) +
644 f2.z * data.
value(c2.x, c2.y, c2.z))));
650 template <
class Data_T>
652 const V3d &vsP)
const 657 V3d clampedVsP(std::max(0.5, vsP.x),
658 std::max(0.5, vsP.y),
659 std::max(0.5, vsP.z));
660 FIELD3D_VEC3_T<double> p(clampedVsP - FIELD3D_VEC3_T<double>(0.5));
664 static_cast<int>(
floor(p.y)),
665 static_cast<int>(
floor(p.z)));
668 FIELD3D_VEC3_T<double> t(p -
static_cast<FIELD3D_VEC3_T<double>
>(c));
674 im = std::max(dataWindow.min.x, std::min(c.x, dataWindow.max.x));
675 jm = std::max(dataWindow.min.y, std::min(c.y, dataWindow.max.y));
676 km = std::max(dataWindow.min.z, std::min(c.z, dataWindow.max.z));
677 int im_1, jm_1, km_1;
678 im_1 = std::max(dataWindow.min.x, std::min(im - 1, dataWindow.max.x));
679 jm_1 = std::max(dataWindow.min.y, std::min(jm - 1, dataWindow.max.y));
680 km_1 = std::max(dataWindow.min.z, std::min(km - 1, dataWindow.max.z));
682 im1 = std::max(dataWindow.min.x, std::min(im + 1, dataWindow.max.x));
683 jm1 = std::max(dataWindow.min.y, std::min(jm + 1, dataWindow.max.y));
684 km1 = std::max(dataWindow.min.z, std::min(km + 1, dataWindow.max.z));
686 im2 = std::max(dataWindow.min.x, std::min(im + 2, dataWindow.max.x));
687 jm2 = std::max(dataWindow.min.y, std::min(jm + 2, dataWindow.max.y));
688 km2 = std::max(dataWindow.min.z, std::min(km + 2, dataWindow.max.z));
692 data.
value(im_1, jm_1, km),
693 data.
value(im_1, jm_1, km1),
694 data.
value(im_1, jm_1, km2), t.z);
696 data.
value(im_1, jm, km),
697 data.
value(im_1, jm, km1),
698 data.
value(im_1, jm, km2), t.z);
700 data.
value(im_1, jm1, km),
701 data.
value(im_1, jm1, km1),
702 data.
value(im_1, jm1, km2), t.z);
704 data.
value(im_1, jm2, km),
705 data.
value(im_1, jm2, km1),
706 data.
value(im_1, jm2, km2), t.z);
709 data.
value(im, jm_1, km),
710 data.
value(im, jm_1, km1),
711 data.
value(im, jm_1, km2), t.z);
713 data.
value(im, jm, km),
714 data.
value(im, jm, km1),
715 data.
value(im, jm, km2), t.z);
717 data.
value(im, jm1, km),
718 data.
value(im, jm1, km1),
719 data.
value(im, jm1, km2), t.z);
721 data.
value(im, jm2, km),
722 data.
value(im, jm2, km1),
723 data.
value(im, jm2, km2), t.z);
726 data.
value(im1, jm_1, km),
727 data.
value(im1, jm_1, km1),
728 data.
value(im1, jm_1, km2), t.z);
730 data.
value(im1, jm, km),
731 data.
value(im1, jm, km1),
732 data.
value(im1, jm, km2), t.z);
734 data.
value(im1, jm1, km),
735 data.
value(im1, jm1, km1),
736 data.
value(im1, jm1, km2), t.z);
738 data.
value(im1, jm2, km),
739 data.
value(im1, jm2, km1),
740 data.
value(im1, jm2, km2), t.z);
743 data.
value(im2, jm_1, km),
744 data.
value(im2, jm_1, km1),
745 data.
value(im2, jm_1, km2), t.z);
747 data.
value(im2, jm, km),
748 data.
value(im2, jm, km1),
749 data.
value(im2, jm, km2), t.z);
751 data.
value(im2, jm1, km),
752 data.
value(im2, jm1, km1),
753 data.
value(im2, jm1, km2), t.z);
755 data.
value(im2, jm2, km),
756 data.
value(im2, jm2, km1),
757 data.
value(im2, jm2, km2), t.z);
771 template <
class Field_T>
772 typename Field_T::value_type
774 const V3d &vsP)
const 776 typedef typename Field_T::value_type Data_T;
781 FIELD3D_VEC3_T<double> p(vsP - FIELD3D_VEC3_T<double>(0.5));
784 V3i c1(static_cast<int>(
floor(p.x)),
785 static_cast<int>(
floor(p.y)),
786 static_cast<int>(
floor(p.z)));
790 FIELD3D_VEC3_T<double> f1(
static_cast<FIELD3D_VEC3_T<double>
>(c2) - p);
792 FIELD3D_VEC3_T<double> f2(
static_cast<FIELD3D_VEC3_T<double>
>(1.0) - f1);
794 const Box3i &dataWindow = data.dataWindow();
797 c1.x = std::min(dataWindow.max.x, std::max(dataWindow.min.x, c1.x));
798 c1.y = std::min(dataWindow.max.y, std::max(dataWindow.min.y, c1.y));
799 c1.z = std::min(dataWindow.max.z, std::max(dataWindow.min.z, c1.z));
800 c2.x = std::min(dataWindow.max.x, std::max(dataWindow.min.x, c2.x));
801 c2.y = std::min(dataWindow.max.y, std::max(dataWindow.min.y, c2.y));
802 c2.z = std::min(dataWindow.max.z, std::max(dataWindow.min.z, c2.z));
804 return static_cast<Data_T
> 805 (f1.x * (f1.y * (f1.z * data.fastValue(c1.x, c1.y, c1.z) +
806 f2.z * data.fastValue(c1.x, c1.y, c2.z)) +
807 f2.y * (f1.z * data.fastValue(c1.x, c2.y, c1.z) +
808 f2.z * data.fastValue(c1.x, c2.y, c2.z))) +
809 f2.x * (f1.y * (f1.z * data.fastValue(c2.x, c1.y, c1.z) +
810 f2.z * data.fastValue(c2.x, c1.y, c2.z)) +
811 f2.y * (f1.z * data.fastValue(c2.x, c2.y, c1.z) +
812 f2.z * data.fastValue(c2.x, c2.y, c2.z))));
817 template <
class Data_T>
819 const V3d &vsP)
const 829 FIELD3D_VEC3_T<double> p(vsP.x , vsP.y - 0.5, vsP.z - 0.5);
834 V3i c1(static_cast<int>(
floor(p.x)),
835 static_cast<int>(
floor(p.y)),
836 static_cast<int>(
floor(p.z)));
842 FIELD3D_VEC3_T<double> f1(
static_cast<FIELD3D_VEC3_T<double>
>(c2) - p);
844 FIELD3D_VEC3_T<double> f2(
static_cast<FIELD3D_VEC3_T<double>
>(1.0) - f1);
847 c1.x = std::min(dataWindow.max.x + 1, std::max(dataWindow.min.x, c1.x));
848 c1.y = std::min(dataWindow.max.y, std::max(dataWindow.min.y, c1.y));
849 c1.z = std::min(dataWindow.max.z, std::max(dataWindow.min.z, c1.z));
850 c2.x = std::min(dataWindow.max.x + 1, std::max(dataWindow.min.x, c2.x));
851 c2.y = std::min(dataWindow.max.y, std::max(dataWindow.min.y, c2.y));
852 c2.z = std::min(dataWindow.max.z, std::max(dataWindow.min.z, c2.z));
854 ret.x = (f1.x * (f1.y * (f1.z * data.
u(c1.x, c1.y, c1.z) +
855 f2.z * data.
u(c1.x, c1.y, c2.z)) +
856 f2.y * (f1.z * data.
u(c1.x, c2.y, c1.z) +
857 f2.z * data.
u(c1.x, c2.y, c2.z))) +
858 f2.x * (f1.y * (f1.z * data.
u(c2.x, c1.y, c1.z) +
859 f2.z * data.
u(c2.x, c1.y, c2.z)) +
860 f2.y * (f1.z * data.
u(c2.x, c2.y, c1.z) +
861 f2.z * data.
u(c2.x, c2.y, c2.z))));
865 p.setValue(vsP.x - 0.5, vsP.y , vsP.z - 0.5);
868 c1.x =
static_cast<int>(
floor(p.x ));
869 c1.y =
static_cast<int>(
floor(p.y ));
870 c1.z =
static_cast<int>(
floor(p.z ));
878 f1.setValue(
static_cast<FIELD3D_VEC3_T<double>
>(c2) - p);
880 f2.setValue(
static_cast<FIELD3D_VEC3_T<double>
>(1.0) - f1);
883 c1.x = std::min(dataWindow.max.x, std::max(dataWindow.min.x, c1.x));
884 c1.y = std::min(dataWindow.max.y + 1, std::max(dataWindow.min.y, c1.y));
885 c1.z = std::min(dataWindow.max.z, std::max(dataWindow.min.z, c1.z));
886 c2.x = std::min(dataWindow.max.x, std::max(dataWindow.min.x, c2.x));
887 c2.y = std::min(dataWindow.max.y + 1, std::max(dataWindow.min.y, c2.y));
888 c2.z = std::min(dataWindow.max.z, std::max(dataWindow.min.z, c2.z));
890 ret.y = (f1.x * (f1.y * (f1.z * data.
v(c1.x, c1.y, c1.z) +
891 f2.z * data.
v(c1.x, c1.y, c2.z)) +
892 f2.y * (f1.z * data.
v(c1.x, c2.y, c1.z) +
893 f2.z * data.
v(c1.x, c2.y, c2.z))) +
894 f2.x * (f1.y * (f1.z * data.
v(c2.x, c1.y, c1.z) +
895 f2.z * data.
v(c2.x, c1.y, c2.z)) +
896 f2.y * (f1.z * data.
v(c2.x, c2.y, c1.z) +
897 f2.z * data.
v(c2.x, c2.y, c2.z))));
901 p.setValue(vsP.x - 0.5 , vsP.y - 0.5, vsP.z);
904 c1.x =
static_cast<int>(
floor(p.x ));
905 c1.y =
static_cast<int>(
floor(p.y ));
906 c1.z =
static_cast<int>(
floor(p.z ));
914 f1.setValue(
static_cast<FIELD3D_VEC3_T<double>
>(c2) - p);
916 f2.setValue(
static_cast<FIELD3D_VEC3_T<double>
>(1.0) - f1);
919 c1.x = std::min(dataWindow.max.x, std::max(dataWindow.min.x, c1.x));
920 c1.y = std::min(dataWindow.max.y, std::max(dataWindow.min.y, c1.y));
921 c1.z = std::min(dataWindow.max.z + 1, std::max(dataWindow.min.z, c1.z));
922 c2.x = std::min(dataWindow.max.x, std::max(dataWindow.min.x, c2.x));
923 c2.y = std::min(dataWindow.max.y, std::max(dataWindow.min.y, c2.y));
924 c2.z = std::min(dataWindow.max.z + 1, std::max(dataWindow.min.z, c2.z));
926 ret.z = (f1.x * (f1.y * (f1.z * data.
w(c1.x, c1.y, c1.z) +
927 f2.z * data.
w(c1.x, c1.y, c2.z)) +
928 f2.y * (f1.z * data.
w(c1.x, c2.y, c1.z) +
929 f2.z * data.
w(c1.x, c2.y, c2.z))) +
930 f2.x * (f1.y * (f1.z * data.
w(c2.x, c1.y, c1.z) +
931 f2.z * data.
w(c2.x, c1.y, c2.z)) +
932 f2.y * (f1.z * data.
w(c2.x, c2.y, c1.z) +
933 f2.z * data.
w(c2.x, c2.y, c2.z))));
940 template <
class Data_T>
943 const V3d &vsP)
const 952 FIELD3D_VEC3_T<double> p;
954 FIELD3D_VEC3_T<double> f1;
955 FIELD3D_VEC3_T<double> f2;
961 p.setValue<>(vsP.x, vsP.y-0.5, vsP.z-0.5);
964 c1.x =
static_cast<int>(
floor(p.x));
965 c1.y =
static_cast<int>(
floor(p.y));
966 c1.z =
static_cast<int>(
floor(p.z));
974 f1.setValue(
static_cast<FIELD3D_VEC3_T<double>
>(c2) - p);
976 f2.setValue(
static_cast<FIELD3D_VEC3_T<double>
>(1.0) - f1);
979 c1.x = std::min(dataWindow.max.x + 1, std::max(dataWindow.min.x, c1.x));
980 c1.y = std::min(dataWindow.max.y, std::max(dataWindow.min.y, c1.y));
981 c1.z = std::min(dataWindow.max.z, std::max(dataWindow.min.z, c1.z));
982 c2.x = std::min(dataWindow.max.x + 1, std::max(dataWindow.min.x, c2.x));
983 c2.y = std::min(dataWindow.max.y, std::max(dataWindow.min.y, c2.y));
984 c2.z = std::min(dataWindow.max.z, std::max(dataWindow.min.z, c2.z));
986 ret = (f1.x * (f1.y * (f1.z * data.
u(c1.x, c1.y, c1.z) +
987 f2.z * data.
u(c1.x, c1.y, c2.z)) +
988 f2.y * (f1.z * data.
u(c1.x, c2.y, c1.z) +
989 f2.z * data.
u(c1.x, c2.y, c2.z))) +
990 f2.x * (f1.y * (f1.z * data.
u(c2.x, c1.y, c1.z) +
991 f2.z * data.
u(c2.x, c1.y, c2.z)) +
992 f2.y * (f1.z * data.
u(c2.x, c2.y, c1.z) +
993 f2.z * data.
u(c2.x, c2.y, c2.z))));
999 p.setValue(vsP.x-0.5, vsP.y, vsP.z-0.5);
1002 c1.x =
static_cast<int>(
floor(p.x ));
1003 c1.y =
static_cast<int>(
floor(p.y ));
1004 c1.z =
static_cast<int>(
floor(p.z ));
1012 f1.setValue(
static_cast<FIELD3D_VEC3_T<double>
>(c2) - p);
1014 f2.setValue(
static_cast<FIELD3D_VEC3_T<double>
>(1.0) - f1);
1017 c1.x = std::min(dataWindow.max.x, std::max(dataWindow.min.x, c1.x));
1018 c1.y = std::min(dataWindow.max.y + 1, std::max(dataWindow.min.y, c1.y));
1019 c1.z = std::min(dataWindow.max.z, std::max(dataWindow.min.z, c1.z));
1020 c2.x = std::min(dataWindow.max.x, std::max(dataWindow.min.x, c2.x));
1021 c2.y = std::min(dataWindow.max.y + 1, std::max(dataWindow.min.y, c2.y));
1022 c2.z = std::min(dataWindow.max.z, std::max(dataWindow.min.z, c2.z));
1024 ret = (f1.x * (f1.y * (f1.z * data.
v(c1.x, c1.y, c1.z) +
1025 f2.z * data.
v(c1.x, c1.y, c2.z)) +
1026 f2.y * (f1.z * data.
v(c1.x, c2.y, c1.z) +
1027 f2.z * data.
v(c1.x, c2.y, c2.z))) +
1028 f2.x * (f1.y * (f1.z * data.
v(c2.x, c1.y, c1.z) +
1029 f2.z * data.
v(c2.x, c1.y, c2.z)) +
1030 f2.y * (f1.z * data.
v(c2.x, c2.y, c1.z) +
1031 f2.z * data.
v(c2.x, c2.y, c2.z))));
1037 p.setValue(vsP.x-0.5, vsP.y-0.5, vsP.z);
1040 c1.x =
static_cast<int>(
floor(p.x ));
1041 c1.y =
static_cast<int>(
floor(p.y ));
1042 c1.z =
static_cast<int>(
floor(p.z ));
1050 f1.setValue(
static_cast<FIELD3D_VEC3_T<double>
>(c2) - p);
1052 f2.setValue(
static_cast<FIELD3D_VEC3_T<double>
>(1.0) - f1);
1055 c1.x = std::min(dataWindow.max.x, std::max(dataWindow.min.x, c1.x));
1056 c1.y = std::min(dataWindow.max.y, std::max(dataWindow.min.y, c1.y));
1057 c1.z = std::min(dataWindow.max.z + 1, std::max(dataWindow.min.z, c1.z));
1058 c2.x = std::min(dataWindow.max.x, std::max(dataWindow.min.x, c2.x));
1059 c2.y = std::min(dataWindow.max.y, std::max(dataWindow.min.y, c2.y));
1060 c2.z = std::min(dataWindow.max.z + 1, std::max(dataWindow.min.z, c2.z));
1062 ret = (f1.x * (f1.y * (f1.z * data.
w(c1.x, c1.y, c1.z) +
1063 f2.z * data.
w(c1.x, c1.y, c2.z)) +
1064 f2.y * (f1.z * data.
w(c1.x, c2.y, c1.z) +
1065 f2.z * data.
w(c1.x, c2.y, c2.z))) +
1066 f2.x * (f1.y * (f1.z * data.
w(c2.x, c1.y, c1.z) +
1067 f2.z * data.
w(c2.x, c1.y, c2.z)) +
1068 f2.y * (f1.z * data.
w(c2.x, c2.y, c1.z) +
1069 f2.z * data.
w(c2.x, c2.y, c2.z))));
1081 template <
class Field_T>
1082 typename Field_T::value_type
1084 const V3d &vsP)
const 1086 typedef typename Field_T::value_type Data_T;
1091 V3d clampedVsP(std::max(0.5, vsP.x),
1092 std::max(0.5, vsP.y),
1093 std::max(0.5, vsP.z));
1094 FIELD3D_VEC3_T<double> p(clampedVsP - FIELD3D_VEC3_T<double>(0.5));
1096 const Box3i &dataWindow = data.dataWindow();
1099 V3i c(static_cast<int>(
floor(p.x)),
1100 static_cast<int>(
floor(p.y)),
1101 static_cast<int>(
floor(p.z)));
1104 FIELD3D_VEC3_T<double> t(p -
static_cast<FIELD3D_VEC3_T<double>
>(c));
1108 im = std::max(dataWindow.min.x, std::min(c.x, dataWindow.max.x));
1109 jm = std::max(dataWindow.min.y, std::min(c.y, dataWindow.max.y));
1110 km = std::max(dataWindow.min.z, std::min(c.z, dataWindow.max.z));
1111 int im_1, jm_1, km_1;
1112 im_1 = std::max(dataWindow.min.x, std::min(im - 1, dataWindow.max.x));
1113 jm_1 = std::max(dataWindow.min.y, std::min(jm - 1, dataWindow.max.y));
1114 km_1 = std::max(dataWindow.min.z, std::min(km - 1, dataWindow.max.z));
1116 im1 = std::max(dataWindow.min.x, std::min(im + 1, dataWindow.max.x));
1117 jm1 = std::max(dataWindow.min.y, std::min(jm + 1, dataWindow.max.y));
1118 km1 = std::max(dataWindow.min.z, std::min(km + 1, dataWindow.max.z));
1120 im2 = std::max(dataWindow.min.x, std::min(im + 2, dataWindow.max.x));
1121 jm2 = std::max(dataWindow.min.y, std::min(jm + 2, dataWindow.max.y));
1122 km2 = std::max(dataWindow.min.z, std::min(km + 2, dataWindow.max.z));
1125 data.fastValue(im_1, jm_1, km),
1126 data.fastValue(im_1, jm_1, km1),
1127 data.fastValue(im_1, jm_1, km2), t.z);
1129 data.fastValue(im_1, jm, km),
1130 data.fastValue(im_1, jm, km1),
1131 data.fastValue(im_1, jm, km2), t.z);
1133 data.fastValue(im_1, jm1, km),
1134 data.fastValue(im_1, jm1, km1),
1135 data.fastValue(im_1, jm1, km2), t.z);
1137 data.fastValue(im_1, jm2, km),
1138 data.fastValue(im_1, jm2, km1),
1139 data.fastValue(im_1, jm2, km2), t.z);
1142 data.fastValue(im, jm_1, km),
1143 data.fastValue(im, jm_1, km1),
1144 data.fastValue(im, jm_1, km2), t.z);
1146 data.fastValue(im, jm, km),
1147 data.fastValue(im, jm, km1),
1148 data.fastValue(im, jm, km2), t.z);
1150 data.fastValue(im, jm1, km),
1151 data.fastValue(im, jm1, km1),
1152 data.fastValue(im, jm1, km2), t.z);
1154 data.fastValue(im, jm2, km),
1155 data.fastValue(im, jm2, km1),
1156 data.fastValue(im, jm2, km2), t.z);
1159 data.fastValue(im1, jm_1, km),
1160 data.fastValue(im1, jm_1, km1),
1161 data.fastValue(im1, jm_1, km2), t.z);
1163 data.fastValue(im1, jm, km),
1164 data.fastValue(im1, jm, km1),
1165 data.fastValue(im1, jm, km2), t.z);
1167 data.fastValue(im1, jm1, km),
1168 data.fastValue(im1, jm1, km1),
1169 data.fastValue(im1, jm1, km2), t.z);
1171 data.fastValue(im1, jm2, km),
1172 data.fastValue(im1, jm2, km1),
1173 data.fastValue(im1, jm2, km2), t.z);
1176 data.fastValue(im2, jm_1, km),
1177 data.fastValue(im2, jm_1, km1),
1178 data.fastValue(im2, jm_1, km2), t.z);
1180 data.fastValue(im2, jm, km),
1181 data.fastValue(im2, jm, km1),
1182 data.fastValue(im2, jm, km2), t.z);
1184 data.fastValue(im2, jm1, km),
1185 data.fastValue(im2, jm1, km1),
1186 data.fastValue(im2, jm1, km2), t.z);
1188 data.fastValue(im2, jm2, km),
1189 data.fastValue(im2, jm2, km1),
1190 data.fastValue(im2, jm2, km2), t.z);
1204 template <
class Data_T>
1206 const V3d &vsP)
const 1208 typedef typename Data_T::BaseType T;
1220 V3d clampedVsP(std::max(0.5, vsP.x),
1221 std::max(0.5, vsP.y),
1222 std::max(0.5, vsP.z));
1223 FIELD3D_VEC3_T<double> p(vsP.x,
1225 clampedVsP.z - 0.5);
1228 V3i c(static_cast<int>(
floor(p.x)),
1229 static_cast<int>(
floor(p.y)),
1230 static_cast<int>(
floor(p.z)));
1232 FIELD3D_VEC3_T<double> t(p -
static_cast<FIELD3D_VEC3_T<double>
>(c));
1237 im = std::max(dataWindow.min.x, std::min(c.x, dataWindow.max.x + 1));
1238 jm = std::max(dataWindow.min.y, std::min(c.y, dataWindow.max.y));
1239 km = std::max(dataWindow.min.z, std::min(c.z, dataWindow.max.z));
1240 int im_1, jm_1, km_1;
1241 im_1 = std::max(dataWindow.min.x, std::min(im - 1, dataWindow.max.x + 1));
1242 jm_1 = std::max(dataWindow.min.y, std::min(jm - 1, dataWindow.max.y));
1243 km_1 = std::max(dataWindow.min.z, std::min(km - 1, dataWindow.max.z));
1245 im1 = std::max(dataWindow.min.x, std::min(im + 1, dataWindow.max.x + 1));
1246 jm1 = std::max(dataWindow.min.y, std::min(jm + 1, dataWindow.max.y));
1247 km1 = std::max(dataWindow.min.z, std::min(km + 1, dataWindow.max.z));
1249 im2 = std::max(dataWindow.min.x, std::min(im + 2, dataWindow.max.x + 1));
1250 jm2 = std::max(dataWindow.min.y, std::min(jm + 2, dataWindow.max.y));
1251 km2 = std::max(dataWindow.min.z, std::min(km + 2, dataWindow.max.z));
1254 data.
u(im_1, jm_1, km),
1255 data.
u(im_1, jm_1, km1),
1256 data.
u(im_1, jm_1, km2), t.z);
1258 data.
u(im_1, jm, km),
1259 data.
u(im_1, jm, km1),
1260 data.
u(im_1, jm, km2), t.z);
1262 data.
u(im_1, jm1, km),
1263 data.
u(im_1, jm1, km1),
1264 data.
u(im_1, jm1, km2), t.z);
1266 data.
u(im_1, jm2, km),
1267 data.
u(im_1, jm2, km1),
1268 data.
u(im_1, jm2, km2), t.z);
1271 data.
u(im, jm_1, km),
1272 data.
u(im, jm_1, km1),
1273 data.
u(im, jm_1, km2), t.z);
1276 data.
u(im, jm, km1),
1277 data.
u(im, jm, km2), t.z);
1279 data.
u(im, jm1, km),
1280 data.
u(im, jm1, km1),
1281 data.
u(im, jm1, km2), t.z);
1283 data.
u(im, jm2, km),
1284 data.
u(im, jm2, km1),
1285 data.
u(im, jm2, km2), t.z);
1288 data.
u(im1, jm_1, km),
1289 data.
u(im1, jm_1, km1),
1290 data.
u(im1, jm_1, km2), t.z);
1292 data.
u(im1, jm, km),
1293 data.
u(im1, jm, km1),
1294 data.
u(im1, jm, km2), t.z);
1296 data.
u(im1, jm1, km),
1297 data.
u(im1, jm1, km1),
1298 data.
u(im1, jm1, km2), t.z);
1300 data.
u(im1, jm2, km),
1301 data.
u(im1, jm2, km1),
1302 data.
u(im1, jm2, km2), t.z);
1305 data.
u(im2, jm_1, km),
1306 data.
u(im2, jm_1, km1),
1307 data.
u(im2, jm_1, km2), t.z);
1309 data.
u(im2, jm, km),
1310 data.
u(im2, jm, km1),
1311 data.
u(im2, jm, km2), t.z);
1313 data.
u(im2, jm1, km),
1314 data.
u(im2, jm1, km1),
1315 data.
u(im2, jm1, km2), t.z);
1317 data.
u(im2, jm2, km),
1318 data.
u(im2, jm2, km1),
1319 data.
u(im2, jm2, km2), t.z);
1332 p.setValue(clampedVsP.x - 0.5, vsP.y , clampedVsP.z - 0.5);
1335 c.x =
static_cast<int>(
floor(p.x));
1336 c.y =
static_cast<int>(
floor(p.y));
1337 c.z =
static_cast<int>(
floor(p.z));
1339 t.setValue(p -
static_cast<FIELD3D_VEC3_T<double>
>(c));
1343 im = std::max(dataWindow.min.x, std::min(c.x, dataWindow.max.x));
1344 jm = std::max(dataWindow.min.y, std::min(c.y, dataWindow.max.y + 1));
1345 km = std::max(dataWindow.min.z, std::min(c.z, dataWindow.max.z));
1346 int im_1, jm_1, km_1;
1347 im_1 = std::max(dataWindow.min.x, std::min(im - 1, dataWindow.max.x));
1348 jm_1 = std::max(dataWindow.min.y, std::min(jm - 1, dataWindow.max.y + 1));
1349 km_1 = std::max(dataWindow.min.z, std::min(km - 1, dataWindow.max.z));
1351 im1 = std::max(dataWindow.min.x, std::min(im + 1, dataWindow.max.x));
1352 jm1 = std::max(dataWindow.min.y, std::min(jm + 1, dataWindow.max.y + 1));
1353 km1 = std::max(dataWindow.min.z, std::min(km + 1, dataWindow.max.z));
1355 im2 = std::max(dataWindow.min.x, std::min(im + 2, dataWindow.max.x));
1356 jm2 = std::max(dataWindow.min.y, std::min(jm + 2, dataWindow.max.y + 1));
1357 km2 = std::max(dataWindow.min.z, std::min(km + 2, dataWindow.max.z));
1360 data.
v(im_1, jm_1, km),
1361 data.
v(im_1, jm_1, km1),
1362 data.
v(im_1, jm_1, km2), t.z);
1364 data.
v(im_1, jm, km),
1365 data.
v(im_1, jm, km1),
1366 data.
v(im_1, jm, km2), t.z);
1368 data.
v(im_1, jm1, km),
1369 data.
v(im_1, jm1, km1),
1370 data.
v(im_1, jm1, km2), t.z);
1372 data.
v(im_1, jm2, km),
1373 data.
v(im_1, jm2, km1),
1374 data.
v(im_1, jm2, km2), t.z);
1377 data.
v(im, jm_1, km),
1378 data.
v(im, jm_1, km1),
1379 data.
v(im, jm_1, km2), t.z);
1382 data.
v(im, jm, km1),
1383 data.
v(im, jm, km2), t.z);
1385 data.
v(im, jm1, km),
1386 data.
v(im, jm1, km1),
1387 data.
v(im, jm1, km2), t.z);
1389 data.
v(im, jm2, km),
1390 data.
v(im, jm2, km1),
1391 data.
v(im, jm2, km2), t.z);
1394 data.
v(im1, jm_1, km),
1395 data.
v(im1, jm_1, km1),
1396 data.
v(im1, jm_1, km2), t.z);
1398 data.
v(im1, jm, km),
1399 data.
v(im1, jm, km1),
1400 data.
v(im1, jm, km2), t.z);
1402 data.
v(im1, jm1, km),
1403 data.
v(im1, jm1, km1),
1404 data.
v(im1, jm1, km2), t.z);
1406 data.
v(im1, jm2, km),
1407 data.
v(im1, jm2, km1),
1408 data.
v(im1, jm2, km2), t.z);
1411 data.
v(im2, jm_1, km),
1412 data.
v(im2, jm_1, km1),
1413 data.
v(im2, jm_1, km2), t.z);
1415 data.
v(im2, jm, km),
1416 data.
v(im2, jm, km1),
1417 data.
v(im2, jm, km2), t.z);
1419 data.
v(im2, jm1, km),
1420 data.
v(im2, jm1, km1),
1421 data.
v(im2, jm1, km2), t.z);
1423 data.
v(im2, jm2, km),
1424 data.
v(im2, jm2, km1),
1425 data.
v(im2, jm2, km2), t.z);
1437 p.setValue(clampedVsP.x - 0.5 , clampedVsP.y - 0.5, vsP.z);
1440 c.x =
static_cast<int>(
floor(p.x));
1441 c.y =
static_cast<int>(
floor(p.y));
1442 c.z =
static_cast<int>(
floor(p.z));
1444 t.setValue(p -
static_cast<FIELD3D_VEC3_T<double>
>(c));
1448 im = std::max(dataWindow.min.x, std::min(c.x, dataWindow.max.x));
1449 jm = std::max(dataWindow.min.y, std::min(c.y, dataWindow.max.y));
1450 km = std::max(dataWindow.min.z, std::min(c.z, dataWindow.max.z + 1));
1451 int im_1, jm_1, km_1;
1452 im_1 = std::max(dataWindow.min.x, std::min(im - 1, dataWindow.max.x));
1453 jm_1 = std::max(dataWindow.min.y, std::min(jm - 1, dataWindow.max.y));
1454 km_1 = std::max(dataWindow.min.z, std::min(km - 1, dataWindow.max.z + 1));
1456 im1 = std::max(dataWindow.min.x, std::min(im + 1, dataWindow.max.x));
1457 jm1 = std::max(dataWindow.min.y, std::min(jm + 1, dataWindow.max.y));
1458 km1 = std::max(dataWindow.min.z, std::min(km + 1, dataWindow.max.z + 1));
1460 im2 = std::max(dataWindow.min.x, std::min(im + 2, dataWindow.max.x));
1461 jm2 = std::max(dataWindow.min.y, std::min(jm + 2, dataWindow.max.y));
1462 km2 = std::max(dataWindow.min.z, std::min(km + 2, dataWindow.max.z + 1));
1465 data.
w(im_1, jm_1, km),
1466 data.
w(im_1, jm_1, km1),
1467 data.
w(im_1, jm_1, km2), t.z);
1469 data.
w(im_1, jm, km),
1470 data.
w(im_1, jm, km1),
1471 data.
w(im_1, jm, km2), t.z);
1473 data.
w(im_1, jm1, km),
1474 data.
w(im_1, jm1, km1),
1475 data.
w(im_1, jm1, km2), t.z);
1477 data.
w(im_1, jm2, km),
1478 data.
w(im_1, jm2, km1),
1479 data.
w(im_1, jm2, km2), t.z);
1482 data.
w(im, jm_1, km),
1483 data.
w(im, jm_1, km1),
1484 data.
w(im, jm_1, km2), t.z);
1487 data.
w(im, jm, km1),
1488 data.
w(im, jm, km2), t.z);
1490 data.
w(im, jm1, km),
1491 data.
w(im, jm1, km1),
1492 data.
w(im, jm1, km2), t.z);
1494 data.
w(im, jm2, km),
1495 data.
w(im, jm2, km1),
1496 data.
w(im, jm2, km2), t.z);
1499 data.
w(im1, jm_1, km),
1500 data.
w(im1, jm_1, km1),
1501 data.
w(im1, jm_1, km2), t.z);
1503 data.
w(im1, jm, km),
1504 data.
w(im1, jm, km1),
1505 data.
w(im1, jm, km2), t.z);
1507 data.
w(im1, jm1, km),
1508 data.
w(im1, jm1, km1),
1509 data.
w(im1, jm1, km2), t.z);
1511 data.
w(im1, jm2, km),
1512 data.
w(im1, jm2, km1),
1513 data.
w(im1, jm2, km2), t.z);
1516 data.
w(im2, jm_1, km),
1517 data.
w(im2, jm_1, km1),
1518 data.
w(im2, jm_1, km2), t.z);
1520 data.
w(im2, jm, km),
1521 data.
w(im2, jm, km1),
1522 data.
w(im2, jm, km2), t.z);
1524 data.
w(im2, jm1, km),
1525 data.
w(im2, jm1, km1),
1526 data.
w(im2, jm1, km2), t.z);
1528 data.
w(im2, jm2, km),
1529 data.
w(im2, jm2, km1),
1530 data.
w(im2, jm2, km2), t.z);
1545 template <
class Data_T>
1548 const V3d &vsP)
const 1551 V3d lsP = vsP * voxelScale;
1557 template <
class S,
class T>
1560 return FIELD3D_VEC3_T<T>(vec.x * s, vec.y * s, vec.z * s);
1569 T d_k = T(.5) * (f3 - f1);
1570 T d_k1 = T(.5) * (f4 - f2);
1571 T delta_k = f3 - f2;
1573 if (delta_k == static_cast<T>(0)) {
1574 d_k =
static_cast<T
>(0);
1575 d_k1 =
static_cast<T
>(0);
1580 T a2 = (T(3) * delta_k) - (T(2) * d_k) - d_k1;
1581 T a3 = d_k + d_k1 - (T(2) * delta_k);
1587 return a3 * t3 + a2 * t2 + a1 * t1 + a0;
1596 template <
class Data_T>
1598 const Data_T &f3,
const Data_T &f4,
1601 typedef typename Data_T::BaseType T;
1603 Data_T d_k = T(.5) * (f3 - f1);
1604 Data_T d_k1 = T(.5) * (f4 - f2);
1605 Data_T delta_k = f3 - f2;
1607 for (
int i = 0; i < 3; i++) {
1608 if (delta_k[i] == static_cast<T>(0)) {
1609 d_k[i] =
static_cast<T
>(0);
1610 d_k1[i]=
static_cast<T
>(0);
1616 Data_T a2 = (delta_k * T(3)) - (d_k * T(2)) - d_k1;
1617 Data_T a3 = d_k + d_k1 - (delta_k * T(2));
1623 return a3 * t3 + a2 * t2 + a1 * t1 + a0;
1633 const V3h &f3,
const V3h &f4,
double t)
1643 const V3f &f3,
const V3f &f4,
double t)
1653 const V3d &f3,
const V3d &f4,
double t)
1664 #endif // Include guard #define FIELD3D_NAMESPACE_HEADER_CLOSE
value_type sample(const Field_T &data, const V3d &vsP) const
boost::intrusive_ptr< LinearMACFieldInterp > Ptr
FieldInterp< Data_T > base
Convenience typedef for referring to base class.
Contains the MACField class.
Contains the DenseField class.
ProceduralFieldLookup class_type
static const char * staticClassType()
V3f monotonicCubicInterpolant< V3f >(const V3f &f1, const V3f &f2, const V3f &f3, const V3f &f4, double t)
DEFINE_FIELD_RTTI_CONCRETE_CLASS
This subclass of Field implements a standard MAC field. Refer to your favorite fluid simulations book...
const real_t & v(int i, int j, int k) const
Read access to value on v-facing wall.
static const char * staticClassName()
Contains base class for reference counting with Mutex.
const real_t & u(int i, int j, int k) const
Read access to value on u-facing wall.
LinearFieldInterp class_type
virtual Data_T sample(const Field< Data_T > &data, const V3d &vsP) const =0
DEFINE_FIELD_RTTI_CONCRETE_CLASS
boost::intrusive_ptr< FieldInterp > Ptr
Data_T wsSample(const typename Field< Data_T >::Ptr f, const FieldInterp< Data_T > &interp, const V3d &wsP)
Helper function for interpolating in world space.
V3d monotonicCubicInterpolant< V3d >(const V3d &f1, const V3d &f2, const V3d &f3, const V3d &f4, double t)
FIELD3D_VEC3_T< T > operator*(S s, const FIELD3D_VEC3_T< T > vec)
Scalar times Vec3 multiplication. Makes the interpolation calls cleaner.
FieldInterp< Data_T > base
Convenience typedef for referring to base class.
boost::intrusive_ptr< FieldRes > Ptr
FIELD3D_CLASSTYPE_TEMPL_INSTANTIATION(FieldInterp)
static const char * staticClassType()
CubicFieldInterp class_type
Contains the ProceduralField class.
static const char * staticClassType()
classType for RTTI replacement
DEFINE_FIELD_RTTI_CONCRETE_CLASS
static TemplatedFieldType< CubicGenericFieldInterp< Field_T > > ms_classType
Data_T monotonicCubicInterpolantVec(const Data_T &f1, const Data_T &f2, const Data_T &f3, const Data_T &f4, double t)
Monotonic cubic interpolation on 3 - vectors References: http://en.wikipedia.org/wiki/Monotone_cubic_...
const real_t & w(int i, int j, int k) const
Read access to value on w-facing wall.
static const char * staticClassName()
DEFINE_FIELD_RTTI_CONCRETE_CLASS
virtual Data_T lsSample(const V3d &lsP) const =0
static const char * staticClassType()
boost::intrusive_ptr< CubicFieldInterp > Ptr
Data_T sample(const ProceduralField< Data_T > &data, const V3d &vsP) const
boost::intrusive_ptr< CubicGenericFieldInterp > Ptr
static const char * staticClassType()
FIELD3D_VEC3_T< T > floor(const FIELD3D_VEC3_T< T > &v)
Floor function for Vec3.
boost::intrusive_ptr< LinearGenericFieldInterp > Ptr
static TemplatedFieldType< ProceduralFieldLookup< Data_T > > ms_classType
boost::intrusive_ptr< ProceduralFieldLookup > Ptr
boost::intrusive_ptr< CubicMACFieldInterp > Ptr
static const char * staticClassName()
V3h monotonicCubicInterpolant< V3h >(const V3h &f1, const V3h &f2, const V3h &f3, const V3h &f4, double t)
static TemplatedFieldType< LinearGenericFieldInterp< Field_T > > ms_classType
RefBase base
Convenience typedef for referring to base class.
Field_T::value_type value_type
Data_T sample(const MACField< Data_T > &data, const V3d &vsP) const
DEFINE_FIELD_RTTI_CONCRETE_CLASS
static const char * staticClassName()
DEFINE_FIELD_RTTI_ABSTRACT_CLASS
bool isLegalVoxelCoord(const V3d &vsP, const Box3d &vsDataWindow)
Checks whether the floating - point voxel coordinate is within the given (floating point) data window...
boost::intrusive_ptr< LinearFieldInterp > Ptr
Data_T sample(const MACField< Data_T > &data, const V3d &vsP) const
Base class for interpolators.
virtual Data_T sample(const Field< Data_T > &data, const V3d &vsP) const
Used to return a string for the name of a templated field.
V3i const dataResolution() const
DEFINE_FIELD_RTTI_CONCRETE_CLASS
RefBase base
Convenience typedef for referring to base class.
static const char * staticClassType()
bool isPointInField(const FieldRes::Ptr f, const V3d &wsP)
Checks whether the point is within the given field.
CubicMACFieldInterp class_type
RefBase base
Convenience typedef for referring to base class.
static const char * staticClassName()
Contains Field, WritableField and ResizableField classes.
static const char * staticClassName()
static const char * staticClassName()
static TemplatedFieldType< LinearMACFieldInterp< Data_T > > ms_classType
LinearMACFieldInterp class_type
static const char * staticClassType()
static TemplatedFieldType< CubicMACFieldInterp< Data_T > > ms_classType
static TemplatedFieldType< LinearFieldInterp< Data_T > > ms_classType
RefBase base
Convenience typedef for referring to base class.
RefBase base
Convenience typedef for referring to base class.
DEFINE_FIELD_RTTI_CONCRETE_CLASS
RefBase base
Convenience typedef for referring to base class.
const Box3i & dataWindow() const
Returns the data window. Any coordinate inside this window is safe to pass to value() in the Field su...
static const char * staticClassName()
LinearGenericFieldInterp class_type
static TemplatedFieldType< FieldInterp< Data_T > > ms_classType
static const char * staticClassType()
virtual Data_T value(int i, int j, int k) const =0
Read access to a voxel. The coordinates are in integer voxel space .
Data_T monotonicCubicInterpolant(const Data_T &f1, const Data_T &f2, const Data_T &f3, const Data_T &f4, double t)
Monotonic cubic interpolation References: http://en.wikipedia.org/wiki/Monotone_cubic_interpolation h...
static TemplatedFieldType< CubicFieldInterp< Data_T > > ms_classType
Field_T::value_type value_type
CubicGenericFieldInterp class_type
boost::intrusive_ptr< Field > Ptr
FieldMapping::Ptr mapping()
Returns a pointer to the mapping.
value_type sample(const Field_T &data, const V3d &vsP) const
virtual Data_T sample(const Field< Data_T > &data, const V3d &vsP) const