
#include <triangle.h>
#include <d3tess.h>
#include <d3mincircle.h>




#define SHOW(x) #x << '=' << (x)

typedef point2<double> pt2;
typedef point3<double> pt3;
typedef point3<double> const pt3c;


d3mincircle::d3mincircle(d3tess & tess_)
  : d3minoperator(tess_)
{
}


boolc d3mincircle::testifinsidetriangle
(
  pt3c & x,
  pt3c & p0,
  pt3c & p1,
  pt3c & p2
) const
{
  triangle< pt2, double > t((pt2)p0,(pt2)p1,(pt2)p2);

  pt2 c0;
  double radius;
  //t.outercircle(c0,radius);
  t.outercircle(radius,c0);

  pt2 x2(x);

  if ((c0-x2).dot() > radius*radius )
    return false;

  return true;
}

boolc d3mincircle::eval(uintc a, uintc b)
{
  if (tess.isconvex(a,b)==false)
    return false;

  simplexD2linked const & A(tess.vi[a]);
  simplexD2linked const & B(tess.vi[b]);

  uint ai = A.niInverse(b);
  uint bi = B.niInverse(a);

  uint p[4];
  p[0] = A.pi[ai];
  p[3] = B.pi[bi];
  p[1] = A.pi[(ai+1)%3];
  p[2] = A.pi[(ai+2)%3];

  vector<pt3> const & pt(tess.pt);

  if ( testifinsidetriangle(pt[p[3]],pt[p[0]],pt[p[1]],pt[p[2]]) )
  {
    tess.flip(a,b);
    return true;
  }
  
  if ( testifinsidetriangle(pt[p[0]],pt[p[1]],pt[p[2]],pt[p[3]]) )
  {
cout << "f2 " << SHOW(a) << " " << SHOW(b) << endl;
    tess.flip(a,b);
    return true;
  }

  return false;
}


