1-- ****************************
2--
3-- spherical circle functions
4--
5-- ****************************
6
7
8CREATE FUNCTION area(scircle)
9   RETURNS FLOAT8
10   AS 'MODULE_PATHNAME', 'spherecircle_area'
11   LANGUAGE 'c'
12   IMMUTABLE STRICT;
13
14COMMENT ON FUNCTION area(scircle) IS
15  'area of spherical circle';
16
17CREATE FUNCTION radius(scircle)
18   RETURNS FLOAT8
19   AS 'MODULE_PATHNAME', 'spherecircle_radius'
20   LANGUAGE 'c'
21   IMMUTABLE STRICT;
22
23COMMENT ON FUNCTION radius(scircle) IS
24  'radius of spherical circle';
25
26CREATE FUNCTION scircle(spoint, float8)
27   RETURNS scircle
28   AS 'MODULE_PATHNAME' , 'spherecircle_by_center'
29   LANGUAGE 'c'
30   IMMUTABLE STRICT;
31
32COMMENT ON FUNCTION scircle(spoint, float8) IS
33  'spherical circle with spherical point as center and float8 as radius in radians';
34
35
36--
37-- Casting point as circle
38--
39
40CREATE FUNCTION scircle(spoint)
41   RETURNS scircle
42   AS 'MODULE_PATHNAME' , 'spherepoint_to_circle'
43   LANGUAGE 'c'
44   IMMUTABLE STRICT;
45
46COMMENT ON FUNCTION scircle(spoint) IS
47  'spherical circle with radius 0 and spherical point as center';
48
49CREATE CAST (spoint AS scircle)
50   WITH FUNCTION scircle(spoint)
51   AS IMPLICIT;
52
53
54-- **************************
55--
56-- spherical circle operators
57--
58-- **************************
59
60
61--
62-- equal
63--
64
65CREATE FUNCTION scircle_equal(scircle, scircle)
66   RETURNS BOOL
67   AS 'MODULE_PATHNAME' , 'spherecircle_equal'
68   LANGUAGE 'c'
69   IMMUTABLE STRICT;
70
71COMMENT ON FUNCTION scircle_equal(scircle, scircle) IS
72  'returns true, if spherical circles are equal';
73
74CREATE OPERATOR  = (
75   LEFTARG    = scircle,
76   RIGHTARG   = scircle,
77   COMMUTATOR = = ,
78   NEGATOR    = <>,
79   PROCEDURE  = scircle_equal,
80   RESTRICT   = contsel,
81   JOIN       = contjoinsel
82);
83
84COMMENT ON OPERATOR = (scircle, scircle) IS
85  'true, if spherical circles are equal';
86
87
88--
89-- not equal
90--
91
92CREATE FUNCTION scircle_equal_neg(scircle, scircle)
93   RETURNS BOOL
94   AS 'MODULE_PATHNAME' , 'spherecircle_equal_neg'
95   LANGUAGE 'c'
96   IMMUTABLE STRICT;
97
98COMMENT ON FUNCTION scircle_equal_neg(scircle, scircle) IS
99  'returns true, if spherical circles are not equal';
100
101CREATE OPERATOR  <> (
102   LEFTARG    = scircle,
103   RIGHTARG   = scircle,
104   COMMUTATOR = <>,
105   NEGATOR    = = ,
106   PROCEDURE  = scircle_equal_neg,
107   RESTRICT   = contsel,
108   JOIN       = contjoinsel
109);
110
111COMMENT ON OPERATOR <> (scircle, scircle) IS
112  'true, if spherical circles are not equal';
113
114--
115-- overlap
116--
117
118CREATE FUNCTION scircle_overlap(scircle, scircle)
119   RETURNS BOOL
120   AS 'MODULE_PATHNAME' , 'spherecircle_overlap'
121   LANGUAGE 'c'
122   IMMUTABLE STRICT;
123
124COMMENT ON FUNCTION scircle_overlap(scircle, scircle) IS
125  'true if spherical circles overlap';
126
127CREATE OPERATOR && (
128   LEFTARG    = scircle,
129   RIGHTARG   = scircle,
130   PROCEDURE  = scircle_overlap,
131   COMMUTATOR = '&&',
132   NEGATOR    = '!&&',
133   RESTRICT   = contsel,
134   JOIN       = contjoinsel
135);
136
137COMMENT ON OPERATOR && (scircle, scircle) IS
138  'true if spherical circles overlap';
139
140--
141-- not overlap
142--
143
144CREATE FUNCTION scircle_overlap_neg(scircle, scircle)
145   RETURNS BOOL
146   AS 'MODULE_PATHNAME' , 'spherecircle_overlap_neg'
147   LANGUAGE 'c'
148   IMMUTABLE STRICT;
149
150COMMENT ON FUNCTION scircle_overlap_neg(scircle, scircle) IS
151  'true if spherical circles do not overlap';
152
153CREATE OPERATOR !&& (
154   LEFTARG    = scircle,
155   RIGHTARG   = scircle,
156   PROCEDURE  = scircle_overlap_neg,
157   COMMUTATOR = '!&&',
158   NEGATOR    = '&&',
159   RESTRICT   = contsel,
160   JOIN       = contjoinsel
161);
162
163COMMENT ON OPERATOR !&& (scircle, scircle) IS
164  'true if spherical circles do not overlap';
165
166--
167-- center of circle
168--
169
170
171CREATE FUNCTION center(scircle)
172   RETURNS spoint
173   AS 'MODULE_PATHNAME' , 'spherecircle_center'
174   LANGUAGE 'c'
175   IMMUTABLE STRICT;
176
177COMMENT ON FUNCTION center(scircle) IS
178  'center of spherical circle';
179
180CREATE OPERATOR @@ (
181   RIGHTARG   = scircle,
182   PROCEDURE  = center
183);
184
185COMMENT ON OPERATOR @@ (NONE , scircle) IS
186  'center of spherical circle';
187
188
189--
190-- circumference
191--
192
193CREATE FUNCTION circum(scircle)
194   RETURNS FLOAT8
195   AS 'MODULE_PATHNAME', 'spherecircle_circ'
196   LANGUAGE 'c'
197   IMMUTABLE STRICT;
198
199COMMENT ON FUNCTION circum(scircle) IS
200  'circumference of spherical circle';
201
202CREATE OPERATOR @-@ (
203   RIGHTARG   = scircle,
204   PROCEDURE  = circum
205);
206
207COMMENT ON OPERATOR @-@ (NONE , scircle) IS
208  'circumference of spherical circle';
209
210
211--
212-- circle is contained by circle
213--
214
215CREATE FUNCTION scircle_contained_by_circle(scircle, scircle)
216   RETURNS BOOL
217   AS 'MODULE_PATHNAME' , 'spherecircle_in_circle'
218   LANGUAGE 'c'
219   IMMUTABLE STRICT;
220
221COMMENT ON FUNCTION scircle_contained_by_circle(scircle, scircle) IS
222  'true if spherical circle is contained by spherical circle';
223
224--
225-- circle is not contained by circle
226--
227
228CREATE FUNCTION scircle_contained_by_circle_neg (scircle, scircle)
229   RETURNS BOOL
230   AS 'MODULE_PATHNAME' , 'spherecircle_in_circle_neg'
231   LANGUAGE 'c'
232   IMMUTABLE STRICT;
233
234COMMENT ON FUNCTION scircle_contained_by_circle_neg (scircle, scircle) IS
235  'true if spherical circle is not contained by spherical circle';
236
237--
238-- circle contains circle
239--
240
241CREATE FUNCTION scircle_contains_circle (scircle, scircle)
242   RETURNS BOOL
243   AS 'MODULE_PATHNAME' , 'spherecircle_in_circle_com'
244   LANGUAGE 'c'
245   IMMUTABLE STRICT;
246
247COMMENT ON FUNCTION scircle_contains_circle (scircle, scircle) IS
248  'true if spherical circle contains spherical circle';
249
250--
251-- circle does not contain circle
252--
253
254CREATE FUNCTION scircle_contains_circle_neg (scircle, scircle)
255   RETURNS BOOL
256   AS 'MODULE_PATHNAME' , 'spherecircle_in_circle_com_neg'
257   LANGUAGE 'c'
258   IMMUTABLE STRICT;
259
260COMMENT ON FUNCTION scircle_contains_circle_neg (scircle, scircle) IS
261  'true if spherical circle does not contain spherical circle';
262
263--
264-- point is contained by circle
265--
266
267CREATE FUNCTION spoint_contained_by_circle(spoint, scircle)
268   RETURNS BOOL
269   AS 'MODULE_PATHNAME' , 'spherepoint_in_circle'
270   LANGUAGE 'c'
271   IMMUTABLE STRICT;
272
273COMMENT ON FUNCTION spoint_contained_by_circle(spoint, scircle) IS
274  'true if spherical point is contained by spherical circle';
275
276
277--
278-- point is not contained by circle
279--
280
281CREATE FUNCTION spoint_contained_by_circle_neg(spoint, scircle)
282   RETURNS BOOL
283   AS 'MODULE_PATHNAME' , 'spherepoint_in_circle_neg'
284   LANGUAGE 'c'
285   IMMUTABLE STRICT;
286
287COMMENT ON FUNCTION spoint_contained_by_circle_neg (spoint, scircle) IS
288  'true if spherical point is not contained by spherical circle ';
289
290
291--
292-- circle contains point
293--
294
295CREATE FUNCTION spoint_contained_by_circle_com(scircle, spoint)
296   RETURNS BOOL
297   AS 'MODULE_PATHNAME' , 'spherepoint_in_circle_com'
298   LANGUAGE 'c'
299   IMMUTABLE STRICT;
300
301COMMENT ON FUNCTION spoint_contained_by_circle_com (scircle, spoint) IS
302  'true if spherical circle contains spherical point ';
303
304
305--
306-- circle does not contain point
307--
308
309CREATE FUNCTION spoint_contained_by_circle_com_neg(scircle, spoint)
310   RETURNS BOOL
311   AS 'MODULE_PATHNAME' , 'spherepoint_in_circle_com_neg'
312   LANGUAGE 'c'
313   IMMUTABLE STRICT;
314
315COMMENT ON FUNCTION spoint_contained_by_circle_com_neg (scircle, spoint) IS
316  'true if spherical circle does not contain spherical point ';
317
318
319--
320-- distance between circles
321--
322
323CREATE FUNCTION dist(scircle, scircle)
324   RETURNS FLOAT8
325   AS 'MODULE_PATHNAME', 'spherecircle_distance'
326   LANGUAGE 'c'
327   IMMUTABLE STRICT;
328
329COMMENT ON FUNCTION dist(scircle, scircle) IS
330  'distance between two spherical circles';
331
332
333CREATE OPERATOR  <-> (
334   LEFTARG    = scircle,
335   RIGHTARG   = scircle,
336   COMMUTATOR = '<->',
337   PROCEDURE  = dist
338);
339
340COMMENT ON OPERATOR <-> (scircle, scircle) IS
341  'distance between two spherical circles';
342
343
344--
345-- distance between circle and point
346--
347
348CREATE FUNCTION dist(scircle, spoint)
349   RETURNS FLOAT8
350   AS 'MODULE_PATHNAME', 'spherecircle_point_distance'
351   LANGUAGE 'c'
352   IMMUTABLE STRICT;
353
354COMMENT ON FUNCTION dist(scircle, spoint) IS
355  'distance between spherical circle and spherical point';
356
357
358CREATE OPERATOR  <-> (
359   LEFTARG    = scircle,
360   RIGHTARG   = spoint,
361   COMMUTATOR = '<->',
362   PROCEDURE  = dist
363);
364
365COMMENT ON OPERATOR <-> (scircle, spoint) IS
366  'distance between spherical circle and spherical point';
367
368
369
370--
371-- distance between point and circle
372--
373
374CREATE FUNCTION dist(spoint, scircle)
375   RETURNS FLOAT8
376   AS 'MODULE_PATHNAME', 'spherecircle_point_distance_com'
377   LANGUAGE 'c'
378   IMMUTABLE STRICT;
379
380COMMENT ON FUNCTION dist(spoint, scircle) IS
381  'distance between spherical circle and spherical point';
382
383
384CREATE OPERATOR  <-> (
385   LEFTARG    = spoint,
386   RIGHTARG   = scircle,
387   COMMUTATOR = '<->',
388   PROCEDURE  = dist
389);
390
391COMMENT ON OPERATOR <-> (spoint, scircle) IS
392  'distance between spherical circle and spherical point';
393
394
395--
396--  Transformation of circle
397--
398
399
400CREATE FUNCTION strans_circle(scircle, strans)
401   RETURNS scircle
402   AS 'MODULE_PATHNAME' , 'spheretrans_circle'
403   LANGUAGE 'c'
404   IMMUTABLE STRICT;
405
406COMMENT ON FUNCTION strans_circle (scircle, strans) IS
407  'returns a transformated spherical circle';
408
409
410CREATE OPERATOR + (
411   LEFTARG    = scircle,
412   RIGHTARG   = strans,
413   PROCEDURE  = strans_circle
414);
415
416COMMENT ON OPERATOR + (scircle, strans) IS
417  'transforms a spherical circle ';
418
419CREATE FUNCTION strans_circle_inverse(scircle, strans)
420   RETURNS scircle
421   AS 'MODULE_PATHNAME' , 'spheretrans_circle_inverse'
422   LANGUAGE 'c'
423   IMMUTABLE STRICT;
424
425COMMENT ON FUNCTION strans_circle_inverse (scircle, strans) IS
426  'returns a inverse transformated spherical circle';
427
428CREATE OPERATOR - (
429   LEFTARG    = scircle,
430   RIGHTARG   = strans,
431   PROCEDURE  = strans_circle_inverse
432);
433
434COMMENT ON OPERATOR - (scircle, strans) IS
435  'transforms inverse a spherical circle ';
436