You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
134 lines
3.3 KiB
C++
134 lines
3.3 KiB
C++
|
1 month ago
|
#include <cstdlib>
|
||
|
|
#include <string>
|
||
|
|
#include <chrono>
|
||
|
|
|
||
|
|
#include "clipper2/clipper.h"
|
||
|
|
#include "../../Utils/clipper.svg.utils.h"
|
||
|
|
#include "../../Utils/ClipFileLoad.h"
|
||
|
|
#include "../../Utils/ClipFileSave.h"
|
||
|
|
#include "../../Utils/Timer.h"
|
||
|
|
|
||
|
|
using namespace Clipper2Lib;
|
||
|
|
|
||
|
|
const int display_width = 800, display_height = 600;
|
||
|
|
|
||
|
|
void RecheckLastBenchmark(bool use_polytree);
|
||
|
|
void DoBenchmark(int edge_cnt_start, int edge_cnt_end,
|
||
|
|
int increment, bool test_polytree = false);
|
||
|
|
Path64 MakeRandomPoly(int width, int height, unsigned vertCnt);
|
||
|
|
void System(const std::string &filename);
|
||
|
|
|
||
|
|
int main()
|
||
|
|
{
|
||
|
|
bool test_polytree = false;//true;//
|
||
|
|
srand((unsigned)time(0));
|
||
|
|
DoBenchmark(1000, 7000, 1000, test_polytree);
|
||
|
|
//RecheckLastBenchmark(test_polytree);
|
||
|
|
|
||
|
|
std::cout << std::endl;
|
||
|
|
//#ifdef _DEBUG
|
||
|
|
std::string s;
|
||
|
|
std::cout << "Press Enter to continue" << std::endl;
|
||
|
|
std::getline(std::cin, s);
|
||
|
|
//#endif
|
||
|
|
return 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
void RecheckLastBenchmark(bool use_polytree)
|
||
|
|
{
|
||
|
|
ClipType ct;
|
||
|
|
FillRule fr;
|
||
|
|
|
||
|
|
Paths64 subject, subj_open, clip, solution;
|
||
|
|
int64_t area, count;
|
||
|
|
PolyTree64 polytree;
|
||
|
|
|
||
|
|
std::ifstream test("benchmark_test.txt");
|
||
|
|
if (!test.good())
|
||
|
|
{
|
||
|
|
std::cout << "Unable to find or open test file." << std::endl;
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
bool success = false;
|
||
|
|
std::cout << "Checking last benchmark ..." << std::endl;
|
||
|
|
LoadTestNum(test, 1, subject, subj_open, clip, area, count, ct, fr);
|
||
|
|
if (use_polytree)
|
||
|
|
{
|
||
|
|
BooleanOp(ct, fr, subject, clip, polytree);
|
||
|
|
success = polytree.Count();
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
solution = BooleanOp(ct, fr, subject, clip);
|
||
|
|
success = solution.size();
|
||
|
|
}
|
||
|
|
if (success)
|
||
|
|
std::cout << "It's OK." << std::endl;
|
||
|
|
else
|
||
|
|
std::cout << "It failed (again)." << std::endl;
|
||
|
|
}
|
||
|
|
|
||
|
|
inline Path64 MakeRandomPoly(int width, int height, unsigned vertCnt)
|
||
|
|
{
|
||
|
|
Path64 result;
|
||
|
|
result.reserve(vertCnt);
|
||
|
|
for (unsigned i = 0; i < vertCnt; ++i)
|
||
|
|
result.push_back(Point64(rand() % width, rand() % height));
|
||
|
|
return result;
|
||
|
|
}
|
||
|
|
|
||
|
|
void DoBenchmark(int edge_cnt_start, int edge_cnt_end,
|
||
|
|
int increment, bool test_polytree)
|
||
|
|
{
|
||
|
|
ClipType ct = ClipType::Intersection;
|
||
|
|
FillRule fr = FillRule::NonZero;//EvenOdd;//Positive;//
|
||
|
|
|
||
|
|
Paths64 subject, clip, solution;
|
||
|
|
PolyTree64 polytree;
|
||
|
|
std::cout << std::endl << "Complex Polygons Benchmark: " << std::endl;
|
||
|
|
for (int i = edge_cnt_start; i <= edge_cnt_end; i += increment)
|
||
|
|
{
|
||
|
|
subject.clear();
|
||
|
|
clip.clear();
|
||
|
|
subject.push_back(MakeRandomPoly(800, 600, i));
|
||
|
|
clip.push_back(MakeRandomPoly(800, 600, i));
|
||
|
|
SaveTest( "benchmark_test.txt", false, &subject, nullptr, &clip, 0, 0, ct, fr);
|
||
|
|
|
||
|
|
std::cout << "Edge Count: " << i << " = ";
|
||
|
|
{
|
||
|
|
if (test_polytree)
|
||
|
|
{
|
||
|
|
polytree.Clear();
|
||
|
|
Timer t;
|
||
|
|
BooleanOp(ct, fr, subject, clip, polytree);
|
||
|
|
if (!polytree.Count()) break;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
Timer t;
|
||
|
|
solution = BooleanOp(ct, fr, subject, clip);
|
||
|
|
if (solution.empty()) break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
if (test_polytree) solution = PolyTreeToPaths64(polytree);
|
||
|
|
|
||
|
|
SvgWriter svg;
|
||
|
|
SvgAddSubject(svg, subject, fr);
|
||
|
|
SvgAddClip(svg, clip, fr);
|
||
|
|
SvgAddSolution(svg, solution, fr, false);
|
||
|
|
SvgSaveToFile(svg, "solution3.svg", display_width, display_height, 20);
|
||
|
|
System("solution3.svg");
|
||
|
|
}
|
||
|
|
|
||
|
|
void System(const std::string &filename)
|
||
|
|
{
|
||
|
|
#ifdef _WIN32
|
||
|
|
system(filename.c_str());
|
||
|
|
#else
|
||
|
|
system(("firefox " + filename).c_str());
|
||
|
|
#endif
|
||
|
|
}
|