Field3D
CubicMACFieldInterp< Data_T > Class Template Reference

#include <FieldInterp.h>

Inheritance diagram for CubicMACFieldInterp< Data_T >:
RefBase

Public Types

typedef CubicMACFieldInterp class_type
 
typedef boost::intrusive_ptr< CubicMACFieldInterpPtr
 
typedef Data_T value_type
 
- Public Types inherited from RefBase
typedef boost::intrusive_ptr< RefBasePtr
 
typedef boost::weak_ptr< RefBaseWeakPtr
 

Public Member Functions

Data_T sample (const MACField< Data_T > &data, const V3d &vsP) const
 
- Public Member Functions inherited from RefBase
void ref () const
 Used by boost::intrusive_pointer. More...
 
size_t refcnt ()
 Used by boost::intrusive_pointer. More...
 
void unref () const
 Used by boost::intrusive_pointer. More...
 
WeakPtr weakPtr () const
 
 RefBase ()
 
 RefBase (const RefBase &)
 Copy constructor. More...
 
RefBaseoperator= (const RefBase &)
 Assignment operator. More...
 
virtual ~RefBase ()
 Destructor. More...
 
virtual bool checkRTTI (const char *typenameStr)=0
 This function is only implemented by concrete classes and triggers the actual RTTI check through matchRTTI();. More...
 
bool matchRTTI (const char *typenameStr)
 Performs a check to see if the given typename string matches this class' This needs to be implemented in -all- subclasses, even abstract ones. More...
 

Static Public Member Functions

static const char * staticClassName ()
 
static const char * staticClassType ()
 
- Static Public Member Functions inherited from RefBase
static const char * staticClassType ()
 

Public Attributes

 DEFINE_FIELD_RTTI_CONCRETE_CLASS
 

Private Types

typedef RefBase base
 Convenience typedef for referring to base class. More...
 

Static Private Attributes

static TemplatedFieldType< CubicMACFieldInterp< Data_T > > ms_classType
 

Detailed Description

template<class Data_T>
class CubicMACFieldInterp< Data_T >

Definition at line 434 of file FieldInterp.h.

Member Typedef Documentation

template<class Data_T >
typedef Data_T CubicMACFieldInterp< Data_T >::value_type

Definition at line 440 of file FieldInterp.h.

template<class Data_T >
typedef boost::intrusive_ptr<CubicMACFieldInterp> CubicMACFieldInterp< Data_T >::Ptr

Definition at line 441 of file FieldInterp.h.

template<class Data_T >
typedef CubicMACFieldInterp CubicMACFieldInterp< Data_T >::class_type

Definition at line 445 of file FieldInterp.h.

template<class Data_T >
typedef RefBase CubicMACFieldInterp< Data_T >::base
private

Convenience typedef for referring to base class.

Definition at line 471 of file FieldInterp.h.

Member Function Documentation

template<class Data_T >
static const char* CubicMACFieldInterp< Data_T >::staticClassName ( )
inlinestatic

Definition at line 448 of file FieldInterp.h.

449  {
450  return "CubicMACFieldInterp";
451  }
template<class Data_T >
static const char* CubicMACFieldInterp< Data_T >::staticClassType ( )
inlinestatic

Definition at line 453 of file FieldInterp.h.

References FieldInterp< Data_T >::sample().

template<class Data_T >
Data_T CubicMACFieldInterp< Data_T >::sample ( const MACField< Data_T > &  data,
const V3d vsP 
) const

Definition at line 1205 of file FieldInterp.h.

References FieldRes::dataWindow(), detail::floor(), monotonicCubicInterpolant(), MACField< Data_T >::u(), MACField< Data_T >::v(), and MACField< Data_T >::w().

1207 {
1208  typedef typename Data_T::BaseType T;
1209 
1210  const Box3i &dataWindow = data.dataWindow();
1211 
1212  // Pixel centers are at .5 coordinates
1213  // NOTE: Don't use contToDisc for this, we're looking for sample
1214  // point locations, not coordinate shifts.
1215 
1216  Data_T ret;
1217 
1218  // X component ---
1219 
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,
1224  clampedVsP.y - 0.5,
1225  clampedVsP.z - 0.5);
1226 
1227  // Lower left corner
1228  V3i c(static_cast<int>(floor(p.x)),
1229  static_cast<int>(floor(p.y)),
1230  static_cast<int>(floor(p.z)));
1231 
1232  FIELD3D_VEC3_T<double> t(p - static_cast<FIELD3D_VEC3_T<double> >(c));
1233 
1234  {
1235  // Clamp the coordinates
1236  int im, jm, km;
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));
1244  int im1, jm1, km1;
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));
1248  int im2, jm2, km2;
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));
1252 
1253  T z11 = monotonicCubicInterpolant(data.u(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);
1257  T z12 = monotonicCubicInterpolant(data.u(im_1, jm, km_1),
1258  data.u(im_1, jm, km),
1259  data.u(im_1, jm, km1),
1260  data.u(im_1, jm, km2), t.z);
1261  T z13 = monotonicCubicInterpolant(data.u(im_1, jm1, km_1),
1262  data.u(im_1, jm1, km),
1263  data.u(im_1, jm1, km1),
1264  data.u(im_1, jm1, km2), t.z);
1265  T z14 = monotonicCubicInterpolant(data.u(im_1, jm2, km_1),
1266  data.u(im_1, jm2, km),
1267  data.u(im_1, jm2, km1),
1268  data.u(im_1, jm2, km2), t.z);
1269 
1270  T z21 = monotonicCubicInterpolant(data.u(im, jm_1, km_1),
1271  data.u(im, jm_1, km),
1272  data.u(im, jm_1, km1),
1273  data.u(im, jm_1, km2), t.z);
1274  T z22 = monotonicCubicInterpolant(data.u(im, jm, km_1),
1275  data.u(im, jm, km),
1276  data.u(im, jm, km1),
1277  data.u(im, jm, km2), t.z);
1278  T z23 = monotonicCubicInterpolant(data.u(im, jm1, km_1),
1279  data.u(im, jm1, km),
1280  data.u(im, jm1, km1),
1281  data.u(im, jm1, km2), t.z);
1282  T z24 = monotonicCubicInterpolant(data.u(im, jm2, km_1),
1283  data.u(im, jm2, km),
1284  data.u(im, jm2, km1),
1285  data.u(im, jm2, km2), t.z);
1286 
1287  T z31 = monotonicCubicInterpolant(data.u(im1, jm_1, km_1),
1288  data.u(im1, jm_1, km),
1289  data.u(im1, jm_1, km1),
1290  data.u(im1, jm_1, km2), t.z);
1291  T z32 = monotonicCubicInterpolant(data.u(im1, jm, km_1),
1292  data.u(im1, jm, km),
1293  data.u(im1, jm, km1),
1294  data.u(im1, jm, km2), t.z);
1295  T z33 = monotonicCubicInterpolant(data.u(im1, jm1, km_1),
1296  data.u(im1, jm1, km),
1297  data.u(im1, jm1, km1),
1298  data.u(im1, jm1, km2), t.z);
1299  T z34 = monotonicCubicInterpolant(data.u(im1, jm2, km_1),
1300  data.u(im1, jm2, km),
1301  data.u(im1, jm2, km1),
1302  data.u(im1, jm2, km2), t.z);
1303 
1304  T z41 = monotonicCubicInterpolant(data.u(im2, jm_1, km_1),
1305  data.u(im2, jm_1, km),
1306  data.u(im2, jm_1, km1),
1307  data.u(im2, jm_1, km2), t.z);
1308  T z42 = monotonicCubicInterpolant(data.u(im2, jm, km_1),
1309  data.u(im2, jm, km),
1310  data.u(im2, jm, km1),
1311  data.u(im2, jm, km2), t.z);
1312  T z43 = monotonicCubicInterpolant(data.u(im2, jm1, km_1),
1313  data.u(im2, jm1, km),
1314  data.u(im2, jm1, km1),
1315  data.u(im2, jm1, km2), t.z);
1316  T z44 = monotonicCubicInterpolant(data.u(im2, jm2, km_1),
1317  data.u(im2, jm2, km),
1318  data.u(im2, jm2, km1),
1319  data.u(im2, jm2, km2), t.z);
1320 
1321  T y1 = monotonicCubicInterpolant(z11, z12, z13, z14, t.y);
1322  T y2 = monotonicCubicInterpolant(z21, z22, z23, z24, t.y);
1323  T y3 = monotonicCubicInterpolant(z31, z32, z33, z34, t.y);
1324  T y4 = monotonicCubicInterpolant(z41, z42, z43, z44, t.y);
1325 
1326  ret.x = monotonicCubicInterpolant(y1, y2, y3, y4, t.x);
1327  }
1328 
1329 
1330  // Y component ---
1331 
1332  p.setValue(clampedVsP.x - 0.5, vsP.y , clampedVsP.z - 0.5);
1333 
1334  // Lower left corner
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));
1338 
1339  t.setValue(p - static_cast<FIELD3D_VEC3_T<double> >(c));
1340  {
1341  // Clamp the coordinates
1342  int im, jm, km;
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));
1350  int im1, jm1, km1;
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));
1354  int im2, jm2, km2;
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));
1358 
1359  T z11 = monotonicCubicInterpolant(data.v(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);
1363  T z12 = monotonicCubicInterpolant(data.v(im_1, jm, km_1),
1364  data.v(im_1, jm, km),
1365  data.v(im_1, jm, km1),
1366  data.v(im_1, jm, km2), t.z);
1367  T z13 = monotonicCubicInterpolant(data.v(im_1, jm1, km_1),
1368  data.v(im_1, jm1, km),
1369  data.v(im_1, jm1, km1),
1370  data.v(im_1, jm1, km2), t.z);
1371  T z14 = monotonicCubicInterpolant(data.v(im_1, jm2, km_1),
1372  data.v(im_1, jm2, km),
1373  data.v(im_1, jm2, km1),
1374  data.v(im_1, jm2, km2), t.z);
1375 
1376  T z21 = monotonicCubicInterpolant(data.v(im, jm_1, km_1),
1377  data.v(im, jm_1, km),
1378  data.v(im, jm_1, km1),
1379  data.v(im, jm_1, km2), t.z);
1380  T z22 = monotonicCubicInterpolant(data.v(im, jm, km_1),
1381  data.v(im, jm, km),
1382  data.v(im, jm, km1),
1383  data.v(im, jm, km2), t.z);
1384  T z23 = monotonicCubicInterpolant(data.v(im, jm1, km_1),
1385  data.v(im, jm1, km),
1386  data.v(im, jm1, km1),
1387  data.v(im, jm1, km2), t.z);
1388  T z24 = monotonicCubicInterpolant(data.v(im, jm2, km_1),
1389  data.v(im, jm2, km),
1390  data.v(im, jm2, km1),
1391  data.v(im, jm2, km2), t.z);
1392 
1393  T z31 = monotonicCubicInterpolant(data.v(im1, jm_1, km_1),
1394  data.v(im1, jm_1, km),
1395  data.v(im1, jm_1, km1),
1396  data.v(im1, jm_1, km2), t.z);
1397  T z32 = monotonicCubicInterpolant(data.v(im1, jm, km_1),
1398  data.v(im1, jm, km),
1399  data.v(im1, jm, km1),
1400  data.v(im1, jm, km2), t.z);
1401  T z33 = monotonicCubicInterpolant(data.v(im1, jm1, km_1),
1402  data.v(im1, jm1, km),
1403  data.v(im1, jm1, km1),
1404  data.v(im1, jm1, km2), t.z);
1405  T z34 = monotonicCubicInterpolant(data.v(im1, jm2, km_1),
1406  data.v(im1, jm2, km),
1407  data.v(im1, jm2, km1),
1408  data.v(im1, jm2, km2), t.z);
1409 
1410  T z41 = monotonicCubicInterpolant(data.v(im2, jm_1, km_1),
1411  data.v(im2, jm_1, km),
1412  data.v(im2, jm_1, km1),
1413  data.v(im2, jm_1, km2), t.z);
1414  T z42 = monotonicCubicInterpolant(data.v(im2, jm, km_1),
1415  data.v(im2, jm, km),
1416  data.v(im2, jm, km1),
1417  data.v(im2, jm, km2), t.z);
1418  T z43 = monotonicCubicInterpolant(data.v(im2, jm1, km_1),
1419  data.v(im2, jm1, km),
1420  data.v(im2, jm1, km1),
1421  data.v(im2, jm1, km2), t.z);
1422  T z44 = monotonicCubicInterpolant(data.v(im2, jm2, km_1),
1423  data.v(im2, jm2, km),
1424  data.v(im2, jm2, km1),
1425  data.v(im2, jm2, km2), t.z);
1426 
1427  T y1 = monotonicCubicInterpolant(z11, z12, z13, z14, t.y);
1428  T y2 = monotonicCubicInterpolant(z21, z22, z23, z24, t.y);
1429  T y3 = monotonicCubicInterpolant(z31, z32, z33, z34, t.y);
1430  T y4 = monotonicCubicInterpolant(z41, z42, z43, z44, t.y);
1431 
1432  ret.y = monotonicCubicInterpolant(y1, y2, y3, y4, t.x);
1433  }
1434 
1435  // Z component ---
1436 
1437  p.setValue(clampedVsP.x - 0.5 , clampedVsP.y - 0.5, vsP.z);
1438 
1439  // Lower left corner
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));
1443 
1444  t.setValue(p - static_cast<FIELD3D_VEC3_T<double> >(c));
1445  {
1446  // Clamp the coordinates
1447  int im, jm, km;
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));
1455  int im1, jm1, km1;
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));
1459  int im2, jm2, km2;
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));
1463 
1464  T z11 = monotonicCubicInterpolant(data.w(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);
1468  T z12 = monotonicCubicInterpolant(data.w(im_1, jm, km_1),
1469  data.w(im_1, jm, km),
1470  data.w(im_1, jm, km1),
1471  data.w(im_1, jm, km2), t.z);
1472  T z13 = monotonicCubicInterpolant(data.w(im_1, jm1, km_1),
1473  data.w(im_1, jm1, km),
1474  data.w(im_1, jm1, km1),
1475  data.w(im_1, jm1, km2), t.z);
1476  T z14 = monotonicCubicInterpolant(data.w(im_1, jm2, km_1),
1477  data.w(im_1, jm2, km),
1478  data.w(im_1, jm2, km1),
1479  data.w(im_1, jm2, km2), t.z);
1480 
1481  T z21 = monotonicCubicInterpolant(data.w(im, jm_1, km_1),
1482  data.w(im, jm_1, km),
1483  data.w(im, jm_1, km1),
1484  data.w(im, jm_1, km2), t.z);
1485  T z22 = monotonicCubicInterpolant(data.w(im, jm, km_1),
1486  data.w(im, jm, km),
1487  data.w(im, jm, km1),
1488  data.w(im, jm, km2), t.z);
1489  T z23 = monotonicCubicInterpolant(data.w(im, jm1, km_1),
1490  data.w(im, jm1, km),
1491  data.w(im, jm1, km1),
1492  data.w(im, jm1, km2), t.z);
1493  T z24 = monotonicCubicInterpolant(data.w(im, jm2, km_1),
1494  data.w(im, jm2, km),
1495  data.w(im, jm2, km1),
1496  data.w(im, jm2, km2), t.z);
1497 
1498  T z31 = monotonicCubicInterpolant(data.w(im1, jm_1, km_1),
1499  data.w(im1, jm_1, km),
1500  data.w(im1, jm_1, km1),
1501  data.w(im1, jm_1, km2), t.z);
1502  T z32 = monotonicCubicInterpolant(data.w(im1, jm, km_1),
1503  data.w(im1, jm, km),
1504  data.w(im1, jm, km1),
1505  data.w(im1, jm, km2), t.z);
1506  T z33 = monotonicCubicInterpolant(data.w(im1, jm1, km_1),
1507  data.w(im1, jm1, km),
1508  data.w(im1, jm1, km1),
1509  data.w(im1, jm1, km2), t.z);
1510  T z34 = monotonicCubicInterpolant(data.w(im1, jm2, km_1),
1511  data.w(im1, jm2, km),
1512  data.w(im1, jm2, km1),
1513  data.w(im1, jm2, km2), t.z);
1514 
1515  T z41 = monotonicCubicInterpolant(data.w(im2, jm_1, km_1),
1516  data.w(im2, jm_1, km),
1517  data.w(im2, jm_1, km1),
1518  data.w(im2, jm_1, km2), t.z);
1519  T z42 = monotonicCubicInterpolant(data.w(im2, jm, km_1),
1520  data.w(im2, jm, km),
1521  data.w(im2, jm, km1),
1522  data.w(im2, jm, km2), t.z);
1523  T z43 = monotonicCubicInterpolant(data.w(im2, jm1, km_1),
1524  data.w(im2, jm1, km),
1525  data.w(im2, jm1, km1),
1526  data.w(im2, jm1, km2), t.z);
1527  T z44 = monotonicCubicInterpolant(data.w(im2, jm2, km_1),
1528  data.w(im2, jm2, km),
1529  data.w(im2, jm2, km1),
1530  data.w(im2, jm2, km2), t.z);
1531 
1532  T y1 = monotonicCubicInterpolant(z11, z12, z13, z14, t.y);
1533  T y2 = monotonicCubicInterpolant(z21, z22, z23, z24, t.y);
1534  T y3 = monotonicCubicInterpolant(z31, z32, z33, z34, t.y);
1535  T y4 = monotonicCubicInterpolant(z41, z42, z43, z44, t.y);
1536 
1537  ret.z = monotonicCubicInterpolant(y1, y2, y3, y4, t.x);
1538  }
1539 
1540  return ret;
1541 }
Imath::Box3i Box3i
Definition: SpiMathLib.h:77
const real_t & v(int i, int j, int k) const
Read access to value on v-facing wall.
Definition: MACField.h:736
const real_t & u(int i, int j, int k) const
Read access to value on u-facing wall.
Definition: MACField.h:698
Imath::V3i V3i
Definition: SpiMathLib.h:71
const real_t & w(int i, int j, int k) const
Read access to value on w-facing wall.
Definition: MACField.h:774
FIELD3D_VEC3_T< T > floor(const FIELD3D_VEC3_T< T > &v)
Floor function for Vec3.
Definition: CoordSys.h:95
Imath::V3d V3d
Definition: SpiMathLib.h:74
const Box3i & dataWindow() const
Returns the data window. Any coordinate inside this window is safe to pass to value() in the Field su...
Definition: Field.h:258
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...

Member Data Documentation

template<class Data_T >
CubicMACFieldInterp< Data_T >::DEFINE_FIELD_RTTI_CONCRETE_CLASS

Definition at line 446 of file FieldInterp.h.

template<class Data_T >
TemplatedFieldType<CubicMACFieldInterp<Data_T> > CubicMACFieldInterp< Data_T >::ms_classType
staticprivate

Definition at line 466 of file FieldInterp.h.


The documentation for this class was generated from the following file: