#ifndef TESSD2MISC_H
#define TESSD2MISC_H

/*!
\brief Miscellaneous operations on 2D tessellation.
*/
template< typename TESS, typename PT, typename INDX >
class tessD2misc
{
  TESS & tess;
public:

  tessD2misc(TESS & tess_)
    : tess(tess_) {}

  /** Convert the tessellation to anticlockwise winding. */
  void windinganticlockwise();
  /** Convert the tessellation to clockwise winding. */
  void windingclockwise();

private:
  template < typename TR >
  void windingclockwisetriangle(TR & t);
};


//---------------------------------------------------------
// Implementation

template< typename TESS, typename PT, typename INDX >
template< typename TR >
void tessD2misc<TESS,PT,INDX>::windingclockwisetriangle(TR & t)
{
  PT const & P0(tess.pts[t.pi[0]]); 
  PT const & P1(tess.pts[t.pi[1]]); 
  PT const & P2(tess.pts[t.pi[2]]); 

  PT a(P0-P1);
  PT a2;
  a2.y = -a.x;
  a2.x = a.y;

  if (a2.dot(P2-P1) > 0.0)
  {
    INDX k=t.pi[1];
    t.pi[1] = t.pi[2];
    t.pi[2] = k;
  }
}

template< typename TESS, typename PT, typename INDX >
void tessD2misc<TESS,PT,INDX>::windingclockwise()
{
  INDX sz = tess.vi.size();
  for (INDX i=1; i<sz; ++i)
    windingclockwisetriangle(tess.vi[i]);
}
    
template< typename TESS, typename PT, typename INDX >
void tessD2misc<TESS,PT,INDX>::windinganticlockwise()
{
  windingclockwise();

  INDX sz = tess.vi.size();
  for (INDX i=1; i<sz; ++i)
  {
    INDX k=tess.vi[i].pi[1];
    tess.vi[i].pi[1] = tess.vi[i].pi[2];
    tess.vi[i].pi[2] = k;
  }
}
    

#endif


