#include <vector>
using namespace LibBoard;
ShapeList strikeOut(
const Path & path,
double strokeWidth, LineCap lineCap, 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.
isClosed() ? 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 == RoundCap) || (lineJoin == RoundJoin)) {
list << LibBoard::circle(a, strokeWidth * 0.5, Color::Green, Color::Null, strokeWidth * 0.01);
}
}
if ((!path.isClosed() && lineCap == RoundCap) || (lineJoin == RoundJoin)) {
Point a = path[path.size() - 1];
list << LibBoard::circle(a, strokeWidth * 0.5, Color::Green, Color::Null, strokeWidth * 0.01);
}
for (size_t i = 0; i < e.size(); ++i) {
list << LibBoard::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);
Path pA(Path::ClosedPath);
pA << p1 << p2 << p3 << p4 << p5;
Path pB(Path::ClosedPath);
Path pC(Path::ClosedPath);
l.
append(strikeOut(pA, 50.0, RoundCap, MiterJoin, 3.0), ShapeList::Right, ShapeList::AlignCenter, 30.0);
l.
append(strikeOut(pB, 50.0, RoundCap, BevelJoin, 3.0), ShapeList::Right, ShapeList::AlignCenter, 30.0);
l.
append(strikeOut(pC, 50.0, RoundCap, MiterJoin, 3.0), ShapeList::Right, ShapeList::AlignCenter, 30.0);
l.
append(strikeOut(pA, 50.0, RoundCap, 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, ButtCap, MiterJoin, 3.0), ShapeList::Right, ShapeList::AlignCenter, 30.0);
l.
append(strikeOut(pB, 50.0, ButtCap, BevelJoin, 3.0), ShapeList::Right, ShapeList::AlignCenter, 30.0);
l.
append(strikeOut(pC, 50.0, ButtCap, MiterJoin, 3.0), ShapeList::Right, ShapeList::AlignCenter, 30.0);
l.
append(strikeOut(pA, 50.0, ButtCap, 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.
append(strikeOut(pA, 50.0, SquareCap, MiterJoin, 3.0), ShapeList::Right, ShapeList::AlignCenter, 30.0);
l.
append(strikeOut(pB, 50.0, SquareCap, BevelJoin, 3.0), ShapeList::Right, ShapeList::AlignCenter, 30.0);
l.
append(strikeOut(pC, 50.0, SquareCap, MiterJoin, 3.0), ShapeList::Right, ShapeList::AlignCenter, 30.0);
l.
append(strikeOut(pA, 50.0, SquareCap, 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(Path::ClosedPath, Color::Blue, Color::Null, 1.0, SolidStyle, ButtCap, MiterJoin);
list.
append(poly, ShapeList::Right, ShapeList::AlignCenter);
list.
append(poly, ShapeList::Right, ShapeList::AlignCenter);
board.
append(list, ShapeList::Right, ShapeList::AlignCenter);
board.
append(LibBoard::rectangle(0, 0, 100, 30).rotateDeg(40).scale(1.5, 1.0), ShapeList::Right, ShapeList::AlignCenter);
board.
saveEPS(
"stroke_path.eps", Board::A4);
board.
saveSVG(
"stroke_path.svg", Board::BoundingBox, 0.0, Board::UCentimeter);
}