1491{
1493 uint64_t numedges = 1;
1494 uint64_t i;
1495 double minaz, maxaz;
1496 double az, azdif;
1497
1500
1501 if ( other ) {
1503 if ( azdif < 0 ) azdif += 2 * M_PI;
1504 minaz = maxaz = azdif;
1505
1506 LWDEBUGF(1,
"Other edge end has cwFace=%d and ccwFace=%d",
1508 } else {
1509 minaz = maxaz = -1;
1510 }
1511
1513 " and adjacent to azimuth %g", node,
data->myaz);
1514
1515
1517 if (numedges == UINT64_MAX)
1518 {
1520 return 0;
1521 }
1522
1523 LWDEBUGF(1,
"getEdgeByNode returned %d edges, minaz=%g, maxaz=%g",
1524 numedges, minaz, maxaz);
1525
1526
1527 for ( i = 0; i < numedges; ++i )
1528 {
1534
1535 edge = &(edges[i]);
1536
1537 if ( edge->
edge_id == myedge_id )
continue;
1538
1540
1541
1544
1550 " does not have two distinct points", id);
1551 return -1;
1552 }}
1553
1557 {
1558 lwerror(
"Edge %d has no distinct vertices: [%.15g %.15g,%.15g %.15g]: ",
1560 return -1;
1561 }
1564 ", edgeend is %g,%g-%g,%g",
1570 lwerror(
"error computing azimuth of edge %d first edgeend [%.15g %.15g,%.15g %.15g]",
1571 id, p1.
x, p1.
y, p2.
x, p2.
y);
1572 return -1;
1573 }}
1574 azdif = az -
data->myaz;
1576 ": %g (diff: %g)", edge->
edge_id, az, azdif);
1577
1578 if ( azdif < 0 ) azdif += 2 * M_PI;
1579 if ( minaz == -1 ) {
1580 minaz = maxaz = azdif;
1585 ", outgoing, "
1587 " (face_right is new ccwFace, face_left is new cwFace)",
1590 } else {
1591 if ( azdif < minaz ) {
1595 ", outgoing, "
1597 " (previous had minaz=%g, face_left is new cwFace)",
1600 minaz = azdif;
1601 }
1602 else if ( azdif > maxaz ) {
1606 ", outgoing, "
1608 " (previous had maxaz=%g, face_right is new ccwFace)",
1611 maxaz = azdif;
1612 }
1613 }
1614 }
1615
1619 {
1620 lwerror(
"Edge %d has no distinct vertices: [%.15g %.15g,%.15g %.15g]: ",
1622 return -1;
1623 }
1625 ", edgeend is %g,%g-%g,%g",
1631 lwerror(
"error computing azimuth of edge %d last edgeend [%.15g %.15g,%.15g %.15g]",
1632 id, p1.
x, p1.
y, p2.
x, p2.
y);
1633 return -1;
1634 }}
1635 azdif = az -
data->myaz;
1637 ": %g (diff: %g)", edge->
edge_id, az, azdif);
1638 if ( azdif < 0 ) azdif += 2 * M_PI;
1639 if ( minaz == -1 ) {
1640 minaz = maxaz = azdif;
1645 ", incoming, "
1647 " (face_right is new cwFace, face_left is new ccwFace)",
1650 } else {
1651 if ( azdif < minaz ) {
1655 ", incoming, "
1657 " (previous had minaz=%g, face_right is new cwFace)",
1660 minaz = azdif;
1661 }
1662 else if ( azdif > maxaz ) {
1666 ", outgoing, from start point, "
1668 " (previous had maxaz=%g, face_left is new ccwFace)",
1671 maxaz = azdif;
1672 }
1673 }
1674 }
1675
1677 }
1679
1680 LWDEBUGF(1,
"edges adjacent to azimuth %g"
1683 data->myaz, node,
data->nextCW, minaz,
1684 data->nextCCW, maxaz);
1685
1686 if ( myedge_id < 1 && numedges && data->cwFace !=
data->ccwFace )
1687 {
1688 if (
data->cwFace != -1 &&
data->ccwFace != -1 ) {
1693 return -1;
1694 }
1695 }
1696
1697
1698 return numedges;
1699}
int azimuth_pt_pt(const POINT2D *p1, const POINT2D *p2, double *ret)
Compute the azimuth of segment AB in radians.
void lwgeom_free(LWGEOM *geom)
int getPoint2d_p(const POINTARRAY *pa, uint32_t n, POINT2D *point)
LWGEOM * lwline_as_lwgeom(const LWLINE *obj)
LWLINE * lwgeom_as_lwline(const LWGEOM *lwgeom)
LWGEOM * lwgeom_remove_repeated_points(const LWGEOM *in, double tolerance)
LWT_INT64 LWT_ELEMID
Identifier of topology element.
#define LWDEBUGF(level, msg,...)
void lwerror(const char *fmt,...)
Write a notice out to the error handler.
static LWT_ISO_EDGE * lwt_be_getEdgeByNode(LWT_TOPOLOGY *topo, const LWT_ELEMID *ids, uint64_t *numelems, int fields)
static int _lwt_FirstDistinctVertex2D(const POINTARRAY *pa, POINT2D *ref, int from, int dir, POINT2D *op)
const char * lwt_be_lastErrorMessage(const LWT_BE_IFACE *be)
static void _lwt_release_edges(LWT_ISO_EDGE *edges, int num_edges)
const LWT_BE_IFACE * be_iface