For monotonic plotting find out the majority of increasing or decreasing

x-axis values, add a warning to add 'retraceplot' to plot all if more than
10% of the values deviate from the majority.
This commit is contained in:
Holger Vogt 2022-12-04 10:35:44 +01:00
parent 082ae1603e
commit a5eaac128a
1 changed files with 39 additions and 4 deletions

View File

@ -20,7 +20,7 @@ Author: 1985 Wayne A. Christopher, U. C. Berkeley CAD Group
static void plotinterval(struct dvec *v, double lo, double hi, register double *coeffs,
int degree, bool rotated);
static int get_xdirection(struct dvec *xs, int len, bool mn);
/* Plot the vector v, with scale xs. If we are doing curve-fitting, then
* do some tricky stuff.
@ -146,7 +146,7 @@ ft_graf(struct dvec *v, struct dvec *xs, bool nostart)
Then everything is plotted. */
bool mono = (currentgraph->plottype != PLOT_RETLIN);
int dir = 0;
int dir = get_xdirection(xs, length, mono);
for (i = 0; i < length; i++) {
dx = isreal(xs) ? xs->v_realdata[i] :
realpart(xs->v_compdata[i]);
@ -158,8 +158,6 @@ ft_graf(struct dvec *v, struct dvec *xs, bool nostart)
gr_point(v, dx, dy, lx, ly, 0);
} else {
gr_point(v, dx, dy, lx, ly, i);
if (!dir)
dir = lx > dx ? -1 : lx < dx ? 1 : 0;
}
lx = dx;
ly = dy;
@ -358,3 +356,40 @@ plotinterval(struct dvec *v, double lo, double hi, register double *coeffs, int
/* fprintf(cp_err, "plot (%G, %G)\n\r", dx, dy); */
}
}
/* Check if the majority of the x-axis data points are increasing or decreasing.
If more than 10% of the data points deviate from the majority direction, issue a warning,
if 'retraceplot' is not set.
*/
static int get_xdirection(struct dvec* xs, int len, bool mn) {
int i, dir = 1, inc = 0, dec = 0;
double dx, lx;
static bool msgsent = FALSE;
lx = isreal(xs) ? xs->v_realdata[0] :
realpart(xs->v_compdata[0]);
for (i = 1; i < len; i++) {
dx = isreal(xs) ? xs->v_realdata[i] :
realpart(xs->v_compdata[i]);
if (dx > lx)
inc++;
else if (dx < lx)
dec++;
lx = dx;
}
if (inc < 2 && dec < 2)
fprintf(stderr, "Warning, (new) x axis seems to have one data point only\n");
if (mn && !msgsent && (((double)inc / len > 0.1 && inc < dec) || ((double)dec / len > 0.1 && inc > dec))) {
fprintf(stderr, "Warning, more than 10%% of scale vector %s data points are not monotonic.\n", xs->v_name);
fprintf(stderr, " Please consider using the 'retraceplot' flag to the plot command to plot all data.\n");
msgsent = TRUE;
}
if (inc < dec)
dir = -1;
return dir;
}