1 #ifndef __poly_h__ 2 #define __poly_h__ 3 4 #include <stdint.h> 5 #include "../q.h" 6 #include "../types.h" 7 #include "wind.h" 8 9 /* features */ 10 #define SPLAY 11 #define DONT_REMEMBER_CROSSINGS 12 13 typedef enum {EVENT_CROSS, EVENT_END, EVENT_START, EVENT_HORIZONTAL} eventtype_t; 14 typedef enum {SLOPE_POSITIVE, SLOPE_NEGATIVE} slope_t; 15 16 #define INVALID_COORD (0x7fffffff) 17 typedef struct _point { 18 int32_t x; 19 int32_t y; 20 } point_t; 21 type_t point_type; 22 23 #define SEGNR(s) ((int)((s)?(s)->nr:-1)) 24 25 typedef struct _gfxpolystroke { 26 segment_dir_t dir; 27 edgestyle_t*fs; 28 int points_size; 29 int num_points; 30 point_t*points; 31 struct _gfxpolystroke*next; 32 } gfxpolystroke_t; 33 typedef struct _gfxpoly { 34 double gridsize; 35 gfxpolystroke_t*strokes; 36 } gfxpoly_t; 37 38 typedef struct _segment { 39 point_t a; 40 point_t b; 41 point_t delta; 42 double k; //k = a.x*b.y-a.y*b.x = delta.y*a.x - delta.x*a.y (=0 for points on the segment) 43 int32_t minx, maxx; 44 45 segment_dir_t dir; 46 edgestyle_t*fs; 47 edgestyle_t*fs_out; 48 #ifdef CHECKS 49 char fs_out_ok; 50 #endif 51 52 int polygon_nr; 53 windstate_t wind; 54 ptroff_t nr; 55 56 #ifdef SPLAY 57 struct _segment*parent; 58 struct _segment*leftchild; 59 struct _segment*rightchild; 60 #endif 61 struct _segment*left; 62 struct _segment*right; 63 char changed; 64 65 point_t pos; 66 67 gfxpolystroke_t*stroke; 68 int stroke_pos; 69 70 #ifndef DONT_REMEMBER_CROSSINGS 71 dict_t scheduled_crossings; 72 #endif 73 } segment_t; 74 75 typedef struct _moments { 76 double area; 77 double m[3][3]; 78 } moments_t; 79 80 #define LINE_EQ(p,s) ((double)(s)->delta.y*(p).x - (double)(s)->delta.x*(p).y - (s)->k) 81 82 /* x1 + ((x2-x1)*(y-y1)) / dy = 83 (x1*(y2-y1) + (x2-x1)*(y-y1)) / dy = 84 (x1*(y2-y) + x2 *(y-y1)) / dy = 85 (x1*y2 - x2*y1 + x2*y - y*x1) / dy = 86 (k + x2*y - x1*y) / dy 87 (k + dx*y) / dy 88 */ 89 //#define XPOS(s,ypos) ((s)->a.x + ((s)->delta.x * (double)((ypos) - (s)->a.y)) / (s)->delta.y) 90 #define XPOS(s,ypos) (((s)->k + (double)(s)->delta.x*ypos) / (s)->delta.y) 91 92 #define XPOS_INT(s,ypos) ((int)ceil(XPOS((s),ypos))) 93 #define XDIFF(s1,s2,ypos) (((s1)->k + (double)(s1)->delta.x*ypos)*(s2)->delta.y - \ 94 ((s2)->k + (double)(s2)->delta.x*ypos)*(s1)->delta.y) 95 96 void gfxpoly_fail(char*expr, char*file, int line, const char*function); 97 98 char gfxpoly_check(gfxpoly_t*poly, char updown); 99 int gfxpoly_num_segments(gfxpoly_t*poly); 100 int gfxpoly_size(gfxpoly_t*poly); 101 void gfxpoly_dump(gfxpoly_t*poly); 102 void gfxpoly_save(gfxpoly_t*poly, const char*filename); 103 void gfxpoly_save_arrows(gfxpoly_t*poly, const char*filename); 104 gfxpoly_t* gfxpoly_process(gfxpoly_t*poly1, gfxpoly_t*poly2, windrule_t*windrule, windcontext_t*context, moments_t*moments); 105 106 gfxpoly_t* gfxpoly_intersect(gfxpoly_t*p1, gfxpoly_t*p2); 107 gfxpoly_t* gfxpoly_union(gfxpoly_t*p1, gfxpoly_t*p2); 108 double gfxpoly_area(gfxpoly_t*p); 109 double gfxpoly_intersection_area(gfxpoly_t*p1, gfxpoly_t*p2); 110 111 #ifndef CHECKS 112 #ifdef assert 113 #undef assert 114 #endif 115 #define assert(x) 116 #else 117 #define assert(x) ((x)?0:gfxpoly_fail(__STRING(x), __FILE__, __LINE__, __PRETTY_FUNCTION__)) 118 #endif 119 120 121 #endif 122