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.
 
size_t refcnt ()
 Used by boost::intrusive_pointer.
 
void unref () const
 Used by boost::intrusive_pointer.
 
WeakPtr weakPtr () const
 
 RefBase ()
 
 RefBase (const RefBase &)
 Copy constructor.
 
RefBaseoperator= (const RefBase &)
 Assignment operator.
 
virtual ~RefBase ()
 Destructor.
 
virtual bool checkRTTI (const char *typenameStr)=0
 This function is only implemented by concrete classes and triggers the actual RTTI check through matchRTTI();.
 
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.
 

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.
 

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

◆ value_type

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

Definition at line 440 of file FieldInterp.h.

◆ Ptr

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

Definition at line 441 of file FieldInterp.h.

◆ class_type

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

Definition at line 445 of file FieldInterp.h.

◆ base

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

Convenience typedef for referring to base class.

Definition at line 471 of file FieldInterp.h.

Member Function Documentation

◆ staticClassName()

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 }

◆ staticClassType()

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

Definition at line 453 of file FieldInterp.h.

◆ 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.

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}
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...
Imath::V3i V3i
Definition SpiMathLib.h:71
Imath::V3d V3d
Definition SpiMathLib.h:74
#define FIELD3D_VEC3_T
Definition SpiMathLib.h:88
Imath::Box3i Box3i
Definition SpiMathLib.h:77
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:253
const real_t & w(int i, int j, int k) const
Read access to value on w-facing wall.
Definition MACField.h:774
const real_t & u(int i, int j, int k) const
Read access to value on u-facing wall.
Definition MACField.h:698
const real_t & v(int i, int j, int k) const
Read access to value on v-facing wall.
Definition MACField.h:736
FIELD3D_VEC3_T< T > floor(const FIELD3D_VEC3_T< T > &v)
Floor function for Vec3.
Definition CoordSys.h:104

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

Member Data Documentation

◆ DEFINE_FIELD_RTTI_CONCRETE_CLASS

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

Definition at line 446 of file FieldInterp.h.

◆ ms_classType

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: