diff options
Diffstat (limited to 'web/svg_dartboard.c')
-rw-r--r-- | web/svg_dartboard.c | 256 |
1 files changed, 0 insertions, 256 deletions
diff --git a/web/svg_dartboard.c b/web/svg_dartboard.c deleted file mode 100644 index 1125ef0..0000000 --- a/web/svg_dartboard.c +++ /dev/null @@ -1,256 +0,0 @@ -#include "board.h" -#include "comp.h" - -#include <stdlib.h> -#include <string.h> -#include <stdio.h> - -#include <emscripten/emscripten.h> - -#define NUM_SECTORS 20 -#define SECTOR_WIDTH 18.0 - -#define C_BLACK "#272b2c" -#define C_WHITE "#fbe3ba" -#define C_RED "#f6302f" -#define C_GREEN "#22912d" -#define C_WIRE "#909ca0" -#define C_WIRE_INNER "#d8e6ec" - -struct elem { - char *name; - int n_attrs; - int size_attrs; - char **attr_names; - char **attr_vals; - char *content; -}; - -struct elem *elem_init(char *name, int size_attrs) -{ - struct elem *e = malloc(sizeof(*e)); - - size_t size = strlen(name) + 1; - e->name = malloc(size * sizeof(*(e->name))); - memcpy(e->name, name, size); - - e->n_attrs = 0; - e->size_attrs = size_attrs; - e->attr_names = malloc(size_attrs * sizeof(*(e->attr_names))); - e->attr_vals = malloc(size_attrs * sizeof(*(e->attr_vals))); - e->content = NULL; - - return e; -} - -void elem_free(struct elem *e) -{ - for(int i = 0; i < e->n_attrs; ++i) { - free(e->attr_names[i]); - free(e->attr_vals[i]); - } - - free(e->content); - free(e->attr_names); - free(e->attr_vals); - free(e->name); - free(e); -} - -void elem_add_attr(struct elem *e, char *name, char *val) -{ - if (e->n_attrs == e->size_attrs) { - e->size_attrs *= 2; - e->attr_names = realloc(e->attr_names, - e->size_attrs * sizeof(*(e->attr_names))); - e->attr_vals = realloc(e->attr_vals, - e->size_attrs * sizeof(*(e->attr_vals))); - } - - size_t size = strlen(name) + 1; - e->attr_names[e->n_attrs] = malloc(size); - memcpy(e->attr_names[e->n_attrs], name, size); - - size = strlen(val) + 1; - e->attr_vals[e->n_attrs] = malloc(size); - memcpy(e->attr_vals[e->n_attrs++], val, size); -} - -void elem_add_attr_double(struct elem *e, char *name, double val) -{ - char str[512]; - sprintf(str, "%f", val); - elem_add_attr(e, name, str); -} - -// draws a ring if angles are equal -struct elem *gen_arc(double a1, double a2, double r1, double r2, char *col) -{ - struct ccoords cc1 = pol_to_cart((struct pcoords){ - .a = (a1 == a2 ? 1 : a2), .r = r1 }); - struct ccoords cc2 = pol_to_cart((struct pcoords){ - .a = (a1 == a2 ? 0 : a1), .r = r1 }); - struct ccoords cc3 = pol_to_cart((struct pcoords){ - .a = (a1 == a2 ? 0 : a1), .r = r2 }); - struct ccoords cc4 = pol_to_cart((struct pcoords){ - .a = (a1 == a2 ? 1 : a2), .r = r2 }); - - struct elem *e = elem_init("path", 2); - elem_add_attr(e, "fill", col); - - char buf[512]; - int buflen = 0; - buflen += sprintf(buf + buflen, "M%f %f", cc1.x, cc1.y); - buflen += sprintf(buf + buflen, "A%f %f 0 0 0 %f %f", - r1, r1, cc2.x, cc2.y); - if (a1 == a2) - buflen += sprintf(buf + buflen, "A%f %f 0 1 0 %f %f", - r1, r1, cc1.x, cc1.y); - buflen += sprintf(buf + buflen, "L%f %f", cc3.x, cc3.y); - buflen += sprintf(buf + buflen, "A%f %f 0 0 1 %f %f", - r2, r2, cc4.x, cc4.y); - if (a1 == a2) - buflen += sprintf(buf + buflen, "A%f %f 0 1 1 %f %f", - r2, r2, cc3.x, cc3.y); - buf[buflen++] = 'Z'; - buf[buflen++] = 0; - elem_add_attr(e, "d", buf); - - return e; -} - -struct elem *gen_segment(double a, double r1, double r2, char *col) -{ - return gen_arc(a - SECTOR_WIDTH/2, a + SECTOR_WIDTH/2, r1, r2, col); -} - -struct elem *gen_ring(double r, double w, char *col) -{ - return gen_arc(0, 0, r - w/2, r + w/2, col); -} - -struct elem *gen_circle(double r, char *col) -{ - struct elem *e = elem_init("circle", 2); - elem_add_attr(e, "fill", col); - elem_add_attr_double(e, "r", r); - - return e; -} - -struct elem *gen_line(double a, double r1, double r2, double w, char *col) -{ - struct ccoords cc1 = pol_to_cart((struct pcoords){ .a = a, .r = r1 }); - struct ccoords cc2 = pol_to_cart((struct pcoords){ .a = a, .r = r2 }); - - struct elem *e = elem_init("line", 6); - elem_add_attr(e, "stroke", col); - elem_add_attr_double(e, "x1", cc1.x); - elem_add_attr_double(e, "y1", cc1.y); - elem_add_attr_double(e, "x2", cc2.x); - elem_add_attr_double(e, "y2", cc2.y); - elem_add_attr_double(e, "stroke-width", w); - - return e; -} - -int draw_spider(int elemc, struct elem **elemv) -{ - for (int i = 5; i > 1; --i) { - elemv[elemc++] = gen_ring(OUTER_DISTS[i], WIRE_WIDTH, C_WIRE); - elemv[elemc++] = gen_ring(OUTER_DISTS[i], WIRE_WIDTH/2, C_WIRE_INNER); - } - - for (int i = 0; i < NUM_SECTORS; ++i) { - double a = 90 - i*SECTOR_WIDTH - SECTOR_WIDTH/2; - if (a < 0) a += 360; - - elemv[elemc++] = gen_line(a, OUTER_DISTS[1], OUTER_DISTS[5] + 10, - WIRE_WIDTH, C_WIRE); - elemv[elemc++] = gen_line(a, OUTER_DISTS[1], OUTER_DISTS[5] + 10, - WIRE_WIDTH/2, C_WIRE_INNER); - } - - for (int i = 1; i >= 0; --i) { - elemv[elemc++] = gen_ring(OUTER_DISTS[i], WIRE_WIDTH, C_WIRE); - elemv[elemc++] = gen_ring(OUTER_DISTS[i], WIRE_WIDTH/2, C_WIRE_INNER); - } - - return elemc; -} - -int draw_numbers(int elemc, struct elem **elemv) -{ - elemv[elemc++] = gen_ring(DIAMETER/2 - WIRE_WIDTH*4, WIRE_WIDTH, "#ddd"); - - int r = DIAMETER/2 - 33/2; - for (int i = 0; i < 20; ++i) { - struct elem *e = elemv[elemc++] = elem_init("text", 5); - elem_add_attr(e, "font-size", "33"); - elem_add_attr(e, "fill", "#fff"); - elem_add_attr(e, "text-anchor", "middle"); - elem_add_attr(e, "dominant-baseline", "central"); - - char buf[512]; - double a = 90 - i*SECTOR_WIDTH; - if (a < 0) a += 360; - struct ccoords cc = pol_to_cart((struct pcoords){ .a = a, .r = r }); - sprintf(buf, "scale(1 -1) translate(%f %f) rotate(%f)", - cc.x, -cc.y, a <= 180 ? 90 -a : 270 -a); - elem_add_attr(e, "transform", buf); - - e->content = malloc(3); - sprintf(e->content, "%d", SECTORS[i]); - } - - return elemc; -} - -void draw_elemv(int layer, int elemc, struct elem **elemv) -{ - EM_ASM({svgDrawElemv($0, $1, $2, $3, $4, $5, $6, $7)}, - layer, elemc, elemv, - offsetof(struct elem, name), offsetof(struct elem, n_attrs), - offsetof(struct elem, attr_names), offsetof(struct elem, attr_vals), - offsetof(struct elem, content)); -} - -void draw_board() -{ - struct elem **elemv = malloc(500 * sizeof(*elemv)); - int elemc = 0; - - elemv[elemc++] = gen_circle(DIAMETER/2, C_BLACK); - - for (int i = 5; i > 1; --i) { - for (int j = 0; j < NUM_SECTORS; ++j) { - double a = 90 - j*SECTOR_WIDTH; - if (a < 0) a += 360; - elemv[elemc++] = gen_segment(a, OUTER_DISTS[i-1], OUTER_DISTS[i], - i%2 ? (j%2 ? C_GREEN : C_RED) : (j%2 ? C_WHITE : C_BLACK)); - } - } - - elemv[elemc++] = gen_circle(OUTER_DISTS[1], C_GREEN); - elemv[elemc++] = gen_circle(OUTER_DISTS[0], C_RED); - - elemc = draw_spider(elemc, elemv); - elemc = draw_numbers(elemc, elemv); - - draw_elemv(0, elemc, elemv); - - for (int i = 0; i < elemc; ++i) - free(elemv[i]); - free(elemv); -} - -void draw_point(double x, double y) { - struct elem *e = gen_circle(8, "#33f"); - elem_add_attr(e, "stroke", "#ff0"); - elem_add_attr(e, "stroke-width", "2"); - elem_add_attr_double(e, "cx", x); - elem_add_attr_double(e, "cy", y); - - draw_elemv(1, 1, &e); - elem_free(e); -} |