Graphviz  2.41.20171026.1811
geomprocs.h
Go to the documentation of this file.
1 /* $Id$ $Revision$ */
2 /* vim:set shiftwidth=4 ts=8: */
3 
4 /*************************************************************************
5  * Copyright (c) 2011 AT&T Intellectual Property
6  * All rights reserved. This program and the accompanying materials
7  * are made available under the terms of the Eclipse Public License v1.0
8  * which accompanies this distribution, and is available at
9  * http://www.eclipse.org/legal/epl-v10.html
10  *
11  * Contributors: See CVS logs. Details at http://www.graphviz.org/
12  *************************************************************************/
13 
14 /* geometric functions (e.g. on points and boxes) with application to, but
15  * no specific dependence on graphs */
16 
17 #ifndef GV_GEOMPROCS_H
18 #define GV_GEOMPROCS_H
19 
20 #ifdef __cplusplus
21 extern "C" {
22 #endif
23 
24 
25 #include "geom.h"
26 
27 #ifdef _WIN32
28 #ifdef GVDLL
29 #define extern __declspec(dllexport)
30 #else
31 #define extern __declspec(dllimport)
32 #endif
33 #endif
34 
35 extern box mkbox(point p, point q);
36 extern boxf mkboxf(pointf p, pointf q);
37 
38 extern box flip_rec_box(box b, point p);
39 extern boxf flip_rec_boxf(boxf b, pointf p);
40 
41 extern double ptToLine2 (pointf l1, pointf l2, pointf p);
42 
43 extern int lineToBox(pointf p1, pointf p2, boxf b);
44 
45 extern point ccwrotatep(point p, int ccwrot);
46 extern pointf ccwrotatepf(pointf p, int ccwrot);
47 
48 extern point cwrotatep(point p, int cwrot);
49 extern pointf cwrotatepf(pointf p, int cwrot);
50 
51 extern void rect2poly(pointf *p);
52 
53 extern int line_intersect (pointf a, pointf b, pointf c, pointf d, pointf* p);
54 
55 #if defined(_WIN32)
56 #define inline __inline
57 #endif
58 
59 
60 static inline point pointof(int x, int y)
61 {
62  point r;
63 
64  r.x = x;
65  r.y = y;
66  return r;
67 }
68 
69 static inline pointf pointfof(double x, double y)
70 {
71  pointf r;
72 
73  r.x = x;
74  r.y = y;
75  return r;
76 }
77 
78 static inline box boxof(int llx, int lly, int urx, int ury)
79 {
80  box b;
81 
82  b.LL.x = llx, b.LL.y = lly;
83  b.UR.x = urx, b.UR.y = ury;
84  return b;
85 }
86 
87 static inline boxf boxfof(double llx, double lly, double urx, double ury)
88 {
89  boxf b;
90 
91  b.LL.x = llx, b.LL.y = lly;
92  b.UR.x = urx, b.UR.y = ury;
93  return b;
94 }
95 
96 static inline point add_point(point p, point q)
97 {
98  point r;
99 
100  r.x = p.x + q.x;
101  r.y = p.y + q.y;
102  return r;
103 }
104 
105 static inline pointf add_pointf(pointf p, pointf q)
106 {
107  pointf r;
108 
109  r.x = p.x + q.x;
110  r.y = p.y + q.y;
111  return r;
112 }
113 
114 static inline point sub_point(point p, point q)
115 {
116  point r;
117 
118  r.x = p.x - q.x;
119  r.y = p.y - q.y;
120  return r;
121 }
122 
123 static inline pointf sub_pointf(pointf p, pointf q)
124 {
125  pointf r;
126 
127  r.x = p.x - q.x;
128  r.y = p.y - q.y;
129  return r;
130 }
131 
132 /* for +ve coord values, this rounds towards p */
133 static inline point mid_point(point p, point q)
134 {
135  point r;
136 
137  r.x = (p.x + q.x) / 2;
138  r.y = (p.y + q.y) / 2;
139  return r;
140 }
141 
142 static inline pointf mid_pointf(pointf p, pointf q)
143 {
144  pointf r;
145 
146  r.x = (p.x + q.x) / 2.;
147  r.y = (p.y + q.y) / 2.;
148  return r;
149 }
150 
151 static inline pointf interpolate_pointf(double t, pointf p, pointf q)
152 {
153  pointf r;
154 
155  r.x = p.x + t * (q.x - p.x);
156  r.y = p.y + t * (q.y - p.y);
157  return r;
158 }
159 
160 static inline point exch_xy(point p)
161 {
162  point r;
163 
164  r.x = p.y;
165  r.y = p.x;
166  return r;
167 }
168 
169 static inline pointf exch_xyf(pointf p)
170 {
171  pointf r;
172 
173  r.x = p.y;
174  r.y = p.x;
175  return r;
176 }
177 
178 static inline box box_bb(box b0, box b1)
179 {
180  box b;
181 
182  b.LL.x = MIN(b0.LL.x, b1.LL.x);
183  b.LL.y = MIN(b0.LL.y, b1.LL.y);
184  b.UR.x = MAX(b0.UR.x, b1.UR.x);
185  b.UR.y = MAX(b0.UR.y, b1.UR.y);
186 
187  return b;
188 }
189 
190 static inline boxf boxf_bb(boxf b0, boxf b1)
191 {
192  boxf b;
193 
194  b.LL.x = MIN(b0.LL.x, b1.LL.x);
195  b.LL.y = MIN(b0.LL.y, b1.LL.y);
196  b.UR.x = MAX(b0.UR.x, b1.UR.x);
197  b.UR.y = MAX(b0.UR.y, b1.UR.y);
198 
199  return b;
200 }
201 
202 static inline box box_intersect(box b0, box b1)
203 {
204  box b;
205 
206  b.LL.x = MAX(b0.LL.x, b1.LL.x);
207  b.LL.y = MAX(b0.LL.y, b1.LL.y);
208  b.UR.x = MIN(b0.UR.x, b1.UR.x);
209  b.UR.y = MIN(b0.UR.y, b1.UR.y);
210 
211  return b;
212 }
213 
214 static inline boxf boxf_intersect(boxf b0, boxf b1)
215 {
216  boxf b;
217 
218  b.LL.x = MAX(b0.LL.x, b1.LL.x);
219  b.LL.y = MAX(b0.LL.y, b1.LL.y);
220  b.UR.x = MIN(b0.UR.x, b1.UR.x);
221  b.UR.y = MIN(b0.UR.y, b1.UR.y);
222 
223  return b;
224 }
225 
226 static inline int box_overlap(box b0, box b1)
227 {
228  return OVERLAP(b0, b1);
229 }
230 
231 static inline int boxf_overlap(boxf b0, boxf b1)
232 {
233  return OVERLAP(b0, b1);
234 }
235 
236 static inline int box_contains(box b0, box b1)
237 {
238  return CONTAINS(b0, b1);
239 }
240 
241 static inline int boxf_contains(boxf b0, boxf b1)
242 {
243  return CONTAINS(b0, b1);
244 }
245 
246 static inline pointf perp (pointf p)
247 {
248  pointf r;
249 
250  r.x = -p.y;
251  r.y = p.x;
252  return r;
253 }
254 
255 static inline pointf scale (double c, pointf p)
256 {
257  pointf r;
258 
259  r.x = c * p.x;
260  r.y = c * p.y;
261  return r;
262 }
263 #ifdef WIN32_STATIC
264 #undef inline
265 #endif
266 
267 #undef extern
268 #ifdef __cplusplus
269 }
270 #endif
271 
272 #endif
#define MAX(a, b)
Definition: agerror.c:17
box flip_rec_box(box b, point p)
Definition: geom.c:348
pointf cwrotatepf(pointf p, int cwrot)
Definition: geom.c:264
#define MIN(a, b)
Definition: arith.h:35
boxf flip_rec_boxf(boxf b, pointf p)
Definition: geom.c:364
Definition: geom.h:28
#define OVERLAP(b0, b1)
Definition: geom.h:42
point UR
Definition: geom.h:33
int x
Definition: geom.h:26
int lineToBox(pointf p, pointf q, boxf b)
Definition: geom.c:89
pointf ccwrotatepf(pointf p, int ccwrot)
Definition: geom.c:320
double y
Definition: geom.h:28
point cwrotatep(point p, int cwrot)
Definition: geom.c:236
#define CONTAINS(b0, b1)
Definition: geom.h:45
void rect2poly(pointf *p)
Definition: geom.c:201
point LL
Definition: geom.h:33
boxf mkboxf(pointf p, pointf q)
Definition: geom.c:46
Definition: geom.h:26
double x
Definition: geom.h:28
int line_intersect(pointf a, pointf b, pointf c, pointf d, pointf *p)
Definition: geom.c:407
pointf LL
Definition: geom.h:35
point ccwrotatep(point p, int ccwrot)
Definition: geom.c:292
box mkbox(point p, point q)
Definition: geom.c:25
int y
Definition: geom.h:26
pointf UR
Definition: geom.h:35
Definition: geom.h:35
double ptToLine2(pointf a, pointf b, pointf p)
Definition: geom.c:390
Definition: geom.h:33