PostGIS  3.0.6dev-r@@SVN_REVISION@@

◆ gidx_union_volume()

static float gidx_union_volume ( GIDX *  a,
GIDX *  b 
)
static

Definition at line 246 of file gserialized_gist_nd.c.

247 {
248  float result;
249  int i;
250  int ndims_a, ndims_b;
251 
252  POSTGIS_DEBUG(5, "entered function");
253 
254  if (!a && !b)
255  {
256  elog(ERROR, "gidx_union_volume received two null arguments");
257  return 0.0;
258  }
259 
260  if (!a || gidx_is_unknown(a))
261  return gidx_volume(b);
262 
263  if (!b || gidx_is_unknown(b))
264  return gidx_volume(a);
265 
266  if (gidx_is_unknown(a) && gidx_is_unknown(b))
267  return 0.0;
268 
269  /* Ensure 'a' has the most dimensions. */
271 
272  ndims_a = GIDX_NDIMS(a);
273  ndims_b = GIDX_NDIMS(b);
274 
275  /* Initialize with maximal length of first dimension. */
276  result = Max(GIDX_GET_MAX(a, 0), GIDX_GET_MAX(b, 0)) - Min(GIDX_GET_MIN(a, 0), GIDX_GET_MIN(b, 0));
277 
278  /* Multiply by maximal length of remaining dimensions. */
279  for (i = 1; i < ndims_b; i++)
280  result *= (Max(GIDX_GET_MAX(a, i), GIDX_GET_MAX(b, i)) - Min(GIDX_GET_MIN(a, i), GIDX_GET_MIN(b, i)));
281 
282  /* Add in dimensions of higher dimensional box. */
283  for (i = ndims_b; i < ndims_a; i++)
284  result *= (GIDX_GET_MAX(a, i) - GIDX_GET_MIN(a, i));
285 
286  POSTGIS_DEBUGF(5, "volume( %s union %s ) = %.12g", gidx_to_string(a), gidx_to_string(b), result);
287 
288  return result;
289 }
bool gidx_is_unknown(const GIDX *a)
static float gidx_volume(GIDX *a)
static void gidx_dimensionality_check(GIDX **a, GIDX **b)

References gidx_dimensionality_check(), gidx_is_unknown(), and gidx_volume().

Referenced by gserialized_gist_penalty().

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