/* -*-ePiX-*- */
#include "epix.h"
using namespace ePiX;

const P pt1(2,-1);
const P pt2(1,2);
const P pt3(-2,0);

void altitude_color()
{
  blue(1.4);
}

#ifdef BISECTORS
void bisector_color()
{
  green(1.4);
}
#endif

// project arg to line through tail, head
P drop_perp(const P& arg, const P& tail, const P& head)
{
  return arg - ((arg - tail)%(head - tail)); // % = orthogonalization
}

#ifdef BISECTORS
P bisector(const P& arg, const P& tail, const P& head)
{
  P dir_tl(tail - arg);
  dir_tl *= 1.0/norm(dir_tl);

  P dir_hd(head - arg);
  dir_hd *= 1.0/norm(dir_hd);

  Segment bisect(arg, arg + 0.5*(dir_tl + dir_hd));

  return Segment(tail, head)*bisect;
}
#endif

void rangle(const P& arg, const P& tail, const P& head)
{
  const P dir(head - tail);
  const P loc(arg - ((arg - tail)%dir));

  right_angle(loc, dir, J(dir));
}

const P q1(drop_perp(pt1, pt2, pt3));
const P q2(drop_perp(pt2, pt3, pt1));
const P q3(drop_perp(pt3, pt1, pt2));

#ifdef BISECTORS
const P r1(bisector(pt1, pt2, pt3));
const P r2(bisector(pt2, pt3, pt1));
const P r3(bisector(pt3, pt1, pt2));
#endif

int main()
{
  picture(P(-3,-3), P(3,3), "4x4in");

  begin();
  set_crop();

  // sides
  Segment side1(pt2, pt3);
  Segment side2(pt3, pt1);
  Segment side3(pt1, pt2);

  // medians
  Segment med1(pt1, side1.midpoint());
  Segment med2(pt2, side2.midpoint());
  Segment med3(pt3, side3.midpoint());

  // altitudes
  Segment alt1(pt1, q1);
  Segment alt2(pt2, q2);
  Segment alt3(pt3, q3);

#ifdef BISECTORS
  // bisectors
  Segment bis1(pt1, r1);
  Segment bis2(pt2, r2);
  Segment bis3(pt3, r3);
#endif

  med1.draw();
  med2.draw();
  med3.draw();

  bold();
  side1.draw();
  side2.draw();
  side3.draw();
  plain();

  altitude_color();
  alt1.draw();
  alt2.draw();
  alt3.draw();

  rangle(q1, pt2, pt3);
  rangle(q2, pt3, pt1);
  rangle(q3, pt1, pt2);

  circle(q1, q2, q3);

  label(q1, P(-2,4), "$a_1$", t);
  label(q2, P(-2,-4), "$a_2$", b);
  label(q3, P(4,0), "$a_3$", r);

#ifdef BISECTORS
  bisector_color();
  bis1.draw();
  bis2.draw();
  bis3.draw();

  //  circle(r1, r2, r3);
#endif

  black();
  font_size("footnotesize");
  label(pt1, P(2,-2), "$p_1$", br);
  label(pt2, P(2,2), "$p_2$", tr);
  label(pt3, P(-4,-2), "$p_3$", l);

  label(side1*med1, P(-4,2), "$m_1$", tl);
  label(side2*med2, P(-2,-4), "$m_2$", b);
  label(side3*med3, P(4,0), "$m_3$", r);

  end();
}