Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit6720f3a

Browse files
authored
Merge pull request#43 from ggnmstr/poly_convex
Add spoly_is_convex
2 parents4fafc35 +d8470f8 commit6720f3a

File tree

9 files changed

+147
-9
lines changed

9 files changed

+147
-9
lines changed

‎doc/functions.sgm

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -618,6 +618,33 @@
618618
</programlisting>
619619
</example>
620620
</sect3>
621+
622+
<sect3 id="funcs.spoly.isconvex">
623+
<title>
624+
Spoly is convex
625+
</title>
626+
<para>
627+
Returns true if the specified spherical polygon is convex.
628+
Returns false otherwise.
629+
</para>
630+
<funcsynopsis>
631+
<funcprototype>
632+
<funcdef><function>spoly_is_convex</function></funcdef>
633+
<paramdef>spoly <parameter>polygon</parameter></paramdef>
634+
</funcprototype>
635+
</funcsynopsis>
636+
<example>
637+
<title>Check if polygon is convex</title>
638+
<programlisting>
639+
<![CDATA[sql> SELECT spoly_is_convex( spoly '{(0,0),(1,0),(1,1),(1,2)}' );]]>
640+
<![CDATA[ spoly_is_convex]]>
641+
<![CDATA[-----------------]]>
642+
<![CDATA[ t]]>
643+
<![CDATA[ (1 row)]]>
644+
</programlisting>
645+
</example>
646+
</sect3>
647+
621648
</sect2>
622649

623650
<sect2 id="funcs.sbox">

‎expected/init_test.out.in

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,12 @@ psql:pg_sphere.test.sql:158: NOTICE: argument type spath is only a shell
2424
psql:pg_sphere.test.sql:177: NOTICE: type "sbox" is not yet defined
2525
DETAIL: Creating a shell type definition.
2626
psql:pg_sphere.test.sql:184: NOTICE: argument type sbox is only a shell
27-
psql:pg_sphere.test.sql:8644: NOTICE: type "spherekey" is not yet defined
27+
psql:pg_sphere.test.sql:8658: NOTICE: type "spherekey" is not yet defined
2828
DETAIL: Creating a shell type definition.
29-
psql:pg_sphere.test.sql:8651: NOTICE: argument type spherekey is only a shell
30-
psql:pg_sphere.test.sql:8665: NOTICE: type "pointkey" is not yet defined
29+
psql:pg_sphere.test.sql:8665: NOTICE: argument type spherekey is only a shell
30+
psql:pg_sphere.test.sql:8679: NOTICE: type "pointkey" is not yet defined
3131
DETAIL: Creating a shell type definition.
32-
psql:pg_sphere.test.sql:8672: NOTICE: argument type pointkey is only a shell
33-
psql:pg_sphere.test.sql:8678: NOTICE: argument type pointkey is only a shell
34-
psql:pg_sphere.test.sql:8684: NOTICE: argument type pointkey is only a shell
35-
psql:pg_sphere.test.sql:8690: NOTICE: argument type pointkey is only a shell
32+
psql:pg_sphere.test.sql:8686: NOTICE: argument type pointkey is only a shell
33+
psql:pg_sphere.test.sql:8692: NOTICE: argument type pointkey is only a shell
34+
psql:pg_sphere.test.sql:8698: NOTICE: argument type pointkey is only a shell
35+
psql:pg_sphere.test.sql:8704: NOTICE: argument type pointkey is only a shell

‎expected/init_test_healpix.out.in

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
psql:pg_sphere.test.sql:9257: NOTICE: return type smoc is only a shell
2-
psql:pg_sphere.test.sql:9263: NOTICE: argument type smoc is only a shell
1+
psql:pg_sphere.test.sql:9271: NOTICE: return type smoc is only a shell
2+
psql:pg_sphere.test.sql:9277: NOTICE: argument type smoc is only a shell

‎expected/poly.out

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1799,3 +1799,28 @@ SELECT spoly_as_array( spoly '{(0,0),(1,0),(1,1)}' );
17991799
{"(0 , 0)","(1 , 0)","(1 , 1)"}
18001800
(1 row)
18011801

1802+
-- spoly is convex
1803+
SELECT spoly_is_convex(spoly'{(53d 45m 35.0s, 37d 6m 30.0s), (52d 21m 36.0s, 41d 36m 7.0s), (54d 14m 18.0s, 45d 1m 35.0s), (51d 23m 3.0s, 45d 22m 49.0s), (51d 2m 12.0s, 41d 52m 1.0s), (50d 41m 47.0s, 38d 22m 0s) }');
1804+
spoly_is_convex
1805+
-----------------
1806+
f
1807+
(1 row)
1808+
1809+
SELECT spoly_is_convex(spoly'{(12d,32d),(34d,12d),(59d,21d),(69d,21d)}');
1810+
spoly_is_convex
1811+
-----------------
1812+
f
1813+
(1 row)
1814+
1815+
SELECT spoly_is_convex(spoly'{(12d,32d),(34d,12d),(59d,21d),(34d,40d)}');
1816+
spoly_is_convex
1817+
-----------------
1818+
t
1819+
(1 row)
1820+
1821+
SELECT spoly_is_convex(NULL);
1822+
spoly_is_convex
1823+
-----------------
1824+
f
1825+
(1 row)
1826+

‎pgs_polygon.sql.in

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -973,3 +973,17 @@ CREATE AGGREGATE spoly (
973973
stype = spoly,
974974
finalfunc = spoly_add_points_fin_aggr
975975
);
976+
977+
978+
--
979+
-- polygon is convex
980+
--
981+
982+
CREATE FUNCTION spoly_is_convex(spoly)
983+
RETURNS BOOL
984+
AS 'MODULE_PATHNAME', 'spherepoly_is_convex'
985+
LANGUAGE 'c'
986+
IMMUTABLE PARALLEL SAFE;
987+
988+
COMMENT ON FUNCTION spoly_is_convex(spoly) IS
989+
'true if spherical polygon is convex';

‎sql/poly.sql

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -616,3 +616,9 @@ SELECT spoint( spoly '{(0,0),(1,0),(1,1)}', 1 );
616616
SELECT spoint( spoly'{(0,0),(1,0),(1,1)}',2 );
617617
SELECT spoint( spoly'{(0,0),(1,0),(1,1)}',3 );
618618
SELECT spoly_as_array( spoly'{(0,0),(1,0),(1,1)}' );
619+
620+
-- spoly is convex
621+
SELECT spoly_is_convex(spoly'{(53d 45m 35.0s, 37d 6m 30.0s), (52d 21m 36.0s, 41d 36m 7.0s), (54d 14m 18.0s, 45d 1m 35.0s), (51d 23m 3.0s, 45d 22m 49.0s), (51d 2m 12.0s, 41d 52m 1.0s), (50d 41m 47.0s, 38d 22m 0s) }');
622+
SELECT spoly_is_convex(spoly'{(12d,32d),(34d,12d),(59d,21d),(69d,21d)}');
623+
SELECT spoly_is_convex(spoly'{(12d,32d),(34d,12d),(59d,21d),(34d,40d)}');
624+
SELECT spoly_is_convex(NULL);

‎src/polygon.c

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ PG_FUNCTION_INFO_V1(spheretrans_poly);
5959
PG_FUNCTION_INFO_V1(spheretrans_poly_inverse);
6060
PG_FUNCTION_INFO_V1(spherepoly_add_point);
6161
PG_FUNCTION_INFO_V1(spherepoly_add_points_finalize);
62+
PG_FUNCTION_INFO_V1(spherepoly_is_convex);
6263

6364

6465
/*
@@ -1531,3 +1532,54 @@ spherepoly_add_points_finalize(PG_FUNCTION_ARGS)
15311532
}
15321533
PG_RETURN_POINTER(poly);
15331534
}
1535+
1536+
1537+
Datum
1538+
spherepoly_is_convex(PG_FUNCTION_ARGS)
1539+
{
1540+
Vector3Du,
1541+
v,
1542+
vsu,
1543+
wsv,
1544+
crs;
1545+
int32i;
1546+
float8cur=0.0,
1547+
prev=0.0;
1548+
SPOLY*poly= (SPOLY*)PG_GETARG_POINTER(0);
1549+
1550+
if (poly==NULL)
1551+
{
1552+
PG_RETURN_BOOL(false);
1553+
}
1554+
1555+
poly=PG_GETARG_SPOLY(0);
1556+
if (poly->npts==3)
1557+
{
1558+
PG_RETURN_BOOL(true);
1559+
}
1560+
1561+
for (i=0;i<poly->npts;i++)
1562+
{
1563+
constintj= (i-1+poly->npts) %poly->npts;
1564+
constintk= (i+1) %poly->npts;
1565+
1566+
spoint_vector3d(&u,&poly->p[i]);
1567+
spoint_vector3d(&v,&poly->p[j]);
1568+
spoint_vector3d(&vsu,&poly->p[j]);
1569+
spoint_vector3d(&wsv,&poly->p[k]);
1570+
1571+
vector3d_addwithscalar(&vsu,-1,&u);
1572+
vector3d_addwithscalar(&wsv,-1,&v);
1573+
1574+
vector3d_cross(&crs,&vsu,&wsv);
1575+
1576+
cur=vector3d_scalar(&crs,&v);
1577+
if (cur*prev<0)
1578+
{
1579+
PG_RETURN_BOOL(false);
1580+
}
1581+
prev=cur;
1582+
}
1583+
1584+
PG_RETURN_BOOL(true);
1585+
}

‎src/polygon.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -358,4 +358,9 @@ Datumspherepoly_add_points_finalize(PG_FUNCTION_ARGS);
358358
*/
359359
Datumspherepoly_get_array(PG_FUNCTION_ARGS);
360360

361+
/*
362+
* Checks whether a polygon is convex
363+
*/
364+
Datumspherepoly_is_convex(PG_FUNCTION_ARGS);
365+
361366
#endif

‎upgrade_scripts/pg_sphere--1.2.3--1.3.0.sql.in

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,3 +93,12 @@ CREATE OPERATOR <-> (
9393

9494
COMMENT ON OPERATOR <-> (spoint, sline) IS
9595
'returns the distance between spherical line and spherical point';
96+
97+
CREATE FUNCTION spoly_is_convex(spoly)
98+
RETURNS BOOL
99+
AS 'MODULE_PATHNAME', 'spherepoly_is_convex'
100+
LANGUAGE 'c'
101+
IMMUTABLE PARALLEL SAFE;
102+
103+
COMMENT ON FUNCTION spoly_is_convex(spoly) IS
104+
'true if spherical polygon is convex';

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp