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++
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
|
||
|
|
}
|