Figure 7: The PerspectiveTr member function

void CScenView::PerspectiveTr()
{
   int i,j;
   int ix,iy;
  
   double vb,za;
  
   // Offset and perspective m_ObjPt (X,Y,Z) to (S,T)
  
   // Object point in 3D
   // m_ObjPtX; m_ObjPtY; m_ObjPtZ;
  
   m_ScnObjCoords[0] = m_ObjPtX + m_ObjPosX + m_ScOffpPosnX;
   m_ScnObjCoords[1] = m_ObjPtY + m_ObjPosY + m_ScOffpPosnY;
   m_ScnObjCoords[2] = m_ObjPtZ + m_ObjPosZ + m_ScOffpPosnZ;
  
   // matrix multiply
  
   for(j=0; j<4; j++){
      vb = m_ScnObjCoords[0] * m_ScPerspective[0][j];
      for(i=1; i<4; i++){
         vb = vb + m_ScnObjCoords[i] * m_ScPerspective[i][j];
      }
      m_rpc[j] = vb;
   }
  
   za = m_rpc[3];
  
   if(za == 0.0)za = 1.0e-15;  // Avoid division by 0
  
   // Rescale for m_rpc[3] = 1.0
  
   m_ScreenS = m_rpc[0] / za;
   m_ScreenT = m_rpc[1] / za;
  
   ix = int(m_ScreenGainX *
           (m_ScreenS - m_WorgSx) + 0.5) + m_WorgIx; 
  
   iy = int(m_ScreenGainY *
           (m_WorgTy - m_ScreenT) + 0.5) + m_WorgIy; 
  
   // Ready to set pixel
  
   m_DeviceIx = ix;  // Display device pixel
   m_DeviceIy = iy;
}