diff --git a/expected/poly.out b/expected/poly.out index a705483..180e06f 100644 --- a/expected/poly.out +++ b/expected/poly.out @@ -350,6 +350,15 @@ SELECT spoly '{(0d,0d),(10d,10d),(0d,10d),(10d,0d)}'; ERROR: spherepoly_from_array: a line segment overlaps or polygon too large LINE 1: SELECT spoly '{(0d,0d),(10d,10d),(0d,10d),(10d,0d)}'; ^ +--- degenerate polygons ----- +SELECT spoly '{(0d,1d),(0d,2d),(0d,3d)}'; +ERROR: spherepoly_from_array: a line segment overlaps or polygon too large +LINE 1: SELECT spoly '{(0d,1d),(0d,2d),(0d,3d)}'; + ^ +SELECT spoly '{(1d,0d),(2d,0d),(3d,0d)}'; +ERROR: spherepoly_from_array: a line segment overlaps or polygon too large +LINE 1: SELECT spoly '{(1d,0d),(2d,0d),(3d,0d)}'; + ^ --- functions SELECT npoints( spoly '{(10d,0d),(10d,1d),(15d,0d)}'); npoints diff --git a/sql/poly.sql b/sql/poly.sql index 52cedd7..bdfbef8 100644 --- a/sql/poly.sql +++ b/sql/poly.sql @@ -96,6 +96,12 @@ SELECT spoly_deg(NULL::float8[]); SELECT spoly '{(0d,0d),(10d,10d),(0d,10d),(10d,0d)}'; +--- degenerate polygons ----- + +SELECT spoly '{(0d,1d),(0d,2d),(0d,3d)}'; + +SELECT spoly '{(1d,0d),(2d,0d),(3d,0d)}'; + --- functions SELECT npoints( spoly '{(10d,0d),(10d,1d),(15d,0d)}'); diff --git a/src/line.c b/src/line.c index 315adfb..b8d1195 100644 --- a/src/line.c +++ b/src/line.c @@ -494,15 +494,6 @@ sline_sline_pos(const SLine *l1, const SLine *l2) vector3d_spoint(&p[2], &v[1][0]); vector3d_spoint(&p[3], &v[1][1]); - /* check connected lines */ - if (FPgt(il2->length, 0.0) && (vector3d_eq(&v[0][0], &v[1][0]) || - vector3d_eq(&v[0][0], &v[1][1]) || - vector3d_eq(&v[0][1], &v[1][0]) || - vector3d_eq(&v[0][1], &v[1][1]))) - { - return PGS_LINE_CONNECT; - } - /* Check, sl2 is at equator */ if (FPzero(p[2].lat) && FPzero(p[3].lat)) { @@ -527,6 +518,15 @@ sline_sline_pos(const SLine *l1, const SLine *l2) return PGS_LINE_AVOID; } + /* check connected lines */ + if (FPgt(il2->length, 0.0) && (vector3d_eq(&v[0][0], &v[1][0]) || + vector3d_eq(&v[0][0], &v[1][1]) || + vector3d_eq(&v[0][1], &v[1][0]) || + vector3d_eq(&v[0][1], &v[1][1]))) + { + return PGS_LINE_CONNECT; + } + /* Now sl2 is not at equator */ if (FPle(il2->length, seg_length))