#include #include #include #include #include "studio/geometry.h" #include "picture.h" #include "unreliableobjects.h" static void hpgl(void * const device, const char * const format, ...) { assert(format); va_list arguments = {0}; va_start(arguments, format); (void)output(device, format, arguments); va_end(arguments); } static void line(void * const output, vector moveto, vector lineto, const matrix transformation) { moveto = transform(moveto, transformation); lineto = transform(lineto, transformation); hpgl(output, "PU%5.4f,%5.4fPD%5.4f,%5.4f", moveto.x, moveto.y, lineto.x, lineto.y); } static struct picture draw(void * const output, struct picture image, const matrix position) { image = picture(image); for (size_t number = 0; number < count(image.object); ++number) { const struct object object = image.object[number]; const matrix transformation = concatenate(object.transformation, position); if (object.vectors > 1) { assert(object.vector); for (size_t number = 1; number < object.vectors; ++number) line(output, object.vector[number - 1], object.vector[number], transformation); } } return erase(image); } #define mm * (1.0 / 0.025) int plotter(void * const output, const int image) { if (image < 0 || image > 20) { (void)fprintf(stderr, "[[chaos 1[0 .. 9 sides]] | 20 template]\n"); return 0; } const double linewidth = 1.5; const vector p1 = {.x = 250.0, .y = 279.0}; const vector p2 = {.x = 10250.0, .y = 7479.0}; const matrix page = center(scalar(linewidth * 100.0 mm), add(p1, p2)); hpgl(output, "IN;VS10;PA"); if (image < 10) { (void)draw(output, (struct picture){.sides = image, .chaos = 0, .linewidth = linewidth}, page); } else if (image < 20) { (void)draw(output, (struct picture){.sides = image - 10, .chaos = 1, .linewidth = linewidth}, page); } else { line(output, (vector){.x = 0.0, .y = 0.0}, (vector){.x = 1.0, .y = 0.0}, page); line(output, (vector){.x = 1.0, .y = 0.0}, (vector){.x = 1.0, .y = 1.0}, page); line(output, (vector){.x = 1.0, .y = 1.0}, (vector){.x = 0.0, .y = 1.0}, page); line(output, (vector){.x = 0.0, .y = 1.0}, (vector){.x = 0.0, .y = 0.0}, page); } hpgl(output, "PU0,0;IN;\n", 0); return 1; }