1643{
1645 uint64_t numedges = 1;
1646 uint64_t i;
1647 double minaz, maxaz;
1648 double az, azdif;
1649
1652
1653 if ( other ) {
1655 if ( azdif < 0 ) azdif += 2 * M_PI;
1656 minaz = maxaz = azdif;
1657
1661 } else {
1662 minaz = maxaz = -1;
1663 }
1664
1666 " and adjacent to azimuth %g", node,
data->myaz);
1667
1668
1670 if (numedges == UINT64_MAX)
1671 {
1673 return 0;
1674 }
1675
1676 LWDEBUGF(1,
"getEdgeByNode returned %llu edges, minaz=%g, maxaz=%g",
1677 numedges, minaz, maxaz);
1678
1679
1680 for ( i = 0; i < numedges; ++i )
1681 {
1687
1688 edge = &(edges[i]);
1689
1690 if ( edge->
edge_id == myedge_id )
continue;
1691
1693
1694
1697
1703 " does not have two distinct points", id);
1704 return -1;
1705 }}
1706
1710 {
1713 return -1;
1714 }
1717 ", edgeend is [%.15g %.15g,%.15g %.15g]",
1723 lwerror(
"error computing azimuth of edge %"
1725 id, p1.
x, p1.
y, p2.
x, p2.
y);
1726 return -1;
1727 }}
1728 azdif = az -
data->myaz;
1730 ": %.15g (diff: %.15g)", edge->
edge_id, az, azdif);
1731
1732 if ( azdif < 0 ) azdif += 2 * M_PI;
1733 if ( minaz == -1 ) {
1734 minaz = maxaz = azdif;
1739 ", outgoing, "
1741 " (face_right is new ccwFace, face_left is new cwFace)",
1744 } else {
1745 if ( azdif < minaz ) {
1749 ", outgoing, "
1751 " (previous had minaz=%g, face_left is new cwFace)",
1754 minaz = azdif;
1755 }
1756 else if ( azdif > maxaz ) {
1760 ", outgoing, "
1762 " (previous had maxaz=%g, face_right is new ccwFace)",
1765 maxaz = azdif;
1766 }
1767 }
1768 }
1769
1773 {
1776 return -1;
1777 }
1779 ", edgeend is [%.15g %.15g,%.15g %.15g]",
1785 lwerror(
"error computing azimuth of edge %"
1787 id, p1.
x, p1.
y, p2.
x, p2.
y);
1788 return -1;
1789 }}
1790 azdif = az -
data->myaz;
1792 ": %.15g (diff: %.15g)", edge->
edge_id, az, azdif);
1793 if ( azdif < 0 ) azdif += 2 * M_PI;
1794 if ( minaz == -1 ) {
1795 minaz = maxaz = azdif;
1800 ", incoming, "
1802 " (face_right is new cwFace, face_left is new ccwFace)",
1805 } else {
1806 if ( azdif < minaz ) {
1810 ", incoming, "
1812 " (previous had minaz=%g, face_right is new cwFace)",
1815 minaz = azdif;
1816 }
1817 else if ( azdif > maxaz ) {
1821 ", outgoing, from start point, "
1823 " (previous had maxaz=%g, face_left is new ccwFace)",
1826 maxaz = azdif;
1827 }
1828 }
1829 }
1830
1832 }
1834
1835 LWDEBUGF(1,
"edges adjacent to azimuth %g"
1838 data->myaz, node,
data->nextCW, minaz,
1839 data->nextCCW, maxaz);
1840
1841 if ( myedge_id < 1 && numedges && data->cwFace !=
data->ccwFace )
1842 {
1843 if (
data->cwFace != -1 &&
data->ccwFace != -1 ) {
1848 return -1;
1849 }
1850 }
1851
1852
1853 return numedges;
1854}
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)