1--
2-- GEOMETRY
3--
4
5-- Back off displayed precision a little bit to reduce platform-to-platform
6-- variation in results.
7SET extra_float_digits TO -3;
8
9--
10-- Points
11--
12
13SELECT '' AS four, center(f1) AS center
14   FROM BOX_TBL;
15
16SELECT '' AS four, (@@ f1) AS center
17   FROM BOX_TBL;
18
19SELECT '' AS six, point(f1) AS center
20   FROM CIRCLE_TBL;
21
22SELECT '' AS six, (@@ f1) AS center
23   FROM CIRCLE_TBL;
24
25SELECT '' AS two, (@@ f1) AS center
26   FROM POLYGON_TBL
27   WHERE (# f1) > 2;
28
29-- "is horizontal" function
30SELECT '' AS two, p1.f1
31   FROM POINT_TBL p1
32   WHERE ishorizontal(p1.f1, point '(0,0)');
33
34-- "is horizontal" operator
35SELECT '' AS two, p1.f1
36   FROM POINT_TBL p1
37   WHERE p1.f1 ?- point '(0,0)';
38
39-- "is vertical" function
40SELECT '' AS one, p1.f1
41   FROM POINT_TBL p1
42   WHERE isvertical(p1.f1, point '(5.1,34.5)');
43
44-- "is vertical" operator
45SELECT '' AS one, p1.f1
46   FROM POINT_TBL p1
47   WHERE p1.f1 ?| point '(5.1,34.5)';
48
49--
50-- Line segments
51--
52
53-- intersection
54SELECT '' AS count, p.f1, l.s, l.s # p.f1 AS intersection
55   FROM LSEG_TBL l, POINT_TBL p;
56
57-- closest point
58SELECT '' AS thirty, p.f1, l.s, p.f1 ## l.s AS closest
59   FROM LSEG_TBL l, POINT_TBL p;
60
61--
62-- Boxes
63--
64
65SELECT '' as six, box(f1) AS box FROM CIRCLE_TBL;
66
67-- translation
68SELECT '' AS twentyfour, b.f1 + p.f1 AS translation
69   FROM BOX_TBL b, POINT_TBL p;
70
71SELECT '' AS twentyfour, b.f1 - p.f1 AS translation
72   FROM BOX_TBL b, POINT_TBL p;
73
74-- scaling and rotation
75SELECT '' AS twentyfour, b.f1 * p.f1 AS rotation
76   FROM BOX_TBL b, POINT_TBL p;
77
78SELECT '' AS twenty, b.f1 / p.f1 AS rotation
79   FROM BOX_TBL b, POINT_TBL p
80   WHERE (p.f1 <-> point '(0,0)') >= 1;
81
82SELECT f1::box
83	FROM POINT_TBL;
84
85SELECT bound_box(a.f1, b.f1)
86	FROM BOX_TBL a, BOX_TBL b;
87
88--
89-- Paths
90--
91
92SELECT '' AS eight, npoints(f1) AS npoints, f1 AS path FROM PATH_TBL;
93
94SELECT '' AS four, path(f1) FROM POLYGON_TBL;
95
96-- translation
97SELECT '' AS eight, p1.f1 + point '(10,10)' AS dist_add
98   FROM PATH_TBL p1;
99
100-- scaling and rotation
101SELECT '' AS eight, p1.f1 * point '(2,-1)' AS dist_mul
102   FROM PATH_TBL p1;
103
104--
105-- Polygons
106--
107
108-- containment
109SELECT '' AS twentyfour, p.f1, poly.f1, poly.f1 @> p.f1 AS contains
110   FROM POLYGON_TBL poly, POINT_TBL p;
111
112SELECT '' AS twentyfour, p.f1, poly.f1, p.f1 <@ poly.f1 AS contained
113   FROM POLYGON_TBL poly, POINT_TBL p;
114
115SELECT '' AS four, npoints(f1) AS npoints, f1 AS polygon
116   FROM POLYGON_TBL;
117
118SELECT '' AS four, polygon(f1)
119   FROM BOX_TBL;
120
121SELECT '' AS four, polygon(f1)
122   FROM PATH_TBL WHERE isclosed(f1);
123
124SELECT '' AS four, f1 AS open_path, polygon( pclose(f1)) AS polygon
125   FROM PATH_TBL
126   WHERE isopen(f1);
127
128-- convert circles to polygons using the default number of points
129SELECT '' AS six, polygon(f1)
130   FROM CIRCLE_TBL;
131
132-- convert the circle to an 8-point polygon
133SELECT '' AS six, polygon(8, f1)
134   FROM CIRCLE_TBL;
135
136--
137-- Circles
138--
139
140SELECT '' AS six, circle(f1, 50.0)
141   FROM POINT_TBL;
142
143SELECT '' AS four, circle(f1)
144   FROM BOX_TBL;
145
146SELECT '' AS two, circle(f1)
147   FROM POLYGON_TBL
148   WHERE (# f1) >= 3;
149
150SELECT '' AS twentyfour, c1.f1 AS circle, p1.f1 AS point, (p1.f1 <-> c1.f1) AS distance
151   FROM CIRCLE_TBL c1, POINT_TBL p1
152   WHERE (p1.f1 <-> c1.f1) > 0
153   ORDER BY distance, area(c1.f1), p1.f1[0];
154