ON_3dVector ON_Light::PerpindicularDirection() const { // returns a consistent vector perpendicular to the // light's direction. This vector is useful for // user interface display. ON_3dVector dir = m_direction; if ( !dir.IsValid() || !dir.Unitize() ) return ON_UNSET_VECTOR; ON_3dVector xdir; if ( IsLinearLight() || IsRectangularLight() ) { xdir = m_length; if ( xdir.IsValid() && xdir.Unitize() && fabs(xdir*dir) <= ON_SQRT_EPSILON ) return xdir; } if( dir.IsParallelTo( ON_zaxis, ON_DEGREES_TO_RADIANS * 3.0)) xdir = ON_CrossProduct( dir, ON_xaxis); else xdir = ON_CrossProduct( dir, ON_zaxis); xdir.Unitize(); ON_3dVector ydir = ON_CrossProduct(dir,xdir); ydir.Unitize(); ON_3dVector right; switch(dir.MaximumCoordinateIndex()) { case 0: right = (fabs(xdir.y) > fabs(ydir.y)) ? xdir : ydir; if ( right.y < 0.0 ) right.Reverse(); break; case 1: case 2: right = (fabs(xdir.x) > fabs(ydir.x)) ? xdir : ydir; if ( right.x < 0.0 ) right.Reverse(); break; default: right = xdir; break; } if ( right[right.MaximumCoordinateIndex()] < 0.0 ) right.Reverse(); return right; }