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

◆ 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}
char result[OUT_DOUBLE_BUFFER_SIZE]
Definition cu_print.c:267
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(), gidx_volume(), and result.

Referenced by gserialized_gist_penalty().

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