PostGIS  2.5.0dev-r@@SVN_REVISION@@
int point_interpolate ( const POINT4D p1,
const POINT4D p2,
POINT4D p,
int  hasz,
int  hasm,
char  ordinate,
double  interpolation_value 
)

Given two points, a dimensionality, an ordinate, and an interpolation value generate a new point that is proportionally between the input points, using the values in the provided dimension as the scaling factors.

Definition at line 322 of file lwlinearreferencing.c.

References FP_MAX, FP_MIN, LWDEBUGF, lwerror(), lwpoint_get_ordinate(), and lwpoint_set_ordinate().

Referenced by lwline_clip_to_ordinate_range(), and test_point_interpolate().

323 {
324  static char* dims = "XYZM";
325  double p1_value = lwpoint_get_ordinate(p1, ordinate);
326  double p2_value = lwpoint_get_ordinate(p2, ordinate);
327  double proportion;
328  int i = 0;
329 
330  if ( ! ( ordinate == 'X' || ordinate == 'Y' || ordinate == 'Z' || ordinate == 'M' ) )
331  {
332  lwerror("Cannot set %c ordinate.", ordinate);
333  return 0;
334  }
335 
336  if ( FP_MIN(p1_value, p2_value) > interpolation_value ||
337  FP_MAX(p1_value, p2_value) < interpolation_value )
338  {
339  lwerror("Cannot interpolate to a value (%g) not between the input points (%g, %g).", interpolation_value, p1_value, p2_value);
340  return 0;
341  }
342 
343  proportion = fabs((interpolation_value - p1_value) / (p2_value - p1_value));
344 
345  for ( i = 0; i < 4; i++ )
346  {
347  double newordinate = 0.0;
348  if ( dims[i] == 'Z' && ! hasz ) continue;
349  if ( dims[i] == 'M' && ! hasm ) continue;
350  p1_value = lwpoint_get_ordinate(p1, dims[i]);
351  p2_value = lwpoint_get_ordinate(p2, dims[i]);
352  newordinate = p1_value + proportion * (p2_value - p1_value);
353  lwpoint_set_ordinate(p, dims[i], newordinate);
354  LWDEBUGF(4, " clip ordinate(%c) p1_value(%g) p2_value(%g) proportion(%g) newordinate(%g) ", dims[i], p1_value, p2_value, proportion, newordinate );
355  }
356 
357  return 1;
358 }
double lwpoint_get_ordinate(const POINT4D *p, char ordinate)
Given a POINT4D and an ordinate number, return the value of the ordinate.
#define FP_MIN(A, B)
void lwpoint_set_ordinate(POINT4D *p, char ordinate, double value)
Given a point, ordinate number and value, set that ordinate on the point.
#define LWDEBUGF(level, msg,...)
Definition: lwgeom_log.h:88
void lwerror(const char *fmt,...)
Write a notice out to the error handler.
Definition: lwutil.c:190
#define FP_MAX(A, B)

Here is the call graph for this function:

Here is the caller graph for this function: