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.
323{
324 static char *dims = "XYZM";
327 double proportion;
328 int i = 0;
329
330#if PARANOIA_LEVEL > 0
331 if (!(ordinate == 'X' || ordinate == 'Y' || ordinate == 'Z' || ordinate == 'M'))
332 {
333 lwerror(
"Cannot interpolate over %c ordinate.", ordinate);
335 }
336
337 if (
FP_MIN(p1_value, p2_value) > interpolation_value ||
FP_MAX(p1_value, p2_value) < interpolation_value)
338 {
339 lwerror(
"Cannot interpolate to a value (%g) not between the input points (%g, %g).",
340 interpolation_value,
341 p1_value,
342 p2_value);
344 }
345#endif
346
347 proportion = (interpolation_value - p1_value) / (p2_value - p1_value);
348
349 for (i = 0; i < 4; i++)
350 {
351 if (dims[i] == 'Z' && !hasz)
352 continue;
353 if (dims[i] == 'M' && !hasm)
354 continue;
355 if (dims[i] == ordinate)
357 else
358 {
359 double newordinate = 0.0;
362 newordinate = p1_value + proportion * (p2_value - p1_value);
364 }
365 }
366
368}
void lwerror(const char *fmt,...)
Write a notice out to the error handler.
void lwpoint_set_ordinate(POINT4D *p, char ordinate, double value)
Given a point, ordinate number and value, set that ordinate on the point.
double lwpoint_get_ordinate(const POINT4D *p, char ordinate)
Given a POINT4D and an ordinate number, return the value of the ordinate.