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

P mid_sph(const P& arg1, const P& arg2, double th = 0.5)
{
  P tmp(arg1 + th*(arg2 - arg1));
  return (1.0/norm(tmp))*tmp;
}

const double thQ(2*M_PI/3.2);

P ptP(1,0,0), ptQ(sph(1, thQ, 0)), ptC(0,0,1);
P poleP(0,1,0), poleQ(ptC*ptQ);

int main()
{
  picture(P(-1,-1), P(1,1), "2 x 2in");

  begin();
  camera.at(P(4,8,2)).range(0);
  Sphere S;

  S.draw();
  P ptA(sph(1, 0, M_PI/3));
  P ptG(-(ptA*poleQ)*poleQ), ptH(-(ptA*poleP)*poleQ);

  P ptB1(mid_sph(ptQ, ptC, 0.25)), ptB2(mid_sph(ptG, ptC, 0.25));

  dashed();
  back_line(ptQ, ptP);
  back_line(ptA, poleP);
  back_arc(ptC, -ptQ);

  solid();
  front_line(ptP, ptQ);
  front_line(ptA, poleP);
  front_arc(ptC, -ptQ);
  front_triangle(ptP, ptQ, ptC, S);

  front_triangle(ptA, ptB1, ptC);

  label(ptP, P( 2,-4), "$P$", b);
  label(ptC, P( 0, 4), "$C$", t);
  label(ptQ, P( 0,-4), "$Q$", b);

  label(ptA, P(0,-4), "$A$", b);
  label(poleP, P(0,-4), "$D$", bl);

  label(ptB1, P(2, 0), "$B$", tr);

  tikz_format();
  end();
}
