PostGIS 3.7.0dev-r@@SVN_REVISION@@
Loading...
Searching...
No Matches

◆ itree_add_pointarray()

static void itree_add_pointarray ( IntervalTree itree,
const POINTARRAY pa 
)
static

Definition at line 185 of file intervaltree.c.

186{
187 uint32_t nodes_remaining = 0;
188 uint32_t leaf_nodes = 0;
189 IntervalTreeNode *root = NULL;
190
191 /* EMPTY/unusable ring */
192 if (!pa || pa->npoints < 4)
193 lwerror("%s called with unusable ring", __func__);
194
195 /* fill in the leaf nodes */
196 for (uint32_t i = 0; i < pa->npoints-1; i++)
197 {
198 const POINT2D *pt1 = getPoint2d_cp(pa, i);
199 const POINT2D *pt2 = getPoint2d_cp(pa, i+1);
200
201 /* Do not add nodes for zero length segments */
202 if (itree_edge_invalid(pt1, pt2))
203 continue;
204
205 /* get a fresh node for each segment of the ring */
206 IntervalTreeNode *node = itree_new_node(itree);
207 node->min = FP_MIN(pt1->y, pt2->y);
208 node->max = FP_MAX(pt1->y, pt2->y);
209 node->edgeIndex = i;
210 leaf_nodes++;
211 }
212
213 /* merge leaf nodes up to parents */
214 nodes_remaining = leaf_nodes;
215 while (nodes_remaining > 1)
216 nodes_remaining = itree_merge_nodes(itree, nodes_remaining);
217
218 /* final parent is the root */
219 if (leaf_nodes > 0)
220 root = &(itree->nodes[itree->numNodes - 1]);
221 else
222 root = NULL;
223
224 /*
225 * take a copy of the point array we built this
226 * tree on top of so we can reference it to get
227 * segment information later
228 */
229 itree->indexes[itree->numIndexes] = root;
230 itree->indexArrays[itree->numIndexes] = ptarray_clone(pa);
231 itree->numIndexes += 1;
232
233 return;
234}
static int itree_edge_invalid(const POINT2D *pt1, const POINT2D *pt2)
static uint32_t itree_merge_nodes(IntervalTree *itree, uint32_t nodes_remaining)
static IntervalTreeNode * itree_new_node(IntervalTree *itree)
#define FP_MAX(A, B)
#define FP_MIN(A, B)
POINTARRAY * ptarray_clone(const POINTARRAY *ptarray)
Clone a POINTARRAY object.
Definition ptarray.c:674
void void lwerror(const char *fmt,...) __attribute__((format(printf
Write a notice out to the error handler.
static const POINT2D * getPoint2d_cp(const POINTARRAY *pa, uint32_t n)
Returns a POINT2D pointer into the POINTARRAY serialized_ptlist, suitable for reading from.
Definition lwinline.h:97
struct IntervalTreeNode * nodes
uint32_t numNodes
struct IntervalTreeNode ** indexes
POINTARRAY ** indexArrays
uint32_t numIndexes
double y
Definition liblwgeom.h:390
uint32_t npoints
Definition liblwgeom.h:427

References IntervalTreeNode::edgeIndex, FP_MAX, FP_MIN, getPoint2d_cp(), IntervalTree::indexArrays, IntervalTree::indexes, itree_edge_invalid(), itree_merge_nodes(), itree_new_node(), lwerror(), IntervalTreeNode::max, IntervalTreeNode::min, IntervalTree::nodes, POINTARRAY::npoints, IntervalTree::numIndexes, IntervalTree::numNodes, ptarray_clone(), and POINT2D::y.

Referenced by itree_from_multipolygon(), and itree_from_polygon().

Here is the call graph for this function:
Here is the caller graph for this function: