/* EAM Feb 2015: Don't touch xrange, but recalculate y limits */ static void do_kdensity( struct curve_points *cp, int first_point, /* where to start in plot->points */ int num_points, /* to determine end in plot->points */ struct coordinate *dest) /* where to put the interpolated data */ { int i; double x, y; double sxmin, sxmax, step; x_axis = cp->x_axis; y_axis = cp->y_axis; if (X_AXIS.log) int_error(NO_CARET, "kdensity cannot handle logscale x axis"); sxmin = X_AXIS.min; sxmax = X_AXIS.max; step = (sxmax - sxmin) / (samples_1 - 1); for (i = 0; i < samples_1; i++) { x = sxmin + i * step; y = eval_kdensity( cp, first_point, num_points, x ); /* now we have to store the points and adjust the ranges */ dest[i].type = INRANGE; dest[i].x = x; STORE_AND_UPDATE_RANGE( dest[i].y, y, dest[i].type, y_axis, cp->noautoscale, NOOP); dest[i].xlow = dest[i].xhigh = dest[i].x; dest[i].ylow = dest[i].yhigh = dest[i].y; dest[i].z = -1; } }
/* do_kdensity is based on do_bezier, except for the call to eval_bezier */ static void do_kdensity( struct curve_points *cp, int first_point, /* where to start in plot->points */ int num_points, /* to determine end in plot->points */ struct coordinate *dest) /* where to put the interpolated data */ { int i; coordval x, y; /* min and max in internal (eg logged) co-ordinates. We update * these, then update the external extrema in user co-ordinates * at the end. */ double ixmin, ixmax, iymin, iymax; double sxmin, sxmax, symin, symax; /* starting values of above */ x_axis = cp->x_axis; y_axis = cp->y_axis; ixmin = sxmin = AXIS_LOG_VALUE(x_axis, X_AXIS.min); ixmax = sxmax = AXIS_LOG_VALUE(x_axis, X_AXIS.max); iymin = symin = AXIS_LOG_VALUE(y_axis, Y_AXIS.min); iymax = symax = AXIS_LOG_VALUE(y_axis, Y_AXIS.max); for (i = 0; i < samples_1; i++) { eval_kdensity( cp, first_point, num_points, (double) i / (double) (samples_1 - 1), &x, &y ); /* now we have to store the points and adjust the ranges */ dest[i].type = INRANGE; STORE_AND_FIXUP_RANGE( dest[i].x, x, dest[i].type, ixmin, ixmax, X_AXIS.autoscale, NOOP, continue); STORE_AND_FIXUP_RANGE( dest[i].y, y, dest[i].type, iymin, iymax, Y_AXIS.autoscale, NOOP, NOOP); dest[i].xlow = dest[i].xhigh = dest[i].x; dest[i].ylow = dest[i].yhigh = dest[i].y; dest[i].z = -1; } UPDATE_RANGE(ixmax > sxmax, X_AXIS.max, ixmax, x_axis); UPDATE_RANGE(ixmin < sxmin, X_AXIS.min, ixmin, x_axis); UPDATE_RANGE(iymax > symax, Y_AXIS.max, iymax, y_axis); UPDATE_RANGE(iymin < symin, Y_AXIS.min, iymin, y_axis); }