Skip to content

Commit 9d5fa49

Browse files
committed
Add spoly(spoint[]) constructor function
1 parent 81939cf commit 9d5fa49

File tree

5 files changed

+135
-54
lines changed

5 files changed

+135
-54
lines changed

Diff for: expected/poly.out

+50-26
Original file line numberDiff line numberDiff line change
@@ -12,25 +12,25 @@ SELECT spoint '(0.15,0.10)' @ :poly; -- point inside polygon
1212
t
1313
(1 row)
1414

15-
SELECT spoint '(0.20,0.00)' @ :poly; -- point contained polygon
15+
SELECT spoint '(0.20,0.00)' @ :poly; -- point contained polygon
1616
?column?
1717
----------
1818
t
1919
(1 row)
2020

21-
SELECT spoint '(0.10,0.10)' @ :poly; -- point contained polygon
21+
SELECT spoint '(0.10,0.10)' @ :poly; -- point contained polygon
2222
?column?
2323
----------
2424
t
2525
(1 row)
2626

27-
SELECT spoint '(0.25,0.50)' @ :poly; -- point outside polygon
27+
SELECT spoint '(0.25,0.50)' @ :poly; -- point outside polygon
2828
?column?
2929
----------
3030
f
3131
(1 row)
3232

33-
SELECT spoint '(0.25,0.00)' @ :poly; -- point outside polygon
33+
SELECT spoint '(0.25,0.00)' @ :poly; -- point outside polygon
3434
?column?
3535
----------
3636
f
@@ -42,13 +42,13 @@ SELECT scircle '<(0.15,0.10),0.03>' @ :poly; -- circle inside polygon
4242
t
4343
(1 row)
4444

45-
SELECT scircle '<(0.20,0.00),0.00>' @ :poly; -- circle contained polygon
45+
SELECT scircle '<(0.20,0.00),0.00>' @ :poly; -- circle contained polygon
4646
?column?
4747
----------
4848
t
4949
(1 row)
5050

51-
SELECT scircle '<(0.20,0.30),0.05>' @ :poly; -- circle outside polygon
51+
SELECT scircle '<(0.20,0.30),0.05>' @ :poly; -- circle outside polygon
5252
?column?
5353
----------
5454
f
@@ -72,13 +72,13 @@ SELECT scircle '<(0.15,0.10),0.03>' && :poly; -- circle inside polygon
7272
t
7373
(1 row)
7474

75-
SELECT scircle '<(0.20,0.00),0.00>' && :poly; -- circle contained polygon
75+
SELECT scircle '<(0.20,0.00),0.00>' && :poly; -- circle contained polygon
7676
?column?
7777
----------
7878
t
7979
(1 row)
8080

81-
SELECT scircle '<(0.20,0.30),0.05>' && :poly; -- circle outside polygon
81+
SELECT scircle '<(0.20,0.30),0.05>' && :poly; -- circle outside polygon
8282
?column?
8383
----------
8484
f
@@ -96,13 +96,13 @@ SELECT scircle '<(0.25,0.00),0.10>' && :poly; -- circle overlaps polyg
9696
t
9797
(1 row)
9898

99-
SELECT sline ( spoint '(0.00, 0.00)', spoint '(0.10,0.20)' ) @ :poly; -- line touches polygon
99+
SELECT sline ( spoint '(0.00, 0.00)', spoint '(0.10,0.20)' ) @ :poly; -- line touches polygon
100100
?column?
101101
----------
102102
f
103103
(1 row)
104104

105-
SELECT sline ( spoint '(0.00, 0.10)', spoint '(0.10,0.10)' ) @ :poly; -- line touches polygon
105+
SELECT sline ( spoint '(0.00, 0.10)', spoint '(0.10,0.10)' ) @ :poly; -- line touches polygon
106106
?column?
107107
----------
108108
f
@@ -114,7 +114,7 @@ SELECT sline ( spoint '(0.50, 0.00)', spoint '(0.50,0.20)' ) @ :poly; -- line
114114
f
115115
(1 row)
116116

117-
SELECT sline ( spoint '(0.10, 0.20)', spoint '(0.20,0.00)' ) @ :poly; -- line touches and inside polygon
117+
SELECT sline ( spoint '(0.10, 0.20)', spoint '(0.20,0.00)' ) @ :poly; -- line touches and inside polygon
118118
?column?
119119
----------
120120
t
@@ -138,13 +138,13 @@ SELECT sline ( spoint '(0.24, 0.17)', spoint '(0.25,0.14)' ) @ :poly; -- line
138138
t
139139
(1 row)
140140

141-
SELECT sline ( spoint '(0.00, 0.00)', spoint '(0.10,0.20)' ) && :poly; -- line touches polygon
141+
SELECT sline ( spoint '(0.00, 0.00)', spoint '(0.10,0.20)' ) && :poly; -- line touches polygon
142142
?column?
143143
----------
144144
t
145145
(1 row)
146146

147-
SELECT sline ( spoint '(0.00, 0.10)', spoint '(0.10,0.10)' ) && :poly; -- line touches polygon
147+
SELECT sline ( spoint '(0.00, 0.10)', spoint '(0.10,0.10)' ) && :poly; -- line touches polygon
148148
?column?
149149
----------
150150
t
@@ -156,7 +156,7 @@ SELECT sline ( spoint '(0.50, 0.00)', spoint '(0.50,0.20)' ) && :poly; -- line
156156
t
157157
(1 row)
158158

159-
SELECT sline ( spoint '(0.10, 0.20)', spoint '(0.20,0.00)' ) && :poly; -- line touches and inside polygon
159+
SELECT sline ( spoint '(0.10, 0.20)', spoint '(0.20,0.00)' ) && :poly; -- line touches and inside polygon
160160
?column?
161161
----------
162162
t
@@ -342,7 +342,32 @@ SELECT spoly_deg(ARRAY[10.0, 0.0, 10.0, 1.0, 15.0, 0.0]);
342342
{(10d , 0d),(10d , 1d),(15d , 0d)}
343343
(1 row)
344344

345-
-- incorrect input -----
345+
--- Constructors
346+
SELECT spoly(NULL::spoint[]);
347+
spoly
348+
-------
349+
350+
(1 row)
351+
352+
SELECT spoly(ARRAY[]::spoint[]);
353+
ERROR: spoly_deg: invalid number of arguments (must be >= 3)
354+
SELECT spoly(ARRAY[spoint_deg(0, 0)]);
355+
ERROR: spoly_deg: invalid number of arguments (must be >= 3)
356+
SELECT spoly(ARRAY[spoint_deg(0, 0), spoint_deg(10, 0)]);
357+
ERROR: spoly_deg: invalid number of arguments (must be >= 3)
358+
SELECT spoly(ARRAY[spoint_deg(0, 0), spoint_deg(10, 0), spoint_deg(10,10)]);
359+
spoly
360+
------------------------------------
361+
{(0d , 0d),(10d , 0d),(10d , 10d)}
362+
(1 row)
363+
364+
SELECT spoly(ARRAY[spoint_deg(0, 0), spoint_deg(10, 0), spoint_deg(10,10), spoint_deg(0, 10)]);
365+
spoly
366+
-----------------------------------------------
367+
{(0d , 0d),(10d , 0d),(10d , 10d),(0d , 10d)}
368+
(1 row)
369+
370+
--- incorrect input -----
346371
SELECT spoly '{(10d,0d),(10d,1d)}';
347372
ERROR: spherepoly_in: more than two points needed
348373
LINE 1: SELECT spoly '{(10d,0d),(10d,1d)}';
@@ -1211,7 +1236,7 @@ SELECT spoly '{(0d,-88d),(90d,-88d),(180d,-88d),(270d,-88d)}' @ spoly '{(0d,89d)
12111236
(1 row)
12121237

12131238
--- spoly ~ spoly
1214-
--- should be true
1239+
--- should be true
12151240
SELECT spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}' ~ spoly '{(0d,0d),(0d,0.5d),(0.5d,0.5d),(0.5d,0d)}';
12161241
?column?
12171242
----------
@@ -1280,7 +1305,7 @@ SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}' ~ spoly '{(0d,-88d),(9
12801305
(1 row)
12811306

12821307
--- spoly && spoly
1283-
--- should be true
1308+
--- should be true
12841309
SELECT spoly '{(0d,0d),(0d,0.5d),(0.5d,0.5d),(0.5d,0d)}' && spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}';
12851310
?column?
12861311
----------
@@ -1417,7 +1442,6 @@ SELECT spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}' && spoly '{(179d,-1d),(179d
14171442
--
14181443
-- ellipse and polygon
14191444
--
1420-
14211445
-- negators , commutator @,&&
14221446
SELECT spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' @ sellipse '<{10d,5d},(280d,-20d),90d>';
14231447
?column?
@@ -1564,49 +1588,49 @@ SELECT sellipse '<{10d,5d},(280d,-20d),90d>' !&& spoly '{(280d,-11d),(280d,-12
15641588
(1 row)
15651589

15661590
-- ellipse is point
1567-
SELECT spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' @ sellipse '<{0d,0d},(280d,-20d),90d>';
1591+
SELECT spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' @ sellipse '<{0d,0d},(280d,-20d),90d>';
15681592
?column?
15691593
----------
15701594
f
15711595
(1 row)
15721596

1573-
SELECT spoly '{(280d,-11d),(280d,-20d),(279d, -12d)}' @ sellipse '<{0d,0d},(280d,-20d),90d>';
1597+
SELECT spoly '{(280d,-11d),(280d,-20d),(279d, -12d)}' @ sellipse '<{0d,0d},(280d,-20d),90d>';
15741598
?column?
15751599
----------
15761600
f
15771601
(1 row)
15781602

1579-
SELECT spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' && sellipse '<{0d,0d},(280d,-20d),90d>';
1603+
SELECT spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' && sellipse '<{0d,0d},(280d,-20d),90d>';
15801604
?column?
15811605
----------
15821606
f
15831607
(1 row)
15841608

1585-
SELECT spoly '{(280d,-11d),(280d,-20d),(279d, -12d)}' && sellipse '<{0d,0d},(280d,-20d),90d>';
1609+
SELECT spoly '{(280d,-11d),(280d,-20d),(279d, -12d)}' && sellipse '<{0d,0d},(280d,-20d),90d>';
15861610
?column?
15871611
----------
15881612
t
15891613
(1 row)
15901614

1591-
SELECT sellipse '<{0d,0d},(280d,-20d),90d>' @ spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' ;
1615+
SELECT sellipse '<{0d,0d},(280d,-20d),90d>' @ spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' ;
15921616
?column?
15931617
----------
15941618
f
15951619
(1 row)
15961620

1597-
SELECT sellipse '<{0d,0d},(280d,-20d),90d>' @ spoly '{(280d,-11d),(280d,-20d),(279d, -12d)}';
1621+
SELECT sellipse '<{0d,0d},(280d,-20d),90d>' @ spoly '{(280d,-11d),(280d,-20d),(279d, -12d)}';
15981622
?column?
15991623
----------
16001624
t
16011625
(1 row)
16021626

1603-
SELECT sellipse '<{0d,0d},(280d,-20d),90d>' && spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' ;
1627+
SELECT sellipse '<{0d,0d},(280d,-20d),90d>' && spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' ;
16041628
?column?
16051629
----------
16061630
f
16071631
(1 row)
16081632

1609-
SELECT sellipse '<{0d,0d},(280d,-20d),90d>' && spoly '{(280d,-11d),(280d,-20d),(279d, -12d)}';
1633+
SELECT sellipse '<{0d,0d},(280d,-20d),90d>' && spoly '{(280d,-11d),(280d,-20d),(279d, -12d)}';
16101634
?column?
16111635
----------
16121636
t

Diff for: pgs_polygon.sql.in

+9-1
Original file line numberDiff line numberDiff line change
@@ -948,6 +948,15 @@ CREATE FUNCTION spoly(float8[])
948948
COMMENT ON FUNCTION spoly(float8[]) IS
949949
'creates spoly from array of numbers in radians';
950950

951+
CREATE FUNCTION spoly(spoint[])
952+
RETURNS spoly
953+
AS 'MODULE_PATHNAME', 'spherepoly_from_point_array'
954+
LANGUAGE 'c'
955+
IMMUTABLE STRICT PARALLEL SAFE;
956+
957+
COMMENT ON FUNCTION spoly(spoint[]) IS
958+
'creates spoly from an array of points';
959+
951960
CREATE FUNCTION spoly_deg(float8[])
952961
RETURNS spoly
953962
AS 'MODULE_PATHNAME', 'spherepoly_deg'
@@ -987,7 +996,6 @@ CREATE AGGREGATE spoly (
987996
finalfunc = spoly_add_points_fin_aggr
988997
);
989998

990-
991999
--
9921000
-- polygon is convex
9931001
--

Diff for: sql/poly.sql

+40-26
Original file line numberDiff line numberDiff line change
@@ -7,31 +7,31 @@ SET extra_float_digits = 0;
77

88
\set poly 'spoly \'{(0.1,0),(0.2,0),(0.2,0.1),(0.3,0.1),(0.3,-0.1),(0.4,-0.1),(0.5,0.1),(0.4,0.2),(0.1,0.2)}\''
99
SELECT spoint '(0.15,0.10)' @ :poly; -- point inside polygon
10-
SELECT spoint '(0.20,0.00)' @ :poly; -- point contained polygon
11-
SELECT spoint '(0.10,0.10)' @ :poly; -- point contained polygon
12-
SELECT spoint '(0.25,0.50)' @ :poly; -- point outside polygon
13-
SELECT spoint '(0.25,0.00)' @ :poly; -- point outside polygon
10+
SELECT spoint '(0.20,0.00)' @ :poly; -- point contained polygon
11+
SELECT spoint '(0.10,0.10)' @ :poly; -- point contained polygon
12+
SELECT spoint '(0.25,0.50)' @ :poly; -- point outside polygon
13+
SELECT spoint '(0.25,0.00)' @ :poly; -- point outside polygon
1414
SELECT scircle '<(0.15,0.10),0.03>' @ :poly; -- circle inside polygon
15-
SELECT scircle '<(0.20,0.00),0.00>' @ :poly; -- circle contained polygon
16-
SELECT scircle '<(0.20,0.30),0.05>' @ :poly; -- circle outside polygon
15+
SELECT scircle '<(0.20,0.00),0.00>' @ :poly; -- circle contained polygon
16+
SELECT scircle '<(0.20,0.30),0.05>' @ :poly; -- circle outside polygon
1717
SELECT scircle '<(0.25,0.00),0.05>' @ :poly; -- circle overlaps polygon
1818
SELECT scircle '<(0.25,0.00),0.10>' @ :poly; -- circle overlaps polygon
1919
SELECT scircle '<(0.15,0.10),0.03>' && :poly; -- circle inside polygon
20-
SELECT scircle '<(0.20,0.00),0.00>' && :poly; -- circle contained polygon
21-
SELECT scircle '<(0.20,0.30),0.05>' && :poly; -- circle outside polygon
20+
SELECT scircle '<(0.20,0.00),0.00>' && :poly; -- circle contained polygon
21+
SELECT scircle '<(0.20,0.30),0.05>' && :poly; -- circle outside polygon
2222
SELECT scircle '<(0.25,0.00),0.05>' && :poly; -- circle overlaps polygon
2323
SELECT scircle '<(0.25,0.00),0.10>' && :poly; -- circle overlaps polygon
24-
SELECT sline ( spoint '(0.00, 0.00)', spoint '(0.10,0.20)' ) @ :poly; -- line touches polygon
25-
SELECT sline ( spoint '(0.00, 0.10)', spoint '(0.10,0.10)' ) @ :poly; -- line touches polygon
24+
SELECT sline ( spoint '(0.00, 0.00)', spoint '(0.10,0.20)' ) @ :poly; -- line touches polygon
25+
SELECT sline ( spoint '(0.00, 0.10)', spoint '(0.10,0.10)' ) @ :poly; -- line touches polygon
2626
SELECT sline ( spoint '(0.50, 0.00)', spoint '(0.50,0.20)' ) @ :poly; -- line touches polygon
27-
SELECT sline ( spoint '(0.10, 0.20)', spoint '(0.20,0.00)' ) @ :poly; -- line touches and inside polygon
27+
SELECT sline ( spoint '(0.10, 0.20)', spoint '(0.20,0.00)' ) @ :poly; -- line touches and inside polygon
2828
SELECT sline ( spoint '(0.45,-0.20)', spoint '(0.45,0.20)' ) @ :poly; -- line overlaps polygon
2929
SELECT sline ( spoint '(0.45, 0.10)', spoint '(0.45,0.20)' ) @ :poly; -- line overlaps polygon
3030
SELECT sline ( spoint '(0.24, 0.17)', spoint '(0.25,0.14)' ) @ :poly; -- line inside polygon
31-
SELECT sline ( spoint '(0.00, 0.00)', spoint '(0.10,0.20)' ) && :poly; -- line touches polygon
32-
SELECT sline ( spoint '(0.00, 0.10)', spoint '(0.10,0.10)' ) && :poly; -- line touches polygon
31+
SELECT sline ( spoint '(0.00, 0.00)', spoint '(0.10,0.20)' ) && :poly; -- line touches polygon
32+
SELECT sline ( spoint '(0.00, 0.10)', spoint '(0.10,0.10)' ) && :poly; -- line touches polygon
3333
SELECT sline ( spoint '(0.50, 0.00)', spoint '(0.50,0.20)' ) && :poly; -- line touches polygon
34-
SELECT sline ( spoint '(0.10, 0.20)', spoint '(0.20,0.00)' ) && :poly; -- line touches and inside polygon
34+
SELECT sline ( spoint '(0.10, 0.20)', spoint '(0.20,0.00)' ) && :poly; -- line touches and inside polygon
3535
SELECT sline ( spoint '(0.45,-0.20)', spoint '(0.45,0.20)' ) && :poly; -- line overlaps polygon
3636
SELECT sline ( spoint '(0.45, 0.10)', spoint '(0.45,0.20)' ) && :poly; -- line overlaps polygon
3737
SELECT sline ( spoint '(0.24, 0.17)', spoint '(0.25,0.14)' ) && :poly; -- line inside polygon
@@ -86,7 +86,21 @@ SELECT spoly_deg(ARRAY[1.0, 2.0, 3.0, 4.0, 5.0, 6.0]);
8686

8787
SELECT spoly_deg(ARRAY[10.0, 0.0, 10.0, 1.0, 15.0, 0.0]);
8888

89-
-- incorrect input -----
89+
--- Constructors
90+
91+
SELECT spoly(NULL::spoint[]);
92+
93+
SELECT spoly(ARRAY[]::spoint[]);
94+
95+
SELECT spoly(ARRAY[spoint_deg(0, 0)]);
96+
97+
SELECT spoly(ARRAY[spoint_deg(0, 0), spoint_deg(10, 0)]);
98+
99+
SELECT spoly(ARRAY[spoint_deg(0, 0), spoint_deg(10, 0), spoint_deg(10,10)]);
100+
101+
SELECT spoly(ARRAY[spoint_deg(0, 0), spoint_deg(10, 0), spoint_deg(10,10), spoint_deg(0, 10)]);
102+
103+
--- incorrect input -----
90104

91105
SELECT spoly '{(10d,0d),(10d,1d)}';
92106

@@ -457,7 +471,7 @@ SELECT spoly '{(0d,-88d),(90d,-88d),(180d,-88d),(270d,-88d)}' @ spoly '{(0d,89d)
457471

458472
--- spoly ~ spoly
459473

460-
--- should be true
474+
--- should be true
461475

462476
SELECT spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}' ~ spoly '{(0d,0d),(0d,0.5d),(0.5d,0.5d),(0.5d,0d)}';
463477

@@ -485,7 +499,7 @@ SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}' ~ spoly '{(0d,-88d),(9
485499

486500
--- spoly && spoly
487501

488-
--- should be true
502+
--- should be true
489503

490504
SELECT spoly '{(0d,0d),(0d,0.5d),(0.5d,0.5d),(0.5d,0d)}' && spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}';
491505

@@ -536,7 +550,7 @@ SELECT spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}' && spoly '{(179d,-1d),(179d
536550
--
537551
-- ellipse and polygon
538552
--
539-
553+
540554
-- negators , commutator @,&&
541555

542556
SELECT spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' @ sellipse '<{10d,5d},(280d,-20d),90d>';
@@ -565,14 +579,14 @@ SELECT sellipse '<{10d,5d},(280d,-20d),90d>' !&& spoly '{(280d, -9d),(280d,-12
565579
SELECT sellipse '<{10d,5d},(280d,-20d),90d>' !&& spoly '{(280d,-11d),(280d,-12d),(279d, -12d)}';
566580

567581
-- ellipse is point
568-
SELECT spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' @ sellipse '<{0d,0d},(280d,-20d),90d>';
569-
SELECT spoly '{(280d,-11d),(280d,-20d),(279d, -12d)}' @ sellipse '<{0d,0d},(280d,-20d),90d>';
570-
SELECT spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' && sellipse '<{0d,0d},(280d,-20d),90d>';
571-
SELECT spoly '{(280d,-11d),(280d,-20d),(279d, -12d)}' && sellipse '<{0d,0d},(280d,-20d),90d>';
572-
SELECT sellipse '<{0d,0d},(280d,-20d),90d>' @ spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' ;
573-
SELECT sellipse '<{0d,0d},(280d,-20d),90d>' @ spoly '{(280d,-11d),(280d,-20d),(279d, -12d)}';
574-
SELECT sellipse '<{0d,0d},(280d,-20d),90d>' && spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' ;
575-
SELECT sellipse '<{0d,0d},(280d,-20d),90d>' && spoly '{(280d,-11d),(280d,-20d),(279d, -12d)}';
582+
SELECT spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' @ sellipse '<{0d,0d},(280d,-20d),90d>';
583+
SELECT spoly '{(280d,-11d),(280d,-20d),(279d, -12d)}' @ sellipse '<{0d,0d},(280d,-20d),90d>';
584+
SELECT spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' && sellipse '<{0d,0d},(280d,-20d),90d>';
585+
SELECT spoly '{(280d,-11d),(280d,-20d),(279d, -12d)}' && sellipse '<{0d,0d},(280d,-20d),90d>';
586+
SELECT sellipse '<{0d,0d},(280d,-20d),90d>' @ spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' ;
587+
SELECT sellipse '<{0d,0d},(280d,-20d),90d>' @ spoly '{(280d,-11d),(280d,-20d),(279d, -12d)}';
588+
SELECT sellipse '<{0d,0d},(280d,-20d),90d>' && spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' ;
589+
SELECT sellipse '<{0d,0d},(280d,-20d),90d>' && spoly '{(280d,-11d),(280d,-20d),(279d, -12d)}';
576590

577591
-- ellipse is circle
578592
SELECT spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' @ sellipse '<{5d,5d},(280d,-20d),90d>';

0 commit comments

Comments
 (0)