#include <PostscriptDocument.cpp>

int main(int argc, char ** argv)
{

  {
    double x = 800;
    Rect rect = { 0, 0, 1200, 300 };
    PostscriptDocument doc(rect);
    doc.startPath();
    doc.moveTo(x + 100, 225);
    doc.lineTo(x + 300, 225);
    doc.lineTo(x + 100,  75);
    doc.lineTo(x + 300,  75);
    doc.closePath();
    doc.pushState();
    doc.setColor(0.5, 0.5, 0.5);
    doc.fillPath();
    doc.popState();
    doc.setLineWidth(4);
    doc.setColor(0.8, 0.8, 0.8);
    doc.strokePath();

    doc.setLineWidth(1);
    doc.setColor(0, 0, 0);
    doc.fillCircle(x + 100, 225, 6);
    doc.fillCircle(x + 300, 225, 6);
    doc.fillCircle(x + 100,  75, 6);
    doc.fillCircle(x + 300,  75, 6);

    doc.setFont(PostscriptDocument::FONT_HELVETICA_NORMAL, 16);
    doc.drawString("0", x +  81, 225);
    doc.drawString("1", x + 314, 225);
    doc.drawString("2", x +  81,  75);
    doc.drawString("3", x + 314,  75);

    x = 400;

    doc.startPath();
    doc.moveTo(x + 100, 225);
    doc.lineTo(x + 300, 225);
    doc.lineTo(x + 200, 150);
    doc.lineTo(x + 300,  75);
    doc.lineTo(x + 100,  75);
    doc.closePath();
    doc.pushState();
    doc.setColor(0.5, 0.5, 0.5);
    doc.fillPath();
    doc.popState();
    doc.setLineWidth(4);
    doc.setColor(0.8, 0.8, 0.8);
    doc.strokePath();

    doc.setColor(1, 1, 1);
    doc.startPath();
    doc.moveTo(x + 150 - 15, 200);
    doc.lineTo(x + 250 - 15, 200);
    doc.lineTo(x + 175 - 15, 150);
    doc.lineTo(x + 150 - 15, 150);
    doc.closePath();
    doc.fillPath();

    doc.startPath();
    doc.moveTo(x + 150 - 15, 100);
    doc.lineTo(x + 250 - 15, 100);
    doc.lineTo(x + 175 - 15, 150);
    doc.lineTo(x + 150 - 15, 150);
    doc.closePath();
    doc.fillPath();

    doc.setLineWidth(4);
    doc.setColor(0.8, 0.8, 0.8);
    doc.drawLine(x + 150 - 15, 100, x + 250 - 15, 100);
    doc.drawLine(x + 250 - 15, 100, x + 175 - 15, 150);
    doc.drawLine(x + 175 - 15, 150, x + 250 - 15, 200);
    doc.drawLine(x + 250 - 15, 200, x + 150 - 15, 200);
    doc.drawLine(x + 150 - 15, 200, x + 150 - 15, 100);

    doc.setLineWidth(1);
    doc.setColor(0, 0, 0);
    doc.fillCircle(x + 100     , 225, 6);
    doc.fillCircle(x + 300     , 225, 6);
    doc.fillCircle(x + 200     , 150, 6);
    doc.fillCircle(x + 100     ,  75, 6);
    doc.fillCircle(x + 300     ,  75, 6);
    doc.fillCircle(x + 150 - 15, 100, 6);
    doc.fillCircle(x + 250 - 15, 100, 6);
    doc.fillCircle(x + 175 - 15, 150, 6);
    doc.fillCircle(x + 250 - 15, 200, 6);
    doc.fillCircle(x + 150 - 15, 200, 6);

    doc.setColor(0, 0, 0);
    doc.setFont(PostscriptDocument::FONT_HELVETICA_NORMAL, 16);
    doc.drawString("0", x +  81, 225);
    doc.drawString("1", x + 314, 225);
    doc.drawString("2", x + 214, 150);
    doc.drawString("3", x + 314,  75);
    doc.drawString("4", x +  81,  75);
    doc.drawString("5", x + 164 - 15, 104);
    doc.drawString("6", x + 201 - 15, 104);
    doc.drawString("7", x + 161 - 15, 146);
    doc.drawString("8", x + 201 - 15, 186);
    doc.drawString("9", x + 164 - 15, 186);

    x = 0;

    doc.startPath();
    doc.moveTo(x + 100, 225);
    doc.lineTo(x + 300, 225);
    doc.lineTo(x + 200, 150);
    doc.lineTo(x + 300,  75);
    doc.lineTo(x + 100,  75);
    doc.closePath();
    doc.pushState();
    doc.setColor(0.5, 0.5, 0.5);
    doc.fillPath();
    doc.popState();
    doc.setLineWidth(4);
    doc.setColor(0.8, 0.8, 0.8);
    doc.strokePath();

    doc.setLineWidth(1);
    doc.setColor(0, 0, 0);
    doc.fillCircle(x + 100, 225, 6);
    doc.fillCircle(x + 300, 225, 6);
    doc.fillCircle(x + 200, 150, 6);
    doc.fillCircle(x + 100,  75, 6);
    doc.fillCircle(x + 300,  75, 6);

    doc.setFont(PostscriptDocument::FONT_HELVETICA_NORMAL, 16);
    doc.drawString("0", x +  81, 225);
    doc.drawString("1", x + 314, 225);
    doc.drawString("2", x + 214, 150);
    doc.drawString("3", x + 314,  75);
    doc.drawString("4", x +  81,  75);

    doc.saveToFile("clean_and_unclean_poly.eps");
  }
  {
    Rect rect = { 0, 0, 800, 300 };
    double x = 400;
    double dash[] = { 1, 5 };
    PostscriptDocument doc(rect);
    doc.setLineWidth(2);

    doc.startPath();
    doc.moveTo(x + 140,  45);
    doc.lineTo(x +  80, 180);
    doc.lineTo(x + 200, 255);
    doc.lineTo(x + 320, 180);
    doc.lineTo(x + 260,  45);
    doc.closePath();
    doc.strokePath();

    doc.drawLine(x + 200, 255, x + 140,  45);
    doc.drawLine(x + 200, 255, x + 260,  45);

    x = 0;

    doc.startPath();
    doc.moveTo(x + 140,  45);
    doc.lineTo(x +  80, 180);
    doc.lineTo(x + 200, 255);
    doc.lineTo(x + 320, 180);
    doc.lineTo(x + 260,  45);
    doc.closePath();
    doc.strokePath();

    doc.startPath();
    doc.drawLine(x + 140,  45, x + 185, 185);
    doc.drawLine(x +  80, 180, x + 185, 185);
    doc.drawLine(x + 200, 255, x + 185, 185);
    doc.drawLine(x + 320, 180, x + 185, 185);
    doc.drawLine(x + 260,  45, x + 185, 185);
    doc.closePath();
    doc.strokePath();

    doc.pushState();
    doc.setDash(dash, 2);
    doc.drawLine(x + 185, 185, x + 185, 135);
    doc.popState();


    doc.saveToFile("tri_dec.eps");
  }
  {
    Rect rect = { 0, 0, 850, 300 };
    double x = 0;
    double dash[] = { 1.2, 7 };
    double origDash[] = { 1, 0 };
    PostscriptDocument doc(rect);
    doc.setLineWidth(2);

    x = 300;
    doc.setDash(origDash, 2);
    doc.startPath();
    doc.moveTo(x + 0,    50);
    doc.lineTo(x + 100, 250);
    doc.lineTo(x + 200,  50);
    doc.closePath();
    doc.strokePath();
    doc.fillCircle(x + 100, 50 + 200 / 3.0, 6);
    doc.setDash(dash, 2);
    doc.drawLine(x + 0,    50, x + 100, 50 + 200 / 3.0);
    doc.drawLine(x + 100, 250, x + 100, 50 + 200 / 3.0);
    doc.drawLine(x + 200,  50, x + 100, 50 + 200 / 3.0);



    x = 0;
    doc.setDash(origDash, 2);
    doc.startPath();
    doc.moveTo(x + 0,    50);
    doc.lineTo(x + 100, 250);
    doc.lineTo(x + 200,  50);
    doc.closePath();
    doc.strokePath();
    doc.fillCircle(x + 150, 150, 6);
    doc.setDash(dash, 2);
    doc.drawLine(x + 0,    50, x + 150, 150);

    x = 600;
    doc.setDash(origDash, 2);
    doc.startPath();
    doc.moveTo(x + 0,    50);
    doc.lineTo(x + 100, 250);
    doc.lineTo(x + 200,  50);
    doc.closePath();
    doc.strokePath();
    doc.fillCircle(x + 100, 250, 6);

    doc.saveToFile("tri_split.eps");
  }

  return 0;
}

