Monet is a header-only C++11 graphics library with no 3rd-party dependencies to create vector graphics. Download the file include/monet.h and put it alongside you source files to use it—no need to change your Makefile!
The library is licensed using the MIT license. See the file LICENSE.md for further information.
Documentation is available at https://ziotom78.github.io/monet/
#include "monet.h"
using namespace monet;
int main() {
SVGCanvas canv{"simple.svg", 100, 100};
// Clear the image with a soft gray
canv.setfillcolor(gray(0.9));
canv.rectangle(Point{0, 0},
Point{canv.getwidth(), canv.getheight()}, Action::Fill);
// Create a closed path
canv.moveto(Point{0, 0});
canv.lineto(Point{100, 0});
canv.lineto(Point{100, 100});
canv.closepath();
canv.strokepath();
}Save the program in a file simple.cpp, download the file include/monet.h and put it in the same folder as simple.cpp, and compile with the following command:
c++ -o simple simple.cpp
When the program is ran, it will create the image file simple.svg:
Let's draw a spirograph pattern!
#include <cmath>
#include <monet.h>
using namespace std;
using namespace monet;
Point spirograph(double small_r, double large_r, double a, double t) {
double r_diff{large_r - small_r};
double r_ratio{small_r / large_r};
return Point{r_diff * cos(r_ratio * t) + a * cos((1 - r_ratio) * t),
r_diff * sin(r_ratio * t) - a * sin((1 - r_ratio) * t)};
}
int main() {
SVGCanvas canv{"spirograph.svg", 500, 500};
// Clear the image with a soft gray color
canv.setfillcolor(gray(0.9));
canv.rectangle(Point{0, 0}, Point{canv.getwidth(), canv.getheight()},
Action::Fill);
Point center{canv.getwidth() / 2, canv.getheight() / 2};
// Draw the spirograph
const double small_r{42};
const double large_r{188};
const double a{75};
const double tmax{1000};
const double delta_t{0.1};
Point old_point{center + spirograph(small_r, large_r, a, 0)};
for (double t{delta_t}; t < tmax; t += delta_t) {
Point new_point{center + spirograph(small_r, large_r, a, t)};
// By smoothly increasing the hue in the call to `hsl`, we're
// iterating over all the colors of the rainbow
canv.setstrokecolor(hsl(t / tmax, 1.0, 0.4));
canv.line(old_point, new_point);
canv.strokepath();
old_point = new_point;
}
}#include "monet.h"
using namespace monet;
int main() {
SVGCanvas canv{"complex.svg", 500, 500};
// Create a closed path
canv.moveto(Point{});
canv.lineto(Point{100, 0});
canv.lineto(Point{100, 100});
canv.closepath();
canv.strokepath();
// Paths can be stroked and filled at the same time
canv.setfillcolor(Color{0.8, 0.7, 0.3});
canv.setstrokecolor(brown);
canv.setstrokewidth(3.0);
canv.circle(Point{200, 200}, 150, Action::FillAndStroke);
// You can specify colors using HSL
canv.setstrokecolor(hsl(0.2, 0.5, 0.4));
canv.setstrokewidth(8.0);
canv.rectangle(Point{400, 100}, Point{500, 150}, Action::Stroke);
// You can group graphical elements (useful if you plan to
// open the SVG in a vector graphics program like Inkscape)
canv.begingroup(TransformSequence{translate(Point{300, 250})});
{
Point textpoint{Point{0, 0}};
canv.setfontsize(48);
canv.setfontfamily(FontFamily::Monospaced);
canv.setfillcolor(black);
canv.text(textpoint, "Hello, world!", HorizontalAlignment::Center,
VerticalAlignment::Bottom);
// Highlight the pivot of the text element by
// drawing a small circle around it
canv.setfillcolor(red);
canv.circle(textpoint, 5, Action::Fill);
}
canv.endgroup();
}The program produces the following output:
The manual is available at ziotom78.github.io/monet/.