1526{
1528 uint64_t numedges = 1;
1529 uint64_t i;
1530 double minaz, maxaz;
1531 double az, azdif;
1532
1535
1536 if ( other ) {
1538 if ( azdif < 0 ) azdif += 2 * M_PI;
1539 minaz = maxaz = azdif;
1540
1544 } else {
1545 minaz = maxaz = -1;
1546 }
1547
1549 " and adjacent to azimuth %g", node,
data->myaz);
1550
1551
1553 if (numedges == UINT64_MAX)
1554 {
1556 return 0;
1557 }
1558
1559 LWDEBUGF(1,
"getEdgeByNode returned %llu edges, minaz=%g, maxaz=%g",
1560 numedges, minaz, maxaz);
1561
1562
1563 for ( i = 0; i < numedges; ++i )
1564 {
1570
1571 edge = &(edges[i]);
1572
1573 if ( edge->
edge_id == myedge_id )
continue;
1574
1576
1577
1580
1586 " does not have two distinct points", id);
1587 return -1;
1588 }}
1589
1593 {
1596 return -1;
1597 }
1600 ", edgeend is [%.15g %.15g,%.15g %.15g]",
1606 lwerror(
"error computing azimuth of edge %"
1608 id, p1.
x, p1.
y, p2.
x, p2.
y);
1609 return -1;
1610 }}
1611 azdif = az -
data->myaz;
1613 ": %.15g (diff: %.15g)", edge->
edge_id, az, azdif);
1614
1615 if ( azdif < 0 ) azdif += 2 * M_PI;
1616 if ( minaz == -1 ) {
1617 minaz = maxaz = azdif;
1622 ", outgoing, "
1624 " (face_right is new ccwFace, face_left is new cwFace)",
1627 } else {
1628 if ( azdif < minaz ) {
1632 ", outgoing, "
1634 " (previous had minaz=%g, face_left is new cwFace)",
1637 minaz = azdif;
1638 }
1639 else if ( azdif > maxaz ) {
1643 ", outgoing, "
1645 " (previous had maxaz=%g, face_right is new ccwFace)",
1648 maxaz = azdif;
1649 }
1650 }
1651 }
1652
1656 {
1659 return -1;
1660 }
1662 ", edgeend is [%.15g %.15g,%.15g %.15g]",
1668 lwerror(
"error computing azimuth of edge %"
1670 id, p1.
x, p1.
y, p2.
x, p2.
y);
1671 return -1;
1672 }}
1673 azdif = az -
data->myaz;
1675 ": %.15g (diff: %.15g)", edge->
edge_id, az, azdif);
1676 if ( azdif < 0 ) azdif += 2 * M_PI;
1677 if ( minaz == -1 ) {
1678 minaz = maxaz = azdif;
1683 ", incoming, "
1685 " (face_right is new cwFace, face_left is new ccwFace)",
1688 } else {
1689 if ( azdif < minaz ) {
1693 ", incoming, "
1695 " (previous had minaz=%g, face_right is new cwFace)",
1698 minaz = azdif;
1699 }
1700 else if ( azdif > maxaz ) {
1704 ", outgoing, from start point, "
1706 " (previous had maxaz=%g, face_left is new ccwFace)",
1709 maxaz = azdif;
1710 }
1711 }
1712 }
1713
1715 }
1717
1718 LWDEBUGF(1,
"edges adjacent to azimuth %g"
1721 data->myaz, node,
data->nextCW, minaz,
1722 data->nextCCW, maxaz);
1723
1724 if ( myedge_id < 1 && numedges && data->cwFace !=
data->ccwFace )
1725 {
1726 if (
data->cwFace != -1 &&
data->ccwFace != -1 ) {
1731 return -1;
1732 }
1733 }
1734
1735
1736 return numedges;
1737}
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 PGTOPO_BE_ERROR()
#define LWDEBUGF(level, msg,...)
void void lwerror(const char *fmt,...) __attribute__((format(printf
Write a notice out to the error handler.
void _lwt_release_edges(LWT_ISO_EDGE *edges, int num_edges)
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, const POINT2D *ref, int from, int dir, POINT2D *op)