@@ -20,71 +20,83 @@ int main(int argc, char* argv[])
2020 // std::getchar();
2121}
2222
23- void DoSimpleShapes ()
23+ void DoSimpleShapes ()
2424{
25- Paths64 op1, op2;
25+ // OPEN_PATHS SVG:
26+
27+ PathsD op1, op2;
2628 FillRule fr2 = FillRule::EvenOdd;
2729 SvgWriter svg2;
28-
29- op1.push_back (MakePath ({ 80 ,60 , 20 ,20 , 180 ,20 , 180 ,70 , 25 ,150 , 20 ,180 , 180 ,180 }));
30+ op1.push_back (MakePathD ({ 80 ,60 , 20 ,20 , 180 ,20 , 180 ,70 , 25 ,150 , 20 ,180 , 180 ,180 }));
3031 op2 = InflatePaths (op1, 15 , JoinType::Miter, EndType::Square, 3 );
3132 SvgAddOpenSubject (svg2, op1, fr2, false );
32- SvgAddSolution (svg2, TransformPaths< double , int64_t >( op2) , fr2, false );
33+ SvgAddSolution (svg2, op2, fr2, false );
3334 SvgAddCaption (svg2, " Miter Joins; Square Ends" , 20 , 210 );
34-
35- op1 = TranslatePaths<int64_t >(op1, 210 , 0 );
35+ op1 = TranslatePaths<double >(op1, 210 , 0 );
3636 op2 = InflatePaths (op1, 15 , JoinType::Square, EndType::Square);
3737 SvgAddOpenSubject (svg2, op1, fr2, false );
38- SvgAddSolution (svg2, TransformPaths< double , int64_t >( op2) , fr2, false );
38+ SvgAddSolution (svg2, op2, fr2, false );
3939 SvgAddCaption (svg2, " Square Joins; Square Ends" , 230 , 210 );
40-
41- op1 = TranslatePaths<int64_t >(op1, 210 , 0 );
40+ op1 = TranslatePaths<double >(op1, 210 , 0 );
4241 op2 = InflatePaths (op1, 15 , JoinType::Bevel, EndType::Butt, 3 );
4342 SvgAddOpenSubject (svg2, op1, fr2, false );
44- SvgAddSolution (svg2, TransformPaths< double , int64_t >( op2) , fr2, false );
43+ SvgAddSolution (svg2, op2, fr2, false );
4544 SvgAddCaption (svg2, " Bevel Joins; Butt Ends" , 440 , 210 );
46-
47- op1 = TranslatePaths<int64_t >(op1, 210 , 0 );
45+ op1 = TranslatePaths<double >(op1, 210 , 0 );
4846 op2 = InflatePaths (op1, 15 , JoinType::Round, EndType::Round);
4947 SvgAddOpenSubject (svg2, op1, fr2, false );
50- SvgAddSolution (svg2, TransformPaths< double , int64_t >( op2) , fr2, false );
48+ SvgAddSolution (svg2, op2, fr2, false );
5149 SvgAddCaption (svg2, " Round Joins; Round Ends" , 650 , 210 );
52-
5350 SvgSaveToFile (svg2, " open_paths.svg" , 800 , 600 , 20 );
5451 System (" open_paths.svg" );
5552
56- // triangle offset - with large miter
57- Paths64 p, pp;
58- p.push_back (MakePath ({ 30 , 150 , 60 , 350 , 0 , 350 }));
59- pp.insert (pp.end (), p.begin (), p.end ());
53+ // POLYGON JOINTYPES SVG:
6054
55+ // 1. triangle offset - with large miter
56+ int err, scale = 100 ;
57+ PathsD p, solution;
58+ p.push_back (MakePathD ({ 30 ,150 , 60 ,350 , 0 ,350 }));
59+ solution.insert (solution.end (), p.begin (), p.end ());
6160 for (int i = 0 ; i < 5 ; ++i)
6261 {
63- // note the relatively large miter limit set here (10)
64- p = InflatePaths (p, 5 ,
65- JoinType::Miter, EndType::Polygon, 10 );
66- pp.insert (pp.end (), p.begin (), p.end ());
62+ p = InflatePaths (p, 5 , JoinType::Miter, EndType::Polygon, 10 );
63+ solution.insert (solution.end (), p.begin (), p.end ());
6764 }
65+
66+ // 2. open rectangles offset bevelled, squared & rounded ...
6867
69- // rectangle offset - both squared and rounded
7068 p.clear ();
71- p.push_back (MakePath ({ 100 ,30 , 340 ,30 , 340 ,230 , 100 ,230 }));
72- pp.insert (pp.end (), p.begin (), p.end ());
73- // nb: using the ClipperOffest class directly here to control
74- // different join types within the same offset operation
75- ClipperOffset co;
76- co.AddPaths (p, JoinType::Miter, EndType::Joined);
77- p = TranslatePaths<int64_t >(p, 120 , 100 );
78- pp.insert (pp.end (), p.begin (), p.end ());
79- co.AddPaths (p, JoinType::Round, EndType::Joined);
80- co.Execute (10 , p);
81- pp.insert (pp.end (), p.begin (), p.end ());
82-
83- FillRule fr3 = FillRule::EvenOdd;
69+ p.push_back (MakePathD ({ 100 ,30 , 340 ,30 , 340 ,230 , 100 ,230 }));
70+ p.push_back (TranslatePath<double >(p[0 ], 60 , 50 ));
71+ p.push_back (TranslatePath<double >(p[1 ], 60 , 50 ));
72+
8473 SvgWriter svg;
85- SvgAddSolution (svg, TransformPaths<double , int64_t >(pp), fr3, false );
86- SvgSaveToFile (svg, " solution_off.svg" , 800 , 600 , 20 );
87- System (" solution_off.svg" );
74+ SvgAddOpenSubject (svg, p);
75+ SvgAddCaption (svg, " Bevelled" , 100 , 15 );
76+ SvgAddCaption (svg, " Squared" , 160 , 65 );
77+ SvgAddCaption (svg, " Rounded" , 220 , 115 );
78+
79+ // nb: we must use the ClipperOffest class directly if we want to
80+ // perform different join types within the same offset operation
81+ // ClipperOffset only supports int64_t coords so, if we want better than unit
82+ // precision, we have to scale manually. (InflatePaths does this scaling internally)
83+ ClipperOffset co;
84+ p = ScalePaths<double , double >(p, scale, err);
85+ // AddPaths - paths must be int64_t paths
86+ co.AddPath (TransformPath<int64_t , double >(p[0 ]), JoinType::Bevel, EndType::Joined);
87+ co.AddPath (TransformPath<int64_t , double >(p[1 ]), JoinType::Square, EndType::Joined);
88+ co.AddPath (TransformPath<int64_t , double >(p[2 ]), JoinType::Round, EndType::Joined);
89+ Paths64 sol64;
90+ co.Execute (scale * 10 , sol64); // ClipperOffset solutions must be int64_t
91+
92+ // de-scale and append to solution ...
93+ p = ScalePaths<double , int64_t >(sol64, 1.0 / scale, err);
94+ solution.insert (solution.end (), p.begin (), p.end ());
95+
96+ string filename = " polygon_jointypes.svg" ;
97+ SvgAddSolution (svg, solution, FillRule::EvenOdd, false );
98+ SvgSaveToFile (svg, filename, 800 , 600 , 20 );
99+ System (filename);
88100}
89101
90102void DoRabbit ()
0 commit comments