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.

113 lines
2.8 KiB
C++

1 month ago
#include <cstdlib>
#include "clipper2/clipper.h"
#include "../../Utils/clipper.svg.h"
#include "../../Utils/clipper.svg.utils.h"
using namespace std;
using namespace Clipper2Lib;
void System(const std::string &filename);
void TestingZ_Int64();
void TestingZ_Double();
// use the Z callback to flag intersections by setting z = 1;
class MyClass {
public:
// Point64 callback - see TestingZ_Int64()
void myZCB(const Point64& e1bot, const Point64& e1top,
const Point64& e2bot, const Point64& e2top, Point64& pt)
{
pt.z = 1;
}
// PointD callback - see TestingZ_Double()
void myZCBD(const PointD& e1bot, const PointD& e1top,
const PointD& e2bot, const PointD& e2top, PointD& pt)
{
pt.z = 1;
}
};
int main(int argc, char* argv[])
{
//TestingZ_Int64();
TestingZ_Double();
}
void TestingZ_Int64()
{
Paths64 subject, solution;
MyClass mc;
Clipper64 c64;
subject.push_back(MakePath({ 100, 50, 10, 79, 65, 2, 65, 98, 10, 21 }));
c64.AddSubject(subject);
c64.SetZCallback(
std::bind(&MyClass::myZCB, mc, std::placeholders::_1,
std::placeholders::_2, std::placeholders::_3,
std::placeholders::_4, std::placeholders::_5));
c64.Execute(ClipType::Union, FillRule::NonZero, solution);
SvgWriter svg;
SvgAddSolution(svg, solution, FillRule::NonZero, false);
if (solution.size() > 0) {
// draw circles around intersection points - flagged by z == 1
PathsD ellipses;
double r = 3.0;
for (const Point64& pt : solution[0])
if (pt.z == 1)
{
ellipses.push_back(Ellipse(RectD(pt.x - r, pt.y - r, pt.x + r, pt.y + r), 11));
}
SvgAddClip(svg, ellipses, FillRule::NonZero);
}
SvgSaveToFile(svg, "usingz_int64.svg", 800, 600, 20);
System("usingz_int64.svg");
}
void TestingZ_Double()
{
PathsD subject, solution;
MyClass mc;
ClipperD c;
subject.push_back(MakePathD({ 100, 50, 10, 79, 65, 2, 65, 98, 10, 21 }));
c.AddSubject(subject);
c.SetZCallback(
std::bind(&MyClass::myZCBD, mc, std::placeholders::_1,
std::placeholders::_2, std::placeholders::_3,
std::placeholders::_4, std::placeholders::_5));
c.Execute(ClipType::Union, FillRule::NonZero, solution);
SvgWriter svg;
SvgAddSubject(svg, subject, FillRule::NonZero);
if (solution.size() > 0)
{
// draw circles around intersection points
PathsD ellipses;
double r = 3.0;
for (const PointD& pt : solution[0])
if (pt.z == 1)
ellipses.push_back(Ellipse(RectD(pt.x - r, pt.y - r,
pt.x + r, pt.y + r), 11));
SvgAddSolution(svg, ellipses, FillRule::NonZero, false);
}
SvgSaveToFile(svg, "usingz_double.svg", 320, 320, 0);
System("usingz_double.svg");
}
void System(const std::string &filename)
{
#ifdef _WIN32
system(filename.c_str());
#else
system(("firefox " + filename).c_str());
#endif
}