Example #1
0
//----------------------------------------------------------------------------
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;
}
Example #2
0
//----------------------------------------------------------------------------
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;
}