void Spectrum_drawInside (Spectrum me, Graphics g, double fmin, double fmax, double minimum, double maximum) { int autoscaling = minimum >= maximum; if (fmax <= fmin) { fmin = my xmin; fmax = my xmax; } long ifmin, ifmax; if (! Matrix_getWindowSamplesX (me, fmin, fmax, & ifmin, & ifmax)) return; autoNUMvector <double> yWC (ifmin, ifmax); /* * First pass: compute power density. */ if (autoscaling) maximum = -1e30; for (long ifreq = ifmin; ifreq <= ifmax; ifreq ++) { double y = my v_getValueAtSample (ifreq, 0, 2); if (autoscaling && y > maximum) maximum = y; yWC [ifreq] = y; } if (autoscaling) minimum = maximum - 60; /* Default dynamic range is 60 dB. */ /* * Second pass: clip. */ for (long ifreq = ifmin; ifreq <= ifmax; ifreq ++) { if (yWC [ifreq] < minimum) yWC [ifreq] = minimum; else if (yWC [ifreq] > maximum) yWC [ifreq] = maximum; } Graphics_setWindow (g, fmin, fmax, minimum, maximum); Graphics_function (g, yWC.peek(), ifmin, ifmax, Matrix_columnToX (me, ifmin), Matrix_columnToX (me, ifmax)); }
void PowerCepstrogram_paint (PowerCepstrogram me, Graphics g, double tmin, double tmax, double qmin, double qmax, double dBmaximum, int autoscaling, double dynamicRangedB, double dynamicCompression, int garnish) { if (tmax <= tmin) { tmin = my xmin; tmax = my xmax; } if (qmax <= qmin) { qmin = my ymin; qmax = my ymax; } long itmin, itmax, ifmin, ifmax; if (! Matrix_getWindowSamplesX (me, tmin - 0.49999 * my dx, tmax + 0.49999 * my dx, & itmin, & itmax) || ! Matrix_getWindowSamplesY (me, qmin - 0.49999 * my dy, qmax + 0.49999 * my dy, & ifmin, & ifmax)) { return; } autoMatrix thee = Data_copy (me); double min = 1e308, max = -min; for (long i = 1; i <= my ny; i++) { for (long j = 1; j <= my nx; j++) { double val = TO10LOG (my z[i][j]); min = val < min ? val : min; max = val > max ? val : max; thy z[i][j] = val; } } double dBminimum = dBmaximum - dynamicRangedB; if (autoscaling) { dBminimum = min; dBmaximum = max; } for (long j = 1; j <= my nx; j++) { double lmax = thy z[1][j]; for (long i = 2; i <= my ny; i++) { if (thy z[i][j] > lmax) { lmax = thy z[i][j]; } } double factor = dynamicCompression * (max - lmax); for (long i = 1; i <= my ny; i++) { thy z[i][j] += factor; } } Graphics_setInner (g); Graphics_setWindow (g, tmin, tmax, qmin, qmax); Graphics_image (g, thy z, itmin, itmax, Matrix_columnToX (thee.get(), itmin - 0.5), Matrix_columnToX (thee.get(), itmax + 0.5), ifmin, ifmax, Matrix_rowToY (thee.get(), ifmin - 0.5), Matrix_rowToY (thee.get(), ifmax + 0.5), dBminimum, dBmaximum); Graphics_unsetInner (g); if (garnish) { Graphics_drawInnerBox (g); Graphics_textBottom (g, true, U"Time (s)"); Graphics_marksBottom (g, 2, true, true, false); Graphics_marksLeft (g, 2, true, true, false); Graphics_textLeft (g, true, U"Quefrency (s)"); } }
void Intensity_drawInside (Intensity me, Graphics g, double tmin, double tmax, double minimum, double maximum) { if (tmax <= tmin) { tmin = my xmin; tmax = my xmax; } // autowindow long itmin, itmax; Matrix_getWindowSamplesX (me, tmin, tmax, & itmin, & itmax); if (maximum <= minimum) Matrix_getWindowExtrema (me, itmin, itmax, 1, 1, & minimum, & maximum); // autoscale if (maximum <= minimum) { minimum -= 10; maximum += 10; } Graphics_setWindow (g, tmin, tmax, minimum, maximum); Graphics_function (g, my z [1], itmin, itmax, Matrix_columnToX (me, itmin), Matrix_columnToX (me, itmax)); }
void Spectrogram_paintInside (Spectrogram me, Graphics g, double tmin, double tmax, double fmin, double fmax, double maximum, int autoscaling, double dynamic, double preemphasis, double dynamicCompression) { if (tmax <= tmin) { tmin = my xmin; tmax = my xmax; } if (fmax <= fmin) { fmin = my ymin; fmax = my ymax; } long itmin, itmax, ifmin, ifmax; if (! Matrix_getWindowSamplesX (me, tmin - 0.49999 * my dx, tmax + 0.49999 * my dx, & itmin, & itmax) || ! Matrix_getWindowSamplesY (me, fmin - 0.49999 * my dy, fmax + 0.49999 * my dy, & ifmin, & ifmax)) return; Graphics_setWindow (g, tmin, tmax, fmin, fmax); autoNUMvector <double> preemphasisFactor (ifmin, ifmax); autoNUMvector <double> dynamicFactor (itmin, itmax); /* Pre-emphasis in place; also compute maximum after pre-emphasis. */ for (long ifreq = ifmin; ifreq <= ifmax; ifreq ++) { preemphasisFactor [ifreq] = (preemphasis / NUMln2) * log (ifreq * my dy / 1000.0); for (long itime = itmin; itime <= itmax; itime ++) { double value = my z [ifreq] [itime]; /* Power. */ value = (10.0/NUMln10) * log ((value + 1e-30) / 4.0e-10) + preemphasisFactor [ifreq]; /* dB */ if (value > dynamicFactor [itime]) dynamicFactor [itime] = value; /* Local maximum. */ my z [ifreq] [itime] = value; } } /* Compute global maximum. */ if (autoscaling) { maximum = 0.0; for (long itime = itmin; itime <= itmax; itime ++) if (dynamicFactor [itime] > maximum) maximum = dynamicFactor [itime]; } /* Dynamic compression in place. */ for (long itime = itmin; itime <= itmax; itime ++) { dynamicFactor [itime] = dynamicCompression * (maximum - dynamicFactor [itime]); for (long ifreq = ifmin; ifreq <= ifmax; ifreq ++) my z [ifreq] [itime] += dynamicFactor [itime]; } Graphics_image (g, my z, itmin, itmax, Matrix_columnToX (me, itmin - 0.5), Matrix_columnToX (me, itmax + 0.5), ifmin, ifmax, Matrix_rowToY (me, ifmin - 0.5), Matrix_rowToY (me, ifmax + 0.5), maximum - dynamic, maximum); for (long ifreq = ifmin; ifreq <= ifmax; ifreq ++) for (long itime = itmin; itime <= itmax; itime ++) { double value = 4.0e-10 * exp ((my z [ifreq] [itime] - dynamicFactor [itime] - preemphasisFactor [ifreq]) * (NUMln10 / 10.0)) - 1e-30; my z [ifreq] [itime] = value > 0.0 ? value : 0.0; } }
void Cepstrum_draw (Cepstrum me, Graphics g, double qmin, double qmax, double minimum, double maximum, int garnish) { int autoscaling = minimum >= maximum; Graphics_setInner (g); if (qmax <= qmin) { qmin = my xmin; qmax = my xmax; } long imin, imax; if (! Matrix_getWindowSamplesX (me, qmin, qmax, & imin, & imax)) { return; } autoNUMvector<double> y (imin, imax); double *z = my z[1]; for (long i = imin; i <= imax; i++) { y[i] = z[i]; } if (autoscaling) { NUMvector_extrema (y.peek(), imin, imax, & minimum, & maximum); } for (long i = imin; i <= imax; i ++) { if (y[i] > maximum) { y[i] = maximum; } else if (y[i] < minimum) { y[i] = minimum; } } Graphics_setWindow (g, qmin, qmax, minimum, maximum); Graphics_function (g, y.peek(), imin, imax, Matrix_columnToX (me, imin), Matrix_columnToX (me, imax)); Graphics_unsetInner (g); if (garnish) { Graphics_drawInnerBox (g); Graphics_textBottom (g, 1, L"Quefrency"); Graphics_marksBottom (g, 2, TRUE, TRUE, FALSE); Graphics_textLeft (g, 1, L"Amplitude"); } }
static void _Cepstrum_draw (Cepstrum me, Graphics g, double qmin, double qmax, double minimum, double maximum, int power, int garnish) { int autoscaling = minimum >= maximum; Graphics_setInner (g); if (qmax <= qmin) { qmin = my xmin; qmax = my xmax; } long imin, imax; if (! Matrix_getWindowSamplesX (me, qmin, qmax, & imin, & imax)) { return; } autoNUMvector<double> y (imin, imax); for (long i = imin; i <= imax; i++) { y[i] = my v_getValueAtSample (i, (power ? 1 : 0), 0); } if (autoscaling) { NUMvector_extrema (y.peek(), imin, imax, & minimum, & maximum); } else { for (long i = imin; i <= imax; i ++) { if (y[i] > maximum) { y[i] = maximum; } else if (y[i] < minimum) { y[i] = minimum; } } } Graphics_setWindow (g, qmin, qmax, minimum, maximum); Graphics_function (g, y.peek(), imin, imax, Matrix_columnToX (me, imin), Matrix_columnToX (me, imax)); Graphics_unsetInner (g); if (garnish) { Graphics_drawInnerBox (g); Graphics_textBottom (g, true, U"Quefrency (s)"); Graphics_marksBottom (g, 2, true, true, false); Graphics_textLeft (g, true, power ? U"Amplitude (dB)" : U"Amplitude"); Graphics_marksLeft (g, 2, true, true, false); } }
void Matrix_paintSurface (Matrix me, Graphics g, double xmin, double xmax, double ymin, double ymax, double minimum, double maximum, double elevation, double azimuth) { if (xmax <= xmin) { xmin = my xmin; xmax = my xmax; } if (ymax <= ymin) { ymin = my ymin; ymax = my ymax; } long ixmin, ixmax, iymin, iymax; (void) Matrix_getWindowSamplesX (me, xmin, xmax, & ixmin, & ixmax); (void) Matrix_getWindowSamplesY (me, ymin, ymax, & iymin, & iymax); if (maximum <= minimum) (void) Matrix_getWindowExtrema (me, ixmin, ixmax, iymin, iymax, & minimum, & maximum); if (maximum <= minimum) { minimum -= 1.0; maximum += 1.0; } Graphics_setInner (g); Graphics_setWindow (g, -1.0, 1.0, minimum, maximum); Graphics_surface (g, my z, ixmin, ixmax, Matrix_columnToX (me, ixmin), Matrix_columnToX (me, ixmax), iymin, iymax, Matrix_rowToY (me, iymin), Matrix_rowToY (me, iymax), minimum, maximum, elevation, azimuth); Graphics_unsetInner (g); }
void PowerCepstrogram_paint (PowerCepstrogram me, Graphics g, double tmin, double tmax, double qmin, double qmax, double dBminimum, double dBmaximum, int garnish) { if (tmax <= tmin) { tmin = my xmin; tmax = my xmax; } if (qmax <= qmin) { qmin = my ymin; qmax = my ymax; } long itmin, itmax, ifmin, ifmax; if (! Matrix_getWindowSamplesX (me, tmin - 0.49999 * my dx, tmax + 0.49999 * my dx, & itmin, & itmax) || ! Matrix_getWindowSamplesY (me, qmin - 0.49999 * my dy, qmax + 0.49999 * my dy, & ifmin, & ifmax)) { return; } autoMatrix thee = (Matrix) Data_copy (me); double min = 1e38, max = -min; for (long i = 1; i <= my ny; i++) { for (long j = 1; j <= my nx; j++) { double val = TO10LOG (my z[i][j]); min = val < min ? val : min; max = val > max ? val : max; thy z[i][j] = val; } } if (dBmaximum <= dBminimum) { dBminimum = min; dBmaximum = max; } Graphics_setInner (g); Graphics_setWindow (g, tmin, tmax, qmin, qmax); Graphics_image (g, thy z, itmin, itmax, Matrix_columnToX (thee.peek(), itmin - 0.5), Matrix_columnToX (thee.peek(), itmax + 0.5), ifmin, ifmax, Matrix_rowToY (thee.peek(), ifmin - 0.5), Matrix_rowToY (thee.peek(), ifmax + 0.5), dBminimum, dBmaximum); Graphics_unsetInner (g); if (garnish) { Graphics_drawInnerBox (g); Graphics_textBottom (g, 1, L"Time (s)"); Graphics_marksBottom (g, 2, 1, 1, 0); Graphics_marksLeft (g, 2, 1, 1, 0); Graphics_textLeft (g, 1, L"Quefrency (s)"); } }
void Matrix_drawOneContour (Matrix me, Graphics g, double xmin, double xmax, double ymin, double ymax, double height) { bool xreversed = xmin > xmax, yreversed = ymin > ymax; if (xmax == xmin) { xmin = my xmin; xmax = my xmax; } if (ymax == ymin) { ymin = my ymin; ymax = my ymax; } if (xreversed) { double temp = xmin; xmin = xmax; xmax = temp; } if (yreversed) { double temp = ymin; ymin = ymax; ymax = temp; } long ixmin, ixmax, iymin, iymax; (void) Matrix_getWindowSamplesX (me, xmin, xmax, & ixmin, & ixmax); (void) Matrix_getWindowSamplesY (me, ymin, ymax, & iymin, & iymax); if (xmin == xmax || ymin == ymax) return; Graphics_setInner (g); Graphics_setWindow (g, xreversed ? xmax : xmin, xreversed ? xmin : xmax, yreversed ? ymax : ymin, yreversed ? ymin : ymax); Graphics_contour (g, my z, ixmin, ixmax, Matrix_columnToX (me, ixmin), Matrix_columnToX (me, ixmax), iymin, iymax, Matrix_rowToY (me, iymin), Matrix_rowToY (me, iymax), height); Graphics_rectangle (g, xmin, xmax, ymin, ymax); Graphics_unsetInner (g); }
void Excitation_draw (Excitation me, Graphics g, double fmin, double fmax, double minimum, double maximum, int garnish) { if (fmax <= fmin) { fmin = my xmin; fmax = my xmax; } long ifmin, ifmax; Matrix_getWindowSamplesX (me, fmin, fmax, & ifmin, & ifmax); if (maximum <= minimum) Matrix_getWindowExtrema (me, ifmin, ifmax, 1, 1, & minimum, & maximum); if (maximum <= minimum) { minimum -= 20; maximum += 20; } Graphics_setInner (g); Graphics_setWindow (g, fmin, fmax, minimum, maximum); Graphics_function (g, my z [1], ifmin, ifmax, Matrix_columnToX (me, ifmin), Matrix_columnToX (me, ifmax)); Graphics_unsetInner (g); if (garnish) { Graphics_drawInnerBox (g); Graphics_textBottom (g, 1, L"Frequency (Bark)"); Graphics_textLeft (g, 1, L"Excitation (phon)"); Graphics_marksBottomEvery (g, 1, 5, 1, 1, 0); Graphics_marksLeftEvery (g, 1, 20, 1, 1, 0); } }
void Matrix_drawAsSquares (Matrix me, Graphics g, double xmin, double xmax, double ymin, double ymax, int garnish) { Graphics_Colour colour = Graphics_inqColour (g); long ixmin, ixmax, iymin, iymax; if (xmax <= xmin) { xmin = my xmin; xmax = my xmax; } long nx = Matrix_getWindowSamplesX (me, xmin, xmax, &ixmin, &ixmax); if (ymax <= ymin) { ymin = my ymin; ymax = my ymax; } long ny = Matrix_getWindowSamplesY (me, ymin, ymax, &iymin, &iymax); double min, max = nx > ny ? nx : ny; double dx = (xmax - xmin) / max, dy = (ymax - ymin) / max; Graphics_setInner (g); Graphics_setWindow (g, xmin, xmax, ymin, ymax); Matrix_getWindowExtrema (me, ixmin, ixmax, iymin, iymax, & min, & max); double wAbsMax = fabs (max) > fabs (min) ? fabs (max) : fabs (min); for (long i = iymin; i <= iymax; i++) { double y = Matrix_rowToY (me, i); for (long j = ixmin; j <= ixmax; j++) { double x = Matrix_columnToX (me, j); double d = 0.95 * sqrt (fabs (my z[i][j]) / wAbsMax); if (d > 0) { double x1WC = x - d * dx / 2, x2WC = x + d * dx / 2; double y1WC = y - d * dy / 2, y2WC = y + d * dy / 2; if (my z[i][j] > 0) { Graphics_setColour (g, Graphics_WHITE); } Graphics_fillRectangle (g, x1WC, x2WC, y1WC, y2WC); Graphics_setColour (g, colour); Graphics_rectangle (g, x1WC, x2WC , y1WC, y2WC); } } } Graphics_setGrey (g, 0.0); Graphics_unsetInner (g); if (garnish) { Graphics_drawInnerBox (g); Graphics_marksLeft (g, 2, true, true, false); if (ymin * ymax < 0.0) { Graphics_markLeft (g, 0.0, true, true, true, nullptr); } Graphics_marksBottom (g, 2, true, true, false); if (xmin * xmax < 0.0) { Graphics_markBottom (g, 0.0, true, true, true, nullptr); } } }
void Matrix_paintContours (Matrix me, Graphics g, double xmin, double xmax, double ymin, double ymax, double minimum, double maximum) { double border [1 + 30]; if (xmax <= xmin) { xmin = my xmin; xmax = my xmax; } if (ymax <= ymin) { ymin = my ymin; ymax = my ymax; } long ixmin, ixmax, iymin, iymax, iborder; (void) Matrix_getWindowSamplesX (me, xmin, xmax, & ixmin, & ixmax); (void) Matrix_getWindowSamplesY (me, ymin, ymax, & iymin, & iymax); if (maximum <= minimum) (void) Matrix_getWindowExtrema (me, ixmin, ixmax, iymin, iymax, & minimum, & maximum); if (maximum <= minimum) { minimum -= 1.0; maximum += 1.0; } for (iborder = 1; iborder <= 30; iborder ++) border [iborder] = minimum + iborder * (maximum - minimum) / (30 + 1); if (xmin >= xmax || ymin >= ymax) return; Graphics_setInner (g); Graphics_setWindow (g, xmin, xmax, ymin, ymax); Graphics_grey (g, my z, ixmin, ixmax, Matrix_columnToX (me, ixmin), Matrix_columnToX (me, ixmax), iymin, iymax, Matrix_rowToY (me, iymin), Matrix_rowToY (me, iymax), 30, border); Graphics_rectangle (g, xmin, xmax, ymin, ymax); Graphics_unsetInner (g); }
void Matrix_drawRows (Matrix me, Graphics g, double xmin, double xmax, double ymin, double ymax, double minimum, double maximum) { if (xmax <= xmin) { xmin = my xmin; xmax = my xmax; } if (ymax <= ymin) { ymin = my ymin; ymax = my ymax; } long ixmin, ixmax, iymin, iymax; (void) Matrix_getWindowSamplesX (me, xmin, xmax, & ixmin, & ixmax); (void) Matrix_getWindowSamplesY (me, ymin, ymax, & iymin, & iymax); if (maximum <= minimum) (void) Matrix_getWindowExtrema (me, ixmin, ixmax, iymin, iymax, & minimum, & maximum); if (maximum <= minimum) { minimum -= 1.0; maximum += 1.0; } if (xmin >= xmax) return; Graphics_setInner (g); for (long iy = iymin; iy <= iymax; iy ++) { Graphics_setWindow (g, xmin, xmax, minimum - (iy - iymin) * (maximum - minimum), maximum + (iymax - iy) * (maximum - minimum)); Graphics_function (g, my z [iy], ixmin, ixmax, Matrix_columnToX (me, ixmin), Matrix_columnToX (me, ixmax)); } Graphics_unsetInner (g); if (iymin < iymax) Graphics_setWindow (g, xmin, xmax, my y1 + (iymin - 1.5) * my dy, my y1 + (iymax - 0.5) * my dy); }
void ERP_drawChannel_number (ERP me, Graphics graphics, long channelNumber, double tmin, double tmax, double vmin, double vmax, bool garnish) { if (channelNumber < 1 || channelNumber > my ny) return; /* * Automatic domain. */ if (tmin == tmax) { tmin = my xmin; tmax = my xmax; } /* * Domain expressed in sample numbers. */ long ixmin, ixmax; Matrix_getWindowSamplesX (me, tmin, tmax, & ixmin, & ixmax); /* * Automatic vertical range. */ if (vmin == vmax) { Matrix_getWindowExtrema (me, ixmin, ixmax, channelNumber, channelNumber, & vmin, & vmax); if (vmin == vmax) { vmin -= 1.0; vmax += 1.0; } } /* * Set coordinates for drawing. */ Graphics_setInner (graphics); Graphics_setWindow (graphics, tmin, tmax, vmin, vmax); Graphics_function (graphics, my z [channelNumber], ixmin, ixmax, Matrix_columnToX (me, ixmin), Matrix_columnToX (me, ixmax)); Graphics_unsetInner (graphics); if (garnish) { Graphics_drawInnerBox (graphics); Graphics_textTop (graphics, true, Melder_wcscat (L"Channel ", my channelNames [channelNumber])); Graphics_textBottom (graphics, true, L"Time (s)"); Graphics_marksBottom (graphics, 2, true, true, false); if (0.0 > tmin && 0.0 < tmax) Graphics_markBottom (graphics, 0.0, true, true, true, NULL); Graphics_markLeft (graphics, vmin, true, true, false, NULL); Graphics_markLeft (graphics, vmax, true, true, false, NULL); Graphics_markBottom (graphics, 0.0, true, true, true, NULL); if (vmin != 0.0 && vmax != 0.0 && (vmin > 0.0) != (vmax > 0.0)) { Graphics_markLeft (graphics, 0.0, true, true, true, NULL); } } }
void Vector_draw (Vector me, Graphics g, double *pxmin, double *pxmax, double *pymin, double *pymax, double defaultDy, const char32 *method) { bool xreversed = *pxmin > *pxmax, yreversed = *pymin > *pymax; if (xreversed) { double temp = *pxmin; *pxmin = *pxmax; *pxmax = temp; } if (yreversed) { double temp = *pymin; *pymin = *pymax; *pymax = temp; } long ixmin, ixmax, ix; /* * Automatic domain. */ if (*pxmin == *pxmax) { *pxmin = my xmin; *pxmax = my xmax; } /* * Domain expressed in sample numbers. */ Matrix_getWindowSamplesX (me, *pxmin, *pxmax, & ixmin, & ixmax); /* * Automatic vertical range. */ if (*pymin == *pymax) { Matrix_getWindowExtrema (me, ixmin, ixmax, 1, 1, pymin, pymax); if (*pymin == *pymax) { *pymin -= defaultDy; *pymax += defaultDy; } } /* * Set coordinates for drawing. */ Graphics_setInner (g); Graphics_setWindow (g, xreversed ? *pxmax : *pxmin, xreversed ? *pxmin : *pxmax, yreversed ? *pymax : *pymin, yreversed ? *pymin : *pymax); if (str32str (method, U"bars") || str32str (method, U"Bars")) { for (ix = ixmin; ix <= ixmax; ix ++) { double x = Sampled_indexToX (me, ix); double y = my z [1] [ix]; double left = x - 0.5 * my dx, right = x + 0.5 * my dx; if (y > *pymax) y = *pymax; if (left < *pxmin) left = *pxmin; if (right > *pxmax) right = *pxmax; if (y > *pymin) { Graphics_line (g, left, y, right, y); Graphics_line (g, left, y, left, *pymin); Graphics_line (g, right, y, right, *pymin); } } } else if (str32str (method, U"poles") || str32str (method, U"Poles")) { for (ix = ixmin; ix <= ixmax; ix ++) { double x = Sampled_indexToX (me, ix); Graphics_line (g, x, 0, x, my z [1] [ix]); } } else if (str32str (method, U"speckles") || str32str (method, U"Speckles")) { for (ix = ixmin; ix <= ixmax; ix ++) { double x = Sampled_indexToX (me, ix); Graphics_speckle (g, x, my z [1] [ix]); } } else { /* * The default: draw as a curve. */ Graphics_function (g, my z [1], ixmin, ixmax, Matrix_columnToX (me, ixmin), Matrix_columnToX (me, ixmax)); } Graphics_unsetInner (g); }
void Sound_draw (Sound me, Graphics g, double tmin, double tmax, double minimum, double maximum, bool garnish, const char32 *method) { long ixmin, ixmax; bool treversed = tmin > tmax; if (treversed) { double temp = tmin; tmin = tmax; tmax = temp; } /* * Automatic domain. */ if (tmin == tmax) { tmin = my xmin; tmax = my xmax; } /* * Domain expressed in sample numbers. */ Matrix_getWindowSamplesX (me, tmin, tmax, & ixmin, & ixmax); /* * Automatic vertical range. */ if (minimum == maximum) { Matrix_getWindowExtrema (me, ixmin, ixmax, 1, my ny, & minimum, & maximum); if (minimum == maximum) { minimum -= 1.0; maximum += 1.0; } } /* * Set coordinates for drawing. */ Graphics_setInner (g); for (long channel = 1; channel <= my ny; channel ++) { Graphics_setWindow (g, treversed ? tmax : tmin, treversed ? tmin : tmax, minimum - (my ny - channel) * (maximum - minimum), maximum + (channel - 1) * (maximum - minimum)); if (str32str (method, U"bars") || str32str (method, U"Bars")) { for (long ix = ixmin; ix <= ixmax; ix ++) { double x = Sampled_indexToX (me, ix); double y = my z [channel] [ix]; double left = x - 0.5 * my dx, right = x + 0.5 * my dx; if (y > maximum) y = maximum; if (left < tmin) left = tmin; if (right > tmax) right = tmax; Graphics_line (g, left, y, right, y); Graphics_line (g, left, y, left, minimum); Graphics_line (g, right, y, right, minimum); } } else if (str32str (method, U"poles") || str32str (method, U"Poles")) { for (long ix = ixmin; ix <= ixmax; ix ++) { double x = Sampled_indexToX (me, ix); Graphics_line (g, x, 0, x, my z [channel] [ix]); } } else if (str32str (method, U"speckles") || str32str (method, U"Speckles")) { for (long ix = ixmin; ix <= ixmax; ix ++) { double x = Sampled_indexToX (me, ix); Graphics_speckle (g, x, my z [channel] [ix]); } } else { /* * The default: draw as a curve. */ Graphics_function (g, my z [channel], ixmin, ixmax, Matrix_columnToX (me, ixmin), Matrix_columnToX (me, ixmax)); } } Graphics_setWindow (g, treversed ? tmax : tmin, treversed ? tmin : tmax, minimum, maximum); if (garnish && my ny == 2) Graphics_line (g, tmin, 0.5 * (minimum + maximum), tmax, 0.5 * (minimum + maximum)); Graphics_unsetInner (g); if (garnish) { Graphics_drawInnerBox (g); Graphics_textBottom (g, 1, U"Time (s)"); Graphics_marksBottom (g, 2, 1, 1, 0); Graphics_setWindow (g, tmin, tmax, minimum - (my ny - 1) * (maximum - minimum), maximum); Graphics_markLeft (g, minimum, 1, 1, 0, NULL); Graphics_markLeft (g, maximum, 1, 1, 0, NULL); if (minimum != 0.0 && maximum != 0.0 && (minimum > 0.0) != (maximum > 0.0)) { Graphics_markLeft (g, 0.0, 1, 1, 1, NULL); } if (my ny == 2) { Graphics_setWindow (g, treversed ? tmax : tmin, treversed ? tmin : tmax, minimum, maximum + (my ny - 1) * (maximum - minimum)); Graphics_markRight (g, minimum, 1, 1, 0, NULL); Graphics_markRight (g, maximum, 1, 1, 0, NULL); if (minimum != 0.0 && maximum != 0.0 && (minimum > 0.0) != (maximum > 0.0)) { Graphics_markRight (g, 0.0, 1, 1, 1, NULL); } } } }