//---------------------------------------------------------------------------- bool RayTrace::Clip3D (float& rfX0, float& rfY0, float& rfZ0, float& rfX1, float& rfY1, float& rfZ1) { // clipping region const float fXMin = -m_fXCenter, fXMax = m_fXCenter; const float fYMin = -m_fYCenter, fYMax = m_fYCenter; const float fZMin = -m_fZCenter, fZMax = m_fZCenter; float fU0 = 0.0f, fU1 = 1.0f; float fDx = rfX1 - rfX0; if ( !Clipped(-fDx,rfX0-fXMin,fU0,fU1) || !Clipped(+fDx,fXMax-rfX0,fU0,fU1) ) { return false; } float fDy = rfY1 - rfY0; if ( !Clipped(-fDy,rfY0-fYMin,fU0,fU1) || !Clipped(+fDy,fYMax-rfY0,fU0,fU1) ) { return false; } float fDz = rfZ1 - rfZ0; if ( !Clipped(-fDz,rfZ0-fZMin,fU0,fU1) || !Clipped(+fDz,fZMax-rfZ0,fU0,fU1) ) { return false; } if ( fU1 < 1.0f ) { rfX1 = rfX0 + fU1*fDx; rfY1 = rfY0 + fU1*fDy; rfZ1 = rfZ0 + fU1*fDz; } if ( fU0 > 0.0f ) { rfX0 = rfX0 + fU0*fDx; rfY0 = rfY0 + fU0*fDy; rfZ0 = rfZ0 + fU0*fDz; } return true; }
//---------------------------------------------------------------------------- bool RayTrace::Clip3D (float& x0, float& y0, float& z0, float& x1, float& y1, float& z1) { // The clipping region. const float xmin = -mXCenter, xmax = mXCenter; const float ymin = -mYCenter, ymax = mYCenter; const float zmin = -mZCenter, zmax = mZCenter; float u0 = 0.0f, u1 = 1.0f; float dx = x1 - x0; if (!Clipped(-dx, x0 - xmin, u0, u1) || !Clipped(+dx, xmax - x0, u0, u1)) { return false; } float dy = y1 - y0; if (!Clipped(-dy, y0 - ymin, u0, u1) || !Clipped(+dy, ymax - y0, u0, u1)) { return false; } float dz = z1 - z0; if (!Clipped(-dz, z0 - zmin, u0, u1) || !Clipped(+dz, zmax - z0, u0, u1)) { return false; } if (u1 < 1.0f) { x1 = x0 + u1*dx; y1 = y0 + u1*dy; z1 = z0 + u1*dz; } if (u0 > 0.0f) { x0 = x0 + u0*dx; y0 = y0 + u0*dy; z0 = z0 + u0*dz; } return true; }