#ifndef BOARD_H #define BOARD_H #include // board spec from WDF rules #define WIRE_WIDTH 1.56 #define INNER_DIAMETER_BULL 12.7 #define INNER_DIAMETER_25 31.8 #define DOUBLE_OUTER_EDGE 170.0 #define TREBLE_OUTER_EDGE 107.4 #define DOUBLE_INSIDE_WIDTH 8.0 #define TREBLE_INSIDE_WIDTH 8.0 #define SEGMENT_MAX_LEN 5 // distance from centre to apex of outer wire // must be ordered outwards from centre #define FOREACH_RING(M) \ M(BULL, INNER_DIAMETER_BULL/2 + WIRE_WIDTH/2) \ M(25, INNER_DIAMETER_25/2 + WIRE_WIDTH/2) \ M(SMALL, TREBLE_OUTER_EDGE - WIRE_WIDTH - TREBLE_INSIDE_WIDTH - \ WIRE_WIDTH/2) \ M(TREBLE, TREBLE_OUTER_EDGE - WIRE_WIDTH/2) \ M(BIG, DOUBLE_OUTER_EDGE - WIRE_WIDTH - DOUBLE_INSIDE_WIDTH - \ WIRE_WIDTH/2) \ M(DOUBLE, DOUBLE_OUTER_EDGE - WIRE_WIDTH/2) #define GEN_RING_ENUM(X, D) R_ ## X, #define GEN_RING_STRING(X, D) #X, #define GEN_RING_OUTER_DIST(X, D) D, enum ring { FOREACH_RING(GEN_RING_ENUM) R_OUT }; struct segment { enum ring ring; int sector; }; void init_board(); struct ccoords { double x, y; }; struct pcoords { double a, r; }; struct segment get_segment(struct pcoords c); char *segment_name(struct segment seg); int segment_points(struct segment seg); bool segment_is_double(struct segment seg); struct pcoords segment_centre(struct segment seg); struct segment segment_from_name(char *name); #endif