#include <cstdlib>
#include <cmath>
#include <limits>
#include <vector>
#include <cassert>
double strokeWidth,
Shape::LineCap lineCap,
Shape::LineJoin lineJoin,
double miterLimit = 4.0 )
{
const double s = 1.0;
std::vector<Point> e = Tools::pathBoundaryPoints(path,strokeWidth,lineCap, lineJoin, miterLimit );
size_t limit = (path.
closed()?path.
size():(path.size()-1));
for ( size_t i = 0; i < limit; ++i ) {
Point b = path[(i+1)%path.size()];
list <<
Line(a+shift,b+shift,Color::Black,strokeWidth*0.01).
scale(s);
list <<
Line(a-shift,b-shift,Color::Black,strokeWidth*0.01).
scale(s);
list <<
Line(a,b,Color::Red,strokeWidth*0.01);
if ( (lineCap == Shape::RoundCap) || (lineJoin == Shape::RoundJoin)) {
list <<
Circle(a,strokeWidth*0.5,Color::Green,Color::Null,strokeWidth*0.01);
}
}
if ( (!path.closed() && lineCap == Shape::RoundCap) || (lineJoin == Shape::RoundJoin) ) {
Point a = path[path.size()-1];
list <<
Circle(a,strokeWidth*0.5,Color::Green,Color::Null,strokeWidth*0.01);
}
for ( size_t i = 0; i < e.size(); ++i ) {
list <<
Circle(c,10.0,Color::Blue,Color::Null,strokeWidth*0.01);
list <<
Line(c-
Point(10.0,0.0), c+
Point(10.0,0),Color::Blue,strokeWidth*0.01);
list << Line(c-
Point(0.0,10.0), c+
Point(0,10.0),Color::Blue,strokeWidth*0.01);
}
return list;
}
int main( int , char *[] )
{
board.
clear( Color::White);
pA<<p1<<p2<<p3<<p4<<p5;
l.
append( strikeOut(pA,50.0,Shape::RoundCap,Shape::MiterJoin, 3.0 ),
ShapeList::Right, ShapeList::AlignCenter, 30.0 );
l.
append( strikeOut(pB,50.0,Shape::RoundCap,Shape::BevelJoin, 3.0 ),
ShapeList::Right, ShapeList::AlignCenter, 30.0 );
l.
append( strikeOut(pC,50.0,Shape::RoundCap,Shape::MiterJoin, 3.0 ),
ShapeList::Right, ShapeList::AlignCenter, 30.0 );
l.
append( strikeOut(pA,50.0,Shape::RoundCap,Shape::RoundJoin, 3.0 ),
ShapeList::Right, ShapeList::AlignCenter, 30.0 );
l.
append(
Text(0,0,
"Round cap, miter/bevel/miter/round join",Fonts::Courier,14.0),ShapeList::Right,ShapeList::AlignCenter);
board.
append(l,ShapeList::Bottom,ShapeList::AlignLeft);
l.
append( strikeOut(pA,50.0,Shape::ButtCap,Shape::MiterJoin, 3.0 ),
ShapeList::Right, ShapeList::AlignCenter, 30.0 );
l.
append( strikeOut(pB,50.0,Shape::ButtCap,Shape::BevelJoin, 3.0 ),
ShapeList::Right, ShapeList::AlignCenter, 30.0 );
l.
append( strikeOut(pC,50.0,Shape::ButtCap,Shape::MiterJoin, 3.0 ),
ShapeList::Right, ShapeList::AlignCenter, 30.0 );
l.
append( strikeOut(pA,50.0,Shape::ButtCap,Shape::RoundJoin, 3.0 ),
ShapeList::Right, ShapeList::AlignCenter, 30.0 );
l.
append(
Text(0,0,
"Butt cap, miter/bevel/miter/round join",Fonts::Courier,14.0),ShapeList::Right,ShapeList::AlignCenter);
board.
append(l,ShapeList::Bottom,ShapeList::AlignLeft);
l.clear();
l.
append( strikeOut(pA,50.0,Shape::SquareCap,Shape::MiterJoin, 3.0 ),
ShapeList::Right, ShapeList::AlignCenter, 30.0 );
l.
append( strikeOut(pB,50.0,Shape::SquareCap,Shape::BevelJoin, 3.0 ),
ShapeList::Right, ShapeList::AlignCenter, 30.0 );
l.
append( strikeOut(pC,50.0,Shape::SquareCap,Shape::MiterJoin, 3.0 ),
ShapeList::Right, ShapeList::AlignCenter, 30.0 );
l.
append( strikeOut(pA,50.0,Shape::SquareCap,Shape::RoundJoin, 3.0 ),
ShapeList::Right, ShapeList::AlignCenter, 30.0 );
l.
append(
Text(0,0,
"Square cap, miter/bevel/miter/round join",Fonts::Courier,14.0),ShapeList::Right,ShapeList::AlignCenter);
board.
append(l,ShapeList::Bottom,ShapeList::AlignLeft);
Polyline poly(
true,Color::Blue,Color::Null,1.0,Shape::SolidStyle,Shape::ButtCap,Shape::MiterJoin);
list.
append(poly,ShapeList::Right,ShapeList::AlignCenter);
list.
append(poly,ShapeList::Right,ShapeList::AlignCenter);
board.
append(list,ShapeList::Right,ShapeList::AlignCenter);
ShapeList::Right,ShapeList::AlignCenter);
board.
saveEPS(
"stroke_path.eps" , Board::A4 );
board.
saveSVG(
"stroke_path.svg", Board::BoundingBox, 0.0, Board::UCentimeter );
}