45 PLFLT *x, *y, dx, ymax;
47 if ( plsc->level < 1 )
49 plabort(
"plhist: Please call plinit first" );
52 if ( plsc->level < 3 && ( flags & 1 ) )
54 plabort(
"plhist: Please set up window first" );
57 if ( datmin >= datmax )
59 plabort(
"plhist: Data range invalid" );
62 if ( !( x = (
PLFLT *) malloc( (
size_t) nbin *
sizeof (
PLFLT ) ) ) )
64 plabort(
"plhist: Out of memory" );
67 if ( !( y = (
PLFLT *) malloc( (
size_t) nbin *
sizeof (
PLFLT ) ) ) )
70 plabort(
"plhist: Out of memory" );
74 dx = ( datmax - datmin ) / nbin;
75 for ( i = 0; i < nbin; i++ )
77 x[i] = datmin + i * dx;
81 for ( i = 0; i < n; i++ )
83 bin = (
PLINT) ( ( data[i] - datmin ) / dx );
84 if ( ( flags & 2 ) == 0 )
86 bin = bin > 0 ? bin : 0;
87 bin = bin < nbin ? bin : nbin - 1;
92 if ( bin >= 0 && bin < nbin )
102 for ( i = 0; i < nbin; i++ )
103 ymax =
MAX( ymax, y[i] );
108 plbin( nbin, x, y, ( flags & ( 4 + 8 + 16 + 32 ) ) >> 2 );
128 PLFLT xmin, xmax, vpwxmi, vpwxma, vpwymi, vpwyma;
130 if ( plsc->level < 3 )
132 plabort(
"plbin: Please set up window first" );
138 for ( i = 0; i < nbin - 1; i++ )
140 if ( x[i] >= x[i + 1] )
142 plabort(
"plbin: Elements of x array must be increasing" );
147 plP_xgvpw( &vpwxmi, &vpwxma, &vpwymi, &vpwyma );
148 if ( !( flags & 1 ) )
150 for ( i = 0; i < nbin - 1; i++ )
152 if ( !( flags & 4 ) || ( y[i] != vpwymi ) )
154 pljoin( x[i], vpwymi, x[i], y[i] );
155 pljoin( x[i], y[i], x[i + 1], y[i] );
156 pljoin( x[i + 1], y[i], x[i + 1], vpwymi );
161 if ( !( flags & 4 ) || ( y[i] != vpwymi ) )
163 int xm = (int) ( x[i] + ( x[i] - x[i - 1] ) );
164 pljoin( x[i], vpwymi, x[i], y[i] );
165 pljoin( x[i], y[i], xm, y[i] );
166 pljoin( xm, y[i], xm, vpwymi );
173 if ( !( flags & 4 ) || ( y[i] != vpwymi ) )
175 pljoin( x[i], vpwymi, x[i], y[i] );
176 pljoin( x[i], y[i], vpwxma, y[i] );
177 pljoin( vpwxma, y[i], vpwxma, vpwymi );
188 xmin =
MAX( vpwxmi, 0.5 * ( 3 * x[0] - x[1] ) );
195 xmax =
MAX( 0.5 * ( x[0] + x[1] ), vpwxmi );
198 pljoin( xmin, vpwymi, xmin, y[0] );
199 pljoin( xmin, y[0], xmax, y[0] );
200 pljoin( xmax, y[0], xmax, vpwymi );
202 for ( i = 1; i < nbin - 1; i++ )
205 xmax =
MIN( 0.5 * ( x[i] + x[i + 1] ), vpwxma );
206 if ( !( flags & 4 ) || ( y[i] != vpwymi ) )
208 pljoin( xmin, vpwymi, xmin, y[i] );
209 pljoin( xmin, y[i], xmax, y[i] );
210 pljoin( xmax, y[i], xmax, vpwymi );
217 xmax =
MIN( vpwxma, 0.5 * ( 3 * x[i] - x[i - 1] ) );
225 if ( !( flags & 4 ) || ( y[i] != vpwymi ) )
227 pljoin( xmin, vpwymi, xmin, y[i] );
228 pljoin( xmin, y[i], xmax, y[i] );
229 pljoin( xmax, y[i], xmax, vpwymi );
void plabort(PLCHAR_VECTOR errormsg)
void c_plbin(PLINT nbin, PLFLT_VECTOR x, PLFLT_VECTOR y, PLINT flags)
void c_plhist(PLINT n, PLFLT_VECTOR data, PLFLT datmin, PLFLT datmax, PLINT nbin, PLINT flags)
void plP_xgvpw(PLFLT *p_xmin, PLFLT *p_xmax, PLFLT *p_ymin, PLFLT *p_ymax)
const PLFLT * PLFLT_VECTOR