PostGIS  3.7.0dev-r@@SVN_REVISION@@

◆ 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)
Definition: intervaltree.c:168
static uint32_t itree_merge_nodes(IntervalTree *itree, uint32_t nodes_remaining)
Definition: intervaltree.c:116
static IntervalTreeNode * itree_new_node(IntervalTree *itree)
Definition: intervaltree.c:99
POINTARRAY * ptarray_clone(const POINTARRAY *ptarray)
Clone a POINTARRAY object.
Definition: ptarray.c:674
#define FP_MAX(A, B)
#define FP_MIN(A, B)
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
uint32_t edgeIndex
Definition: intervaltree.h:44
struct IntervalTreeNode * nodes
Definition: intervaltree.h:58
uint32_t numNodes
Definition: intervaltree.h:64
struct IntervalTreeNode ** indexes
Definition: intervaltree.h:59
POINTARRAY ** indexArrays
Definition: intervaltree.h:60
uint32_t numIndexes
Definition: intervaltree.h:61
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: