It reduces the number of polygon's vertices using actual pixel coordinates.
#include <cassert>
#include <vector>
public:
PolyTest2();
private:
enum TestSize {
kNSawPoints = 10000
};
std::vector<Double_t> fXs1;
std::vector<Double_t> fYs1;
std::vector<Double_t> fXs2;
std::vector<Double_t> fYs2;
};
PolyTest2::PolyTest2()
:
TNamed(
"polygon_compression_test2",
"polygon_compression_test2")
{
assert(
gPad != 0 &&
"PolyTest2, gPad is null");
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");
const unsigned nVertices = 3 + kNSawPoints;
{
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) {
fYs1[i] = yMin + yStep * (i - 1);
}
fXs1[nVertices - 2] = 0.;
fYs1[nVertices - 2] = yMax;
fXs1[nVertices - 1] = fXs1[0];
fYs1[nVertices - 1] = fYs1[0];
}
{
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;
}
fXs2[nVertices - 2] = xMax;
fYs2[nVertices - 2] = 0.;
fXs2[nVertices - 1] = fXs2[0];
fYs2[nVertices - 1] = fYs2[0];
}
}
void PolyTest2::Paint(
const Option_t * )
{
assert(
gPad != 0 &&
"Paint, gPad is null");
gPad->PaintFillArea((
Int_t)fXs1.size(), &fXs1[0], &fYs1[0]);
gPad->PaintPolyLine((
Int_t)fXs1.size(), &fXs1[0], &fYs1[0]);
gPad->PaintFillArea((
Int_t)fXs2.size(), &fXs2[0], &fYs2[0]);
gPad->PaintPolyLine((
Int_t)fXs2.size(), &fXs2[0], &fYs2[0]);
}
void polytest2()
{
PolyTest2 * polygon = new PolyTest2;
polygon->Draw();
}