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";
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";
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);
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
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));
677 int im_1, jm_1, km_1;
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();
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);
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);
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);
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);
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);
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);
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;
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));
1111 int im_1, jm_1, km_1;
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;
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));
1240 int im_1, jm_1, km_1;
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));
1346 int im_1, jm_1, km_1;
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));
1451 int im_1, jm_1, km_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)
Contains the DenseField class.
FIELD3D_CLASSTYPE_TEMPL_INSTANTIATION(FieldInterp)
V3h monotonicCubicInterpolant< V3h >(const V3h &f1, const V3h &f2, const V3h &f3, const V3h &f4, double t)
V3f monotonicCubicInterpolant< V3f >(const V3f &f1, const V3f &f2, const V3f &f3, const V3f &f4, double t)
bool isPointInField(const FieldRes::Ptr f, const V3d &wsP)
Checks whether the point is within the given field.
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.
FIELD3D_VEC3_T< T > operator*(S s, const FIELD3D_VEC3_T< T > vec)
Scalar times Vec3 multiplication. Makes the interpolation calls cleaner.
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...
V3d monotonicCubicInterpolant< V3d >(const V3d &f1, const V3d &f2, const V3d &f3, const V3d &f4, double t)
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_...
bool isLegalVoxelCoord(const V3d &vsP, const Box3d &vsDataWindow)
Checks whether the floating - point voxel coordinate is within the given (floating point) data window...
Contains Field, WritableField and ResizableField classes.
Contains the MACField class.
Contains the ProceduralField class.
Contains base class for reference counting with Mutex.
static const char * staticClassName()
static TemplatedFieldType< CubicFieldInterp< Data_T > > ms_classType
DEFINE_FIELD_RTTI_CONCRETE_CLASS
FieldInterp< Data_T > base
Convenience typedef for referring to base class.
boost::intrusive_ptr< CubicFieldInterp > Ptr
virtual Data_T sample(const Field< Data_T > &data, const V3d &vsP) const
CubicFieldInterp class_type
static const char * staticClassType()
DEFINE_FIELD_RTTI_CONCRETE_CLASS
CubicGenericFieldInterp class_type
boost::intrusive_ptr< CubicGenericFieldInterp > Ptr
Field_T::value_type value_type
RefBase base
Convenience typedef for referring to base class.
static const char * staticClassName()
static const char * staticClassType()
static TemplatedFieldType< CubicGenericFieldInterp< Field_T > > ms_classType
value_type sample(const Field_T &data, const V3d &vsP) const
static const char * staticClassType()
RefBase base
Convenience typedef for referring to base class.
CubicMACFieldInterp class_type
boost::intrusive_ptr< CubicMACFieldInterp > Ptr
Data_T sample(const MACField< Data_T > &data, const V3d &vsP) const
DEFINE_FIELD_RTTI_CONCRETE_CLASS
static TemplatedFieldType< CubicMACFieldInterp< Data_T > > ms_classType
static const char * staticClassName()
Base class for interpolators.
static TemplatedFieldType< FieldInterp< Data_T > > ms_classType
DEFINE_FIELD_RTTI_ABSTRACT_CLASS
RefBase base
Convenience typedef for referring to base class.
boost::intrusive_ptr< FieldInterp > Ptr
static const char * staticClassType()
virtual Data_T sample(const Field< Data_T > &data, const V3d &vsP) const =0
static const char * staticClassName()
V3i const dataResolution() const
boost::intrusive_ptr< FieldRes > Ptr
FieldMapping::Ptr mapping()
Returns a pointer to the mapping.
const Box3i & dataWindow() const
Returns the data window. Any coordinate inside this window is safe to pass to value() in the Field su...
boost::intrusive_ptr< Field > Ptr
virtual Data_T value(int i, int j, int k) const =0
Read access to a voxel. The coordinates are in integer voxel space .
FieldInterp< Data_T > base
Convenience typedef for referring to base class.
virtual Data_T sample(const Field< Data_T > &data, const V3d &vsP) const
static const char * staticClassName()
static TemplatedFieldType< LinearFieldInterp< Data_T > > ms_classType
DEFINE_FIELD_RTTI_CONCRETE_CLASS
LinearFieldInterp class_type
static const char * staticClassType()
boost::intrusive_ptr< LinearFieldInterp > Ptr
static const char * staticClassName()
DEFINE_FIELD_RTTI_CONCRETE_CLASS
static const char * staticClassType()
static TemplatedFieldType< LinearGenericFieldInterp< Field_T > > ms_classType
boost::intrusive_ptr< LinearGenericFieldInterp > Ptr
value_type sample(const Field_T &data, const V3d &vsP) const
Field_T::value_type value_type
LinearGenericFieldInterp class_type
RefBase base
Convenience typedef for referring to base class.
Data_T sample(const MACField< Data_T > &data, const V3d &vsP) const
RefBase base
Convenience typedef for referring to base class.
LinearMACFieldInterp class_type
static const char * staticClassType()
classType for RTTI replacement
static TemplatedFieldType< LinearMACFieldInterp< Data_T > > ms_classType
DEFINE_FIELD_RTTI_CONCRETE_CLASS
static const char * staticClassName()
boost::intrusive_ptr< LinearMACFieldInterp > Ptr
This subclass of Field implements a standard MAC field. Refer to your favorite fluid simulations book...
const real_t & w(int i, int j, int k) const
Read access to value on w-facing wall.
const real_t & u(int i, int j, int k) const
Read access to value on u-facing wall.
const real_t & v(int i, int j, int k) const
Read access to value on v-facing wall.
DEFINE_FIELD_RTTI_CONCRETE_CLASS
RefBase base
Convenience typedef for referring to base class.
ProceduralFieldLookup class_type
static const char * staticClassName()
boost::intrusive_ptr< ProceduralFieldLookup > Ptr
static TemplatedFieldType< ProceduralFieldLookup< Data_T > > ms_classType
Data_T sample(const ProceduralField< Data_T > &data, const V3d &vsP) const
static const char * staticClassType()
virtual Data_T lsSample(const V3d &lsP) const =0
FIELD3D_VEC3_T< T > floor(const FIELD3D_VEC3_T< T > &v)
Floor function for Vec3.
T max(const T a, const T2 b)
Max operation on mixed types.
T min(const T a, const T2 b)
Min operation on mixed types.
#define FIELD3D_NAMESPACE_HEADER_CLOSE
Used to return a string for the name of a templated field.