* Get first distinct vertex from endpoint
* @param pa the pointarray to seek points in
* @param ref the point we want to search a distinct one
- * @param from vertex index to start from
+ * @param from vertex index to start from (will really start from "from"+dir)
* @param dir 1 to go forward
* -1 to go backward
* @return 0 if edge is collapsed (no distinct points)
if ( edge->start_node == node ) {
getPoint2d_p(pa, 0, &p1);
- getPoint2d_p(pa, 1, &p2);
+ if ( ! _lwt_FirstDistinctVertex2D(pa, &p1, 0, 1, &p2) )
+ {
+ lwerror("Edge %d has no distinct vertices: [%.15g %.15g,%.15g %.15g]: ",
+ edge->edge_id, p1.x, p1.y, p2.x, p2.y);
+ return -1;
+ }
LWDEBUGF(1, "edge %" LWTFMT_ELEMID
" starts on node %" LWTFMT_ELEMID
", edgeend is %g,%g-%g,%g",
if ( edge->end_node == node ) {
getPoint2d_p(pa, pa->npoints-1, &p1);
- getPoint2d_p(pa, pa->npoints-2, &p2);
+ if ( ! _lwt_FirstDistinctVertex2D(pa, &p1, pa->npoints-1, -1, &p2) )
+ {
+ lwerror("Edge %d has no distinct vertices: [%.15g %.15g,%.15g %.15g]: ",
+ edge->edge_id, p1.x, p1.y, p2.x, p2.y);
+ return -1;
+ }
LWDEBUGF(1, "edge %" LWTFMT_ELEMID " ends on node %" LWTFMT_ELEMID
", edgeend is %g,%g-%g,%g",
edge->edge_id, node, p1.x, p1.y, p2.x, p2.y);
newedge.geom = geom;
newedge.face_left = -1;
newedge.face_right = -1;
+ /* TODO: should do the repeated points removal in 2D space */
cleangeom = lwgeom_remove_repeated_points( lwline_as_lwgeom(geom), 0 );
pa = lwgeom_as_lwline(cleangeom)->points;
span.cwFace = span.ccwFace =
epan.cwFace = epan.ccwFace = -1;
- /* Compute azimut of first edge end on start node */
+ /* Compute azimuth of first edge end on start node */
getPoint2d_p(pa, 0, &p1);
- getPoint2d_p(pa, 1, &pn);
- if ( p2d_same(&p1, &pn) ) {
+ if ( ! _lwt_FirstDistinctVertex2D(pa, &p1, 0, 1, &pn) )
+ {
lwgeom_free(cleangeom);
- /* Can still happen, for 2-point lines */
lwerror("Invalid edge (no two distinct vertices exist)");
return -1;
}
if ( ! azimuth_pt_pt(&p1, &pn, &span.myaz) ) {
lwgeom_free(cleangeom);
- lwerror("error computing azimuth of first edgeend [%g,%g-%g,%g]",
+ lwerror("error computing azimuth of first edgeend [%.15g %.15g,%.15g %.15g]",
p1.x, p1.y, pn.x, pn.y);
return -1;
}
/* Compute azimuth of last edge end on end node */
getPoint2d_p(pa, pa->npoints-1, &p2);
- getPoint2d_p(pa, pa->npoints-2, &pn);
+ if ( ! _lwt_FirstDistinctVertex2D(pa, &p2, pa->npoints-1, -1, &pn) )
+ {
+ lwgeom_free(cleangeom);
+ /* This should never happen as we checked the edge while computing first edgend */
+ lwerror("Invalid clean edge (no two distinct vertices exist) - should not happen");
+ return -1;
+ }
lwgeom_free(cleangeom);
if ( ! azimuth_pt_pt(&p2, &pn, &epan.myaz) ) {
- lwerror("error computing azimuth of last edgeend [%g,%g-%g,%g]",
+ lwerror("error computing azimuth of last edgeend [%.15g %.15g,%.15g %.15g]",
p2.x, p2.y, pn.x, pn.y);
return -1;
}