diff options
author | Mattias Andrée <maandree@kth.se> | 2023-02-05 09:31:10 +0100 |
---|---|---|
committer | Mattias Andrée <maandree@kth.se> | 2023-02-05 09:31:10 +0100 |
commit | bd0bed7feb76a87148fb62e4c3cd19c862a2b01f (patch) | |
tree | 52e6c7ddd5ee037cd157e5029494ea4200c08ee4 | |
parent | First commit (diff) | |
download | librifunktionsteckensnittsglyfrasteriseringsprogrambiblioteket-bd0bed7feb76a87148fb62e4c3cd19c862a2b01f.tar.gz librifunktionsteckensnittsglyfrasteriseringsprogrambiblioteket-bd0bed7feb76a87148fb62e4c3cd19c862a2b01f.tar.bz2 librifunktionsteckensnittsglyfrasteriseringsprogrambiblioteket-bd0bed7feb76a87148fb62e4c3cd19c862a2b01f.tar.xz |
Add rtgrpblib_draw_circular_arc
Signed-off-by: Mattias Andrée <maandree@kth.se>
-rw-r--r-- | Makefile | 1 | ||||
-rw-r--r-- | demo.c | 21 | ||||
-rw-r--r-- | librifunktionsteckensnittsglyfrasteriseringsprogrambiblioteket.h | 7 | ||||
-rw-r--r-- | rtgrpblib_draw_circular_arc.c | 48 |
4 files changed, 75 insertions, 2 deletions
@@ -21,6 +21,7 @@ OBJ =\ lines.o\ sorting.o\ rtgrpblib_create_raster.o\ + rtgrpblib_draw_circular_arc.o\ rtgrpblib_draw_linear_bezier.o\ rtgrpblib_draw_quadratic_bezier.o\ rtgrpblib_draw_cubic_bezier.o\ @@ -26,11 +26,16 @@ main(void) {35, 15}, {20, 25}, {5, 15} -#else +#elif 0 {5.25, 5.25}, {35.75, 5.25}, {35.75, 25.75}, {5.25, 25.75} +#else + /* for circular arch*/ + {20, 15}, + {15, 10}, + {100 * M_PI/180, 400 * M_PI/180} #endif }; @@ -46,9 +51,21 @@ main(void) #elif 0 rtgrpblib_draw_quadratic_bezier(raster, P(2), P(3), P(0)); rtgrpblib_draw_linear_bezier(raster, P(0), P(2)); -#else +#elif 0 rtgrpblib_draw_cubic_bezier(raster, P(0), P(1), P(2), P(3)); rtgrpblib_draw_linear_bezier(raster, P(3), P(0)); +#else + rtgrpblib_draw_circular_arc(raster, P(0), P(1), P(2)); + rtgrpblib_draw_linear_bezier(raster, + points[0].x + points[1].x * cos(points[2].y), + points[0].y + points[1].y * sin(points[2].y), + points[0].x, + points[0].y); + rtgrpblib_draw_linear_bezier(raster, + points[0].x, + points[0].y, + points[0].x + points[1].x * cos(points[2].x), + points[0].y + points[1].y * sin(points[2].x)); #endif rtgrpblib_fill_shapes(image, width, raster); diff --git a/librifunktionsteckensnittsglyfrasteriseringsprogrambiblioteket.h b/librifunktionsteckensnittsglyfrasteriseringsprogrambiblioteket.h index 0fceece..fffeae7 100644 --- a/librifunktionsteckensnittsglyfrasteriseringsprogrambiblioteket.h +++ b/librifunktionsteckensnittsglyfrasteriseringsprogrambiblioteket.h @@ -30,4 +30,11 @@ void rtgrpblib_draw_cubic_bezier(RTGRPBLIB_RASTER *restrict raster, double x3, double y3, double x4, double y4); +void rtgrpblib_draw_circular_arc(RTGRPBLIB_RASTER *restrict raster, + double x0, double y0, + double semiwidth, double semiheight, + double start, double end); + +/* TODO add support for outlining */ + #endif diff --git a/rtgrpblib_draw_circular_arc.c b/rtgrpblib_draw_circular_arc.c new file mode 100644 index 0000000..f30fde7 --- /dev/null +++ b/rtgrpblib_draw_circular_arc.c @@ -0,0 +1,48 @@ +/* See LICENSE file for copyright and license details. */ +#include "common.h" +#ifndef TEST + + +void +rtgrpblib_draw_circular_arc(RASTER *restrict raster, double x0, double y0, + double semiwidth, double semiheight, double start, double end) +{ + double inc, v, x, y, prevX, prevY; + + if (start == end) + return; + + /* TODO precalculate intersection with raster box */ + + inc = fmax(semiwidth, semiheight); + inc *= 2 * M_PI; + inc *= end - start; + inc = raster->draftness / inc; + + v = start; + prevX = x0 + semiwidth * cos(start); + prevY = y0 + semiheight * sin(start); + + for (; (v += inc) < end; prevX = x, prevY = y) { + x = x0 + semiwidth * cos(v); + y = y0 + semiheight * sin(v); + rtgrpblib_draw_linear_bezier(raster, prevX, prevY, x, y); + } + + x = x0 + semiwidth * cos(end); + y = y0 + semiheight * sin(end); + rtgrpblib_draw_linear_bezier(raster, prevX, prevY, x, y); +} + + +#else + + +int +main(void) +{ + return 0; /* TODO add test */ +} + + +#endif |