fixed units of gfxpoly_intersection_area()
[swftools.git] / lib / gfxpoly / poly.h
blobbc50d707792d2518de1681512e820f79d75bbc03
1 #ifndef __poly_h__
2 #define __poly_h__
4 #include <stdint.h>
5 #include "../q.h"
6 #include "../types.h"
7 #include "wind.h"
9 /* features */
10 #define SPLAY
11 #define DONT_REMEMBER_CROSSINGS
13 typedef enum {EVENT_CROSS, EVENT_END, EVENT_START, EVENT_HORIZONTAL} eventtype_t;
14 typedef enum {SLOPE_POSITIVE, SLOPE_NEGATIVE} slope_t;
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;
23 #define SEGNR(s) ((int)((s)?(s)->nr:-1))
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;
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;
45 segment_dir_t dir;
46 edgestyle_t*fs;
47 edgestyle_t*fs_out;
48 #ifdef CHECKS
49 char fs_out_ok;
50 #endif
52 int polygon_nr;
53 windstate_t wind;
54 ptroff_t nr;
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;
65 point_t pos;
67 gfxpolystroke_t*stroke;
68 int stroke_pos;
70 #ifndef DONT_REMEMBER_CROSSINGS
71 dict_t scheduled_crossings;
72 #endif
73 } segment_t;
75 typedef struct _moments {
76 double area;
77 double m[3][3];
78 } moments_t;
80 #define LINE_EQ(p,s) ((double)(s)->delta.y*(p).x - (double)(s)->delta.x*(p).y - (s)->k)
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
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)
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)
96 void gfxpoly_fail(char*expr, char*file, int line, const char*function);
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);
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);
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
121 #endif