From $ROOTSYS/tutorials/graphics/polytest2.C

//Author: Timur Pocheptsov, 20.01.2014.
//
//This macro is testing new "compacting" algorithm in TPadPainter
//(it reduces the number of polygon's vertices using actual pixel coordinates).
//In principle, this test case is what our histograms (fringe cases) are:
//"saw-like" polygon (bins == teeth).
//

//Includes for ACLiC.
#include <cassert>
#include <vector>

#include "TRandom.h"
#include "TCanvas.h"
#include "Rtypes.h"
#include "TNamed.h"

class PolyTest2 : public TNamed, public TAttLine, public TAttFill {
public:
   PolyTest2();

   void Paint(const Option_t *notUsed);

private:
   enum TestSize {
      kNSawPoints = 10000
   };

   //Part 1.
   std::vector<Double_t> fXs1;
   std::vector<Double_t> fYs1;
   //Part 2.

   std::vector<Double_t> fXs2;
   std::vector<Double_t> fYs2;
};

//_____________________________________________________________
PolyTest2::PolyTest2()
               : TNamed("polygon_compression_test2", "polygon_compression_test2")
{
   //Polygon 1, n of points is 10003, after 'compression' : 1897
   //Polygon 2, n of points is 10003, after 'compression' : 2093

   //Some canvas must already exist by this point.
   assert(gPad != 0 && "PolyTest2, gPad is null");
   //We need a gRandom to exist.
   assert(gRandom != 0 && "PolyTest2, gRandom is null");

   Double_t xMin = 0., xMax = 0., yMin = 0., yMax = 0.;
   gPad->GetRange(xMin, yMin, xMax, yMax);
   assert(xMax - xMin > 0 && yMax - yMin > 0 && "PolyTest2, invalid canvas' ranges");


   // .(0/the last)--------.(1)
   // |                      /
   // |                      \
   // |                      /
   // .(kNSawPoints + 1)--.(kNSawPoints)

   const unsigned nVertices = 3 + kNSawPoints;

   {
   //Polygon 1, "vertical saw":
   fXs1.resize(nVertices);
   fYs1.resize(nVertices);

   fXs1[0] = 0.;
   fYs1[0] = 0.;

   const Double_t w1 = 0.2 * (xMax - xMin);
   const Double_t saw1ToothSize = 0.1 * w1;
   const Double_t yStep = (yMax - yMin) / (kNSawPoints - 1);

   for (unsigned i = 1; i <= kNSawPoints; ++i) {
      fXs1[i] = w1 + gRandom->Rndm() * saw1ToothSize;
      fYs1[i] = yMin + yStep * (i - 1);
   }

   fXs1[nVertices - 2] = 0.;
   fYs1[nVertices - 2] = yMax;
   //Let's close it.
   fXs1[nVertices - 1] = fXs1[0];
   fYs1[nVertices - 1] = fYs1[0];

   }

   //Polygon 2, "horizontal saw":

   {
   const Double_t x2Min = xMin + 0.25 * (xMax - xMin);
   const Double_t h2 = 0.1 * (yMax - yMin);
   const Double_t saw2ToothSize = 0.1 * h2;
   const Double_t xStep = (xMax - x2Min) / (kNSawPoints - 1);

   fXs2.resize(nVertices);
   fYs2.resize(nVertices);

   fXs2[0] = x2Min;
   fYs2[0] = 0.;

   for (unsigned i = 1; i <= kNSawPoints; ++i) {
      fXs2[i] = x2Min + xStep * i;
      fYs2[i] = h2 + gRandom->Rndm() * saw2ToothSize;
   }

   fXs2[nVertices - 2] = xMax;
   fYs2[nVertices - 2] = 0.;
   fXs2[nVertices - 1] = fXs2[0];
   fYs2[nVertices - 1] = fYs2[0];
   }
}

//_____________________________________________________________
void PolyTest2::Paint(const Option_t * /*notUsed*/)
{
   assert(gPad != 0 && "Paint, gPad is null");

   SetFillColor(kGreen);
   TAttFill::Modify();
   gPad->PaintFillArea((Int_t)fXs1.size(), &fXs1[0], &fYs1[0]);

   SetLineColor(kBlue);
   TAttLine::Modify();
   gPad->PaintPolyLine((Int_t)fXs1.size(), &fXs1[0], &fYs1[0]);

   SetFillColor(kOrange);
   TAttFill::Modify();
   gPad->PaintFillArea((Int_t)fXs2.size(), &fXs2[0], &fYs2[0]);

   SetLineColor(kMagenta);
   TAttLine::Modify();
   gPad->PaintPolyLine((Int_t)fXs2.size(), &fXs2[0], &fYs2[0]);
}

void polytest2()
{
   TCanvas * const cnv = new TCanvas;
   cnv->cd();

   PolyTest2 * polygon = new PolyTest2;
   polygon->Draw();//Attach a polygon to a canvas.
}
 polytest2.C:1
 polytest2.C:2
 polytest2.C:3
 polytest2.C:4
 polytest2.C:5
 polytest2.C:6
 polytest2.C:7
 polytest2.C:8
 polytest2.C:9
 polytest2.C:10
 polytest2.C:11
 polytest2.C:12
 polytest2.C:13
 polytest2.C:14
 polytest2.C:15
 polytest2.C:16
 polytest2.C:17
 polytest2.C:18
 polytest2.C:19
 polytest2.C:20
 polytest2.C:21
 polytest2.C:22
 polytest2.C:23
 polytest2.C:24
 polytest2.C:25
 polytest2.C:26
 polytest2.C:27
 polytest2.C:28
 polytest2.C:29
 polytest2.C:30
 polytest2.C:31
 polytest2.C:32
 polytest2.C:33
 polytest2.C:34
 polytest2.C:35
 polytest2.C:36
 polytest2.C:37
 polytest2.C:38
 polytest2.C:39
 polytest2.C:40
 polytest2.C:41
 polytest2.C:42
 polytest2.C:43
 polytest2.C:44
 polytest2.C:45
 polytest2.C:46
 polytest2.C:47
 polytest2.C:48
 polytest2.C:49
 polytest2.C:50
 polytest2.C:51
 polytest2.C:52
 polytest2.C:53
 polytest2.C:54
 polytest2.C:55
 polytest2.C:56
 polytest2.C:57
 polytest2.C:58
 polytest2.C:59
 polytest2.C:60
 polytest2.C:61
 polytest2.C:62
 polytest2.C:63
 polytest2.C:64
 polytest2.C:65
 polytest2.C:66
 polytest2.C:67
 polytest2.C:68
 polytest2.C:69
 polytest2.C:70
 polytest2.C:71
 polytest2.C:72
 polytest2.C:73
 polytest2.C:74
 polytest2.C:75
 polytest2.C:76
 polytest2.C:77
 polytest2.C:78
 polytest2.C:79
 polytest2.C:80
 polytest2.C:81
 polytest2.C:82
 polytest2.C:83
 polytest2.C:84
 polytest2.C:85
 polytest2.C:86
 polytest2.C:87
 polytest2.C:88
 polytest2.C:89
 polytest2.C:90
 polytest2.C:91
 polytest2.C:92
 polytest2.C:93
 polytest2.C:94
 polytest2.C:95
 polytest2.C:96
 polytest2.C:97
 polytest2.C:98
 polytest2.C:99
 polytest2.C:100
 polytest2.C:101
 polytest2.C:102
 polytest2.C:103
 polytest2.C:104
 polytest2.C:105
 polytest2.C:106
 polytest2.C:107
 polytest2.C:108
 polytest2.C:109
 polytest2.C:110
 polytest2.C:111
 polytest2.C:112
 polytest2.C:113
 polytest2.C:114
 polytest2.C:115
 polytest2.C:116
 polytest2.C:117
 polytest2.C:118
 polytest2.C:119
 polytest2.C:120
 polytest2.C:121
 polytest2.C:122
 polytest2.C:123
 polytest2.C:124
 polytest2.C:125
 polytest2.C:126
 polytest2.C:127
 polytest2.C:128
 polytest2.C:129
 polytest2.C:130
 polytest2.C:131
 polytest2.C:132
 polytest2.C:133
 polytest2.C:134
 polytest2.C:135
 polytest2.C:136
 polytest2.C:137
 polytest2.C:138
 polytest2.C:139
 polytest2.C:140
 polytest2.C:141
 polytest2.C:142
 polytest2.C:143
 polytest2.C:144