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
21extern "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
35extern box mkbox(point p, point q);
36extern boxf mkboxf(pointf p, pointf q);
37
38extern box flip_rec_box(box b, point p);
39extern boxf flip_rec_boxf(boxf b, pointf p);
40
41extern double ptToLine2 (pointf l1, pointf l2, pointf p);
42
43extern int lineToBox(pointf p1, pointf p2, boxf b);
44
45extern point ccwrotatep(point p, int ccwrot);
46extern pointf ccwrotatepf(pointf p, int ccwrot);
47
48extern point cwrotatep(point p, int cwrot);
49extern pointf cwrotatepf(pointf p, int cwrot);
50
51extern void rect2poly(pointf *p);
52
53extern 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
60static 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
69static 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
78static 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
87static 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
96static 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
105static 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
114static 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
123static 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 */
133static 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
142static 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
151static 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
160static 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
169static 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
178static 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
190static 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
202static 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
214static 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
226static inline int box_overlap(box b0, box b1)
227{
228 return OVERLAP(b0, b1);
229}
230
231static inline int boxf_overlap(boxf b0, boxf b1)
232{
233 return OVERLAP(b0, b1);
234}
235
236static inline int box_contains(box b0, box b1)
237{
238 return CONTAINS(b0, b1);
239}
240
241static inline int boxf_contains(boxf b0, boxf b1)
242{
243 return CONTAINS(b0, b1);
244}
245
246static 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
255static 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
273