28 #define N_EDGE_SEGMENTS 50
32 0.301030, 0.477121, 0.602060, 0.698970,
33 0.778151, 0.845098, 0.903090, 0.954243
61 const char *yopt,
PLFLT ytick1,
PLINT nysub1 );
92 c_plaxes( 0.0, 0.0, xopt, xtick, nxsub, yopt, ytick, nysub );
139 PLBOOL lax, lbx, lcx, ldx, lgx, lix, llx, lsx, ltx, lux, lwx, lxx;
140 PLBOOL lay, lby, lcy, ldy, lgy, liy, lly, lsy, lty, luy, lwy, lxy;
141 PLINT xmajor, xminor, ymajor, yminor;
142 PLINT i, i1x, i2x, i3x, i4x, i1y, i2y, i3y, i4y;
143 PLINT nxsub1, nysub1;
144 PLINT lxmin, lxmax, lymin, lymax;
145 PLINT pxmin, pxmax, pymin, pymax;
146 PLINT vppxmi, vppxma, vppymi, vppyma;
147 PLFLT xtick1, ytick1, vpwxmi, vpwxma, vpwymi, vpwyma;
148 PLFLT vpwxmin, vpwxmax, vpwymin, vpwymax;
149 PLFLT xp0, yp0, tn, tp, temp;
150 PLFLT factor, tstart;
152 if ( plsc->level < 3 )
154 plabort(
"plbox: Please set up window first" );
160 plP_gclp( &lxmin, &lxmax, &lymin, &lymax );
161 plP_gphy( &pxmin, &pxmax, &pymin, &pymax );
162 plP_sclp( pxmin, pxmax, pymin, pymax );
164 vppxmi = plsc->vppxmi;
165 vppxma = plsc->vppxma;
166 vppymi = plsc->vppymi;
167 vppyma = plsc->vppyma;
169 if ( plsc->if_boxbb )
173 plsc->boxbb_xmin = plsc->vppxmi / plsc->xpmm;
174 plsc->boxbb_xmax = plsc->vppxma / plsc->xpmm;
175 plsc->boxbb_ymin = plsc->vppymi / plsc->ypmm;
176 plsc->boxbb_ymax = plsc->vppyma / plsc->ypmm;
209 xmajor =
MAX(
ROUND( plsc->majht * plsc->ypmm ), 1 );
210 ymajor =
MAX(
ROUND( plsc->majht * plsc->xpmm ), 1 );
211 xminor =
MAX(
ROUND( plsc->minht * plsc->ypmm ), 1 );
212 yminor =
MAX(
ROUND( plsc->minht * plsc->xpmm ), 1 );
216 xtick1 = llx ? 1.0 : xtick;
217 ytick1 = lly ? 1.0 : ytick;
219 plP_xgvpw( &vpwxmin, &vpwxmax, &vpwymin, &vpwymax );
222 vpwxmi = ( vpwxmax > vpwxmin ) ? vpwxmin : vpwxmax;
223 vpwxma = ( vpwxmax > vpwxmin ) ? vpwxmax : vpwxmin;
224 vpwymi = ( vpwymax > vpwymin ) ? vpwymin : vpwymax;
225 vpwyma = ( vpwymax > vpwymin ) ? vpwymax : vpwymin;
228 lax = lax && vpwymi < y0 && y0 < vpwyma;
229 lay = lay && vpwxmi < x0 && x0 < vpwxma;
233 if ( ltx || lgx || lxx )
234 pldtik( vpwxmi, vpwxma, &xtick1, &nxsub1, ldx );
236 if ( lty || lgy || lxy )
237 pldtik( vpwymi, vpwyma, &ytick1, &nysub1, ldy );
272 if ( plsc->if_boxbb )
279 if ( lix && ( lbx || lux ) && ( ltx && !lxx ) )
280 plsc->boxbb_ymin -= xmajor / plsc->ypmm;
281 if ( liy && ( lcy || lwy ) && ( lty && !lxy ) )
282 plsc->boxbb_xmax += ymajor / plsc->xpmm;
283 if ( lix && ( lcx || lwx ) && ( ltx && !lxx ) )
284 plsc->boxbb_ymax += xmajor / plsc->ypmm;
285 if ( liy && ( lby || luy ) && ( lty && !lxy ) )
286 plsc->boxbb_xmin -= ymajor / plsc->xpmm;
303 pldtfac( vpwxmi, vpwxma, &factor, &tstart );
304 tp = xtick1 * ( floor( ( vpwxmi - tstart ) / xtick1 ) ) + tstart;
307 tp = xtick1 * floor( vpwxmi / xtick1 );
315 for ( i = 0; i <= 7; i++ )
318 if (
BETW( temp, vpwxmi, vpwxma ) )
324 for ( i = 1; i <= nxsub1 - 1; i++ )
326 temp = tp + i * xtick1 / nxsub1;
327 if (
BETW( temp, vpwxmi, vpwxma ) )
332 if ( !
BETW( tn, vpwxmi, vpwxma ) )
353 pldtfac( vpwymi, vpwyma, &factor, &tstart );
354 tp = ytick1 * ( floor( ( vpwymi - tstart ) / ytick1 ) ) + tstart;
357 tp = ytick1 * floor( vpwymi / ytick1 );
365 for ( i = 0; i <= 7; i++ )
368 if (
BETW( temp, vpwymi, vpwyma ) )
374 for ( i = 1; i <= nysub1 - 1; i++ )
376 temp = tp + i * ytick1 / nysub1;
377 if (
BETW( temp, vpwymi, vpwyma ) )
382 if ( !
BETW( tn, vpwymi, vpwyma ) )
403 pldtfac( vpwxmi, vpwxma, &factor, &tstart );
404 tp = xtick1 * ( floor( ( vpwxma - tstart ) / xtick1 ) + 1 ) + tstart;
407 tp = xtick1 * ( floor( vpwxma / xtick1 ) + 1 );
415 for ( i = 7; i >= 0; i-- )
418 if (
BETW( temp, vpwxmi, vpwxma ) )
424 for ( i = nxsub1 - 1; i >= 1; i-- )
426 temp = tn + i * xtick1 / nxsub1;
427 if (
BETW( temp, vpwxmi, vpwxma ) )
432 if ( !
BETW( tn, vpwxmi, vpwxma ) )
453 pldtfac( vpwymi, vpwyma, &factor, &tstart );
454 tp = ytick1 * ( floor( ( vpwyma - tstart ) / ytick1 ) + 1 ) + tstart;
457 tp = ytick1 * ( floor( vpwyma / ytick1 ) + 1 );
465 for ( i = 7; i >= 0; i-- )
468 if (
BETW( temp, vpwymi, vpwyma ) )
474 for ( i = nysub1 - 1; i >= 1; i-- )
476 temp = tn + i * ytick1 / nysub1;
477 if (
BETW( temp, vpwymi, vpwyma ) )
482 if ( !
BETW( tn, vpwymi, vpwyma ) )
499 tp = xtick1 * floor( vpwxmi / xtick1 );
507 for ( i = 0; i <= 7; i++ )
510 if (
BETW( temp, vpwxmi, vpwxma ) )
516 for ( i = 1; i <= nxsub1 - 1; i++ )
518 temp = tp + i * xtick1 / nxsub1;
519 if (
BETW( temp, vpwxmi, vpwxma ) )
524 if ( !
BETW( tn, vpwxmi, vpwxma ) )
541 tp = ytick1 * floor( vpwymi / ytick1 );
549 for ( i = 0; i <= 7; i++ )
552 if (
BETW( temp, vpwymi, vpwyma ) )
558 for ( i = 1; i <= nysub1 - 1; i++ )
560 temp = tp + i * ytick1 / nysub1;
561 if (
BETW( temp, vpwymi, vpwyma ) )
566 if ( !
BETW( tn, vpwymi, vpwyma ) )
575 grid_box( xopt, xtick1, nxsub1, yopt, ytick1, nysub1 );
583 plP_sclp( lxmin, lxmax, lymin, lymax );
594 const char *yopt,
const char *ylabel,
PLFLT ytick,
PLINT nysub,
595 const char *zopt,
const char *zlabel,
PLFLT ztick,
PLINT nzsub )
599 PLFLT cxx, cxy, cyx, cyy, cyz;
604 PLINT xdigmax, xdigits;
605 PLINT ydigmax, ydigits;
606 PLINT zdigmax, zdigits;
608 if ( plsc->level < 3 )
610 plabort(
"plbox3: Please set up window first" );
614 plP_gw3wc( &cxx, &cxy, &cyx, &cyy, &cyz );
615 plP_gdom( &xmin, &xmax, &ymin, &ymax );
618 plgxax( &xdigmax, &xdigits );
619 plgyax( &ydigmax, &ydigits );
620 plgzax( &zdigmax, &zdigits );
629 plP_gzback( &zbflg, &zbcol, &zbtck, &zbwidth );
634 *zbcol = plsc->icol0;
635 *zbwidth = plsc->width;
638 if ( cxx >= 0.0 && cxy <= 0.0 )
646 xmin, xmax, xtick, nxsub, 0, &xdigits );
650 plzbx( zopt, zlabel, 1, dx, dy, ux, uy,
651 plP_w3wcy( xmax, ymin, zmax ), zmin, zmax, ztick, nzsub, &zdigits );
658 ymax, ymin, ytick, nysub, ln, &ydigits );
664 plzbx( zopt, zlabel, 0, dx, dy, tx, ty,
665 plP_w3wcy( xmin, ymax, zmax ), zmin, zmax, ztick, nzsub, &zdigits );
667 else if ( cxx <= 0.0 && cxy <= 0.0 )
675 ymax, ymin, ytick, nysub, 0, &ydigits );
679 plzbx( zopt, zlabel, 1, dx, dy, ux, uy,
680 plP_w3wcy( xmin, ymin, zmax ), zmin, zmax, ztick, nzsub, &zdigits );
687 xmax, xmin, xtick, nxsub, ln, &xdigits );
693 plzbx( zopt, zlabel, 0, dx, dy, tx, ty,
694 plP_w3wcy( xmax, ymax, zmax ), zmin, zmax, ztick, nzsub, &zdigits );
696 else if ( cxx <= 0.0 && cxy >= 0.0 )
704 xmax, xmin, xtick, nxsub, 0, &xdigits );
708 plzbx( zopt, zlabel, 1, dx, dy, ux, uy,
709 plP_w3wcy( xmin, ymax, zmax ), zmin, zmax, ztick, nzsub, &zdigits );
716 ymin, ymax, ytick, nysub, ln, &ydigits );
722 plzbx( zopt, zlabel, 0, dx, dy, tx, ty,
723 plP_w3wcy( xmax, ymin, zmax ), zmin, zmax, ztick, nzsub, &zdigits );
725 else if ( cxx >= 0.0 && cxy >= 0.0 )
733 ymin, ymax, ytick, nysub, 0, &ydigits );
737 plzbx( zopt, zlabel, 1, dx, dy, ux, uy,
738 plP_w3wcy( xmax, ymax, zmax ), zmin, zmax, ztick, nzsub, &zdigits );
745 xmin, xmax, xtick, nxsub, ln, &xdigits );
751 plzbx( zopt, zlabel, 0, dx, dy, tx, ty,
752 plP_w3wcy( xmin, ymin, zmax ), zmin, zmax, ztick, nzsub, &zdigits );
754 plsxax( xdigmax, xdigits );
755 plsyax( ydigmax, ydigits );
756 plszax( zdigmax, zdigits );
789 PLINT lb, ld, lf, li, ll, ln, ls, lt, lu, lo;
790 PLINT major, minor, mode, prec, scale;
791 PLINT i, i1, i2, i3, i4;
793 PLFLT pos, tn, tp, temp, height, tick1, vmin, vmax;
796 PLFLT dwx, dwy, lambda, tcrit, tspace = 0.1;
799 vmin = ( vmax_in > vmin_in ) ? vmin_in : vmax_in;
800 vmax = ( vmax_in > vmin_in ) ? vmax_in : vmin_in;
807 major =
MAX(
ROUND( plsc->majht * plsc->ypmm ), 1 );
808 minor =
MAX(
ROUND( plsc->minht * plsc->ypmm ), 1 );
825 plxytx( wx1, wy1, wx2, wy2, 3.2, 0.5, 0.5, label );
830 tick1 = ( vmax > vmin ) ? 1.0 : -1.0;
832 pldtik( vmin, vmax, &tick1, &nsub1, ld );
855 tp = tick1 * floor( vmin / tick1 );
863 for ( i = 0; i <= 7; i++ )
866 if (
BETW( temp, vmin, vmax ) )
868 lambda = ( vmax_in > vmin_in ) ?
869 ( temp - vmin ) / ( vmax - vmin ) :
870 ( vmax - temp ) / ( vmax - vmin );
879 for ( i = 1; i <= nsub1 - 1; i++ )
881 temp = tp + i * ( tn - tp ) / nsub1;
882 if (
BETW( temp, vmin, vmax ) )
884 lambda = ( vmax_in > vmin_in ) ?
885 ( temp - vmin ) / ( vmax - vmin ) :
886 ( vmax - temp ) / ( vmax - vmin );
895 if ( !
BETW( temp, vmin, vmax ) )
898 lambda = ( vmax_in > vmin_in ) ?
899 ( temp - vmin ) / ( vmax - vmin ) :
900 ( vmax - temp ) / ( vmax - vmin );
912 pldprec( vmin, vmax, tick1, lf, &mode, &prec, *digits, &scale );
915 tcrit = tspace * tick1;
916 tp = tick1 * ( 1. + floor( vmin / tick1 ) );
917 for ( tn = tp;
BETW( tn, vmin, vmax ); tn += tick1 )
919 if (
BETW( tn, vmin + tcrit, vmax - tcrit ) )
922 pos = ( vmax_in > vmin_in ) ?
923 ( tn - vmin ) / ( vmax - vmin ) :
924 ( vmax - tn ) / ( vmax - vmin );
925 plxytx( wx1, wy1, wx2, wy2, 1.5, pos, 0.5,
string );
929 if ( !ll && !lo && mode )
932 plxytx( wx1, wy1, wx2, wy2, height, 1.0, 0.5,
string );
948 PLINT x, y, refx, refy;
949 PLFLT shift, cc, ss, wx, wy;
950 PLFLT xdv, ydv, xmm, ymm, refxmm, refymm,
xform[4], diag;
954 cc = plsc->wmxscl * ( wx2 - wx1 );
955 ss = plsc->wmyscl * ( wy2 - wy1 );
956 diag = sqrt( cc * cc + ss * ss );
959 wx = wx1 + pos * ( wx2 - wx1 );
960 wy = wy1 + pos * ( wy2 - wy1 );
973 plgchr( &chrdef, &chrht );
974 shift = ( just == 0.0 ) ? 0.0 :
plstrl( text ) * just;
978 refxmm = xmm - shift * xform[0];
979 refymm = ymm - shift * xform[2];
986 plP_text( 0, just, xform, x, y, refx, refy, text );
1018 PLINT lb, lc, ld, lf, li, ll, lm, ln, ls, lt, lu, lv, lo;
1019 PLINT i, mode, prec, scale;
1020 PLINT nsub1, lstring;
1021 PLFLT pos, tn, tp, temp, height, tick1;
1022 PLFLT dwy, lambda, diag, major, minor, xmajor, xminor;
1023 PLFLT ymajor, yminor, dxm, dym, vmin, vmax;
1026 vmin = ( vmax_in > vmin_in ) ? vmin_in : vmax_in;
1027 vmax = ( vmax_in > vmin_in ) ? vmax_in : vmin_in;
1033 major = plsc->majht;
1034 minor = plsc->minht;
1054 plztx(
"h", dx, dy, wx, wy1, wy2, 5.0, 0.5, 0.5, label );
1057 plztx(
"h", dx, dy, wx, wy1, wy2, -5.0, 0.5, 0.5, label );
1062 if ( !right && !lb )
1069 pldtik( vmin, vmax, &tick1, &nsub1, ld );
1071 if ( ( li && !right ) || ( !li && right ) )
1077 dxm = dx * plsc->wmxscl;
1078 dym = dy * plsc->wmyscl;
1079 diag = sqrt( dxm * dxm + dym * dym );
1081 xminor = minor * dxm / diag;
1082 xmajor = major * dxm / diag;
1083 yminor = minor * dym / diag;
1084 ymajor = major * dym / diag;
1092 tp = tick1 * floor( vmin / tick1 );
1100 for ( i = 0; i <= 7; i++ )
1102 temp = tp +
xlog[i];
1103 if (
BETW( temp, vmin, vmax ) )
1105 lambda = ( vmax_in > vmin_in ) ?
1106 ( temp - vmin ) / ( vmax - vmin ) :
1107 ( vmax - temp ) / ( vmax - vmin );
1116 for ( i = 1; i <= nsub1 - 1; i++ )
1118 temp = tp + i * tick1 / nsub1;
1119 if (
BETW( temp, vmin, vmax ) )
1121 lambda = ( vmax_in > vmin_in ) ?
1122 ( temp - vmin ) / ( vmax - vmin ) :
1123 ( vmax - temp ) / ( vmax - vmin );
1132 if ( !
BETW( temp, vmin, vmax ) )
1134 lambda = ( vmax_in > vmin_in ) ?
1135 ( temp - vmin ) / ( vmax - vmin ) :
1136 ( vmax - temp ) / ( vmax - vmin );
1146 if ( ( ln || lm ) && lt )
1148 pldprec( vmin, vmax, tick1, lf, &mode, &prec, *digits, &scale );
1150 tp = tick1 * floor( vmin / tick1 );
1151 for ( tn = tp + tick1;
BETW( tn, vmin, vmax ); tn += tick1 )
1154 pos = ( vmax_in > vmin_in ) ?
1155 ( tn - vmin ) / ( vmax - vmin ) :
1156 ( vmax - tn ) / ( vmax - vmin );
1158 plztx(
"v", dx, dy, wx, wy1, wy2, 0.5, pos, 1.0,
string );
1161 plztx(
"v", dx, dy, wx, wy1, wy2, -0.5, pos, 0.0,
string );
1163 lstring = (
PLINT) strlen(
string );
1164 *digits =
MAX( *digits, lstring );
1166 if ( !ll && !lo && mode )
1168 snprintf(
string,
STRING_LEN,
"(x10%su%d%sd)", esc_string, (
int) scale, esc_string );
1173 plztx(
"v", dx, dy, wx, wy1, wy2, height, pos, 0.5,
string );
1177 plztx(
"v", dx, dy, wx, wy1, wy2,
1178 (
PLFLT) -height, pos, 0.5,
string );
1195 PLINT refx = 0, refy = 0, x = 0, y = 0, vert = 0;
1196 PLFLT shift, cc, ss, wy;
1197 PLFLT xdv, ydv, xmm, ymm, refxmm, refymm,
xform[4], diag;
1199 PLFLT chrdef, chrht;
1201 cc = plsc->wmxscl *
dx;
1202 ss = plsc->wmyscl *
dy;
1203 diag = sqrt( cc * cc + ss * ss );
1206 wy = wy1 + pos * ( wy2 - wy1 );
1234 plgchr( &chrdef, &chrht );
1235 shift = ( just == 0.0 ) ? 0.0 :
plstrl( text ) * just;
1239 refxmm = xmm - shift * xform[0];
1240 refymm = ymm - shift * xform[2];
1247 plP_text( 0, just, xform, x, y, refx, refy, text );
1262 const char *yopt,
PLFLT ytick1,
PLINT nysub1 )
1264 PLINT lgx, lhx, llx, ldx;
1265 PLINT lgy, lhy, lly, ldy;
1266 PLFLT vpwxmi, vpwxma, vpwymi, vpwyma;
1267 PLFLT vpwxmin, vpwxmax, vpwymin, vpwymax;
1268 PLFLT tn, temp, tcrit, tspace = 0.1;
1269 PLFLT tstart, factor;
1284 plP_xgvpw( &vpwxmin, &vpwxmax, &vpwymin, &vpwymax );
1287 vpwxmi = ( vpwxmax > vpwxmin ) ? vpwxmin : vpwxmax;
1288 vpwxma = ( vpwxmax > vpwxmin ) ? vpwxmax : vpwxmin;
1289 vpwymi = ( vpwymax > vpwymin ) ? vpwymin : vpwymax;
1290 vpwyma = ( vpwymax > vpwymin ) ? vpwymax : vpwymin;
1298 pldtfac( vpwxmi, vpwxma, &factor, &tstart );
1299 tn = xtick1 * ( floor( ( vpwxmi - tstart ) / xtick1 ) ) + tstart;
1303 tn = xtick1 * floor( vpwxmi / xtick1 );
1305 for (; tn <= vpwxma; tn += xtick1 )
1312 for ( i = 0; i <= 7; i++ )
1314 temp = tn +
xlog[i];
1315 tcrit = ( temp - otemp ) * tspace;
1317 if (
BETW( temp, vpwxmi + tcrit, vpwxma - tcrit ) )
1318 pljoin( temp, vpwymi, temp, vpwyma );
1323 for ( i = 1; i <= nxsub1 - 1; i++ )
1325 temp = tn + i * xtick1 / nxsub1;
1326 tcrit = xtick1 / nxsub1 * tspace;
1327 if (
BETW( temp, vpwxmi + tcrit, vpwxma - tcrit ) )
1328 pljoin( temp, vpwymi, temp, vpwyma );
1332 tcrit = xtick1 * tspace;
1333 if (
BETW( tn, vpwxmi + tcrit, vpwxma - tcrit ) )
1334 pljoin( tn, vpwymi, tn, vpwyma );
1344 pldtfac( vpwymi, vpwyma, &factor, &tstart );
1345 tn = ytick1 * ( floor( ( vpwymi - tstart ) / ytick1 ) ) + tstart;
1349 tn = ytick1 * floor( vpwymi / ytick1 );
1351 for (; tn <= vpwyma; tn += ytick1 )
1358 for ( i = 0; i <= 7; i++ )
1360 temp = tn +
xlog[i];
1361 tcrit = ( temp - otemp ) * tspace;
1363 if (
BETW( temp, vpwymi + tcrit, vpwyma - tcrit ) )
1364 pljoin( vpwxmi, temp, vpwxma, temp );
1369 for ( i = 1; i <= nysub1 - 1; i++ )
1371 temp = tn + i * ytick1 / nysub1;
1372 tcrit = ytick1 / nysub1 * tspace;
1373 if (
BETW( temp, vpwymi + tcrit, vpwyma - tcrit ) )
1374 pljoin( vpwxmi, temp, vpwxma, temp );
1378 tcrit = ytick1 * tspace;
1379 if (
BETW( tn, vpwymi + tcrit, vpwyma - tcrit ) )
1380 pljoin( vpwxmi, tn, vpwxma, tn );
1395 PLBOOL ldx, lfx, lix, llx, lmx, lnx, ltx, lox, lxx;
1396 PLBOOL ldy, lfy, liy, lly, lmy, lny, lty, lvy, loy, lxy;
1397 PLFLT vpwxmi, vpwxma, vpwymi, vpwyma;
1398 PLFLT vpwxmin, vpwxmax, vpwymin, vpwymax;
1399 PLFLT tn, tp, offset;
1400 PLFLT factor, tstart;
1401 const char *timefmt = NULL;
1402 PLFLT default_mm, char_height_mm, height_mm;
1403 PLFLT string_length_mm = 0.0, pos_mm = 0.0;
1407 PLBOOL custom_exponent_placement = !plsc->label_func && plsc->label_data;
1413 PLFLT pos = 0.0, height = 0.0, just = 0.0;
1416 plgchr( &default_mm, &char_height_mm );
1441 plP_xgvpw( &vpwxmin, &vpwxmax, &vpwymin, &vpwymax );
1444 vpwxmi = ( vpwxmax > vpwxmin ) ? vpwxmin : vpwxmax;
1445 vpwxma = ( vpwxmax > vpwxmin ) ? vpwxmax : vpwxmin;
1446 vpwymi = ( vpwymax > vpwymin ) ? vpwymin : vpwymax;
1447 vpwyma = ( vpwymax > vpwymin ) ? vpwymax : vpwymin;
1450 if ( ( lmx || lnx ) && ( ltx || lxx ) )
1454 plgxax( &xdigmax, &xdigits );
1455 pldprec( vpwxmi, vpwxma, xtick1, lfx, &xmode, &xprec, xdigmax, &xscale );
1460 pldtfac( vpwxmi, vpwxma, &factor, &tstart );
1461 tp = xtick1 * ( 1. + floor( ( vpwxmi - tstart ) / xtick1 ) ) + tstart;
1465 tp = xtick1 * ( 1. + floor( vpwxmi / xtick1 ) );
1467 height = lix ? 1.75 : 1.5;
1468 if ( plsc->if_boxbb )
1475 height_mm = ( height + 0.7 ) * char_height_mm;
1477 plsc->boxbb_ymin =
MIN( plsc->boxbb_ymin, plsc->vppymi /
1478 plsc->ypmm - height_mm );
1480 plsc->boxbb_ymax =
MAX( plsc->boxbb_ymax, plsc->vppyma /
1481 plsc->ypmm + height_mm );
1484 for ( tn = tp;
BETW( tn, vpwxmi, vpwxma ); tn += xtick1 )
1494 pos = ( vpwxmax > vpwxmin ) ?
1495 ( tn - vpwxmi ) / ( vpwxma - vpwxmi ) :
1496 ( vpwxma - tn ) / ( vpwxma - vpwxmi );
1497 if ( plsc->if_boxbb )
1499 string_length_mm =
plstrl(
string );
1500 pos_mm = ( plsc->vppxmi + pos *
1501 ( plsc->vppxma - plsc->vppxmi ) ) /
1507 if ( plsc->if_boxbb )
1509 plsc->boxbb_xmin =
MIN( plsc->boxbb_xmin,
1510 pos_mm - 0.5 * string_length_mm );
1511 plsc->boxbb_xmax =
MAX( plsc->boxbb_xmax,
1512 pos_mm + 0.5 * string_length_mm );
1516 plmtex(
"b", height, pos, 0.5,
string );
1522 if ( plsc->if_boxbb )
1524 plsc->boxbb_xmin =
MIN( plsc->boxbb_xmin,
1525 pos_mm - 0.5 * string_length_mm );
1526 plsc->boxbb_xmax =
MAX( plsc->boxbb_xmax,
1527 pos_mm + 0.5 * string_length_mm );
1531 plmtex(
"t", height, pos, 0.5,
string );
1536 plsxax( xdigmax, xdigits );
1540 if ( !llx && !ldx && !lox && xmode )
1542 if ( custom_exponent_placement )
1554 snprintf(
string,
STRING_LEN,
"(x10%su%d%sd)", esc_string, (
int) xscale, esc_string );
1558 if ( plsc->if_boxbb )
1565 height_mm = ( height + 0.9 ) * char_height_mm;
1566 plsc->boxbb_ymin =
MIN( plsc->boxbb_ymin, plsc->vppymi /
1567 plsc->ypmm - height_mm );
1568 string_length_mm =
plstrl(
string );
1569 pos_mm = ( plsc->vppxmi + pos *
1570 ( plsc->vppxma - plsc->vppxmi ) ) /
1572 plsc->boxbb_xmin =
MIN( plsc->boxbb_xmin,
1573 pos_mm - 0.5 * string_length_mm );
1574 plsc->boxbb_xmax =
MAX( plsc->boxbb_xmax,
1575 pos_mm + 0.5 * string_length_mm );
1579 plmtex(
"b", height, pos, just,
string );
1585 if ( plsc->if_boxbb )
1592 height_mm = ( height + 1.4 ) * char_height_mm;
1593 plsc->boxbb_ymax =
MAX( plsc->boxbb_ymax, plsc->vppyma /
1594 plsc->ypmm + height_mm );
1595 string_length_mm =
plstrl(
string );
1596 pos_mm = ( plsc->vppxmi + pos *
1597 ( plsc->vppxma - plsc->vppxmi ) ) /
1599 plsc->boxbb_xmin =
MIN( plsc->boxbb_xmin,
1600 pos_mm - 0.5 * string_length_mm );
1601 plsc->boxbb_xmax =
MAX( plsc->boxbb_xmax,
1602 pos_mm + 0.5 * string_length_mm );
1606 plmtex(
"t", height, pos, just,
string );
1614 if ( ( lmy || lny ) && ( lty || lxy ) )
1618 plgyax( &ydigmax, &ydigits );
1619 pldprec( vpwymi, vpwyma, ytick1, lfy, &ymode, &yprec, ydigmax, &yscale );
1624 pldtfac( vpwymi, vpwyma, &factor, &tstart );
1625 tp = ytick1 * ( 1. + floor( ( vpwymi - tstart ) / ytick1 ) ) + tstart;
1629 tp = ytick1 * ( 1. + floor( vpwymi / ytick1 ) );
1631 for ( tn = tp;
BETW( tn, vpwymi, vpwyma ); tn += ytick1 )
1641 pos = ( vpwymax > vpwymin ) ?
1642 ( tn - vpwymi ) / ( vpwyma - vpwymi ) :
1643 ( vpwyma - tn ) / ( vpwyma - vpwymi );
1649 height = liy ? 1.0 : 0.5;
1650 if ( plsc->if_boxbb )
1658 height_mm = ( height + 0.0 ) * char_height_mm;
1659 string_length_mm =
plstrl(
string );
1660 plsc->boxbb_xmin =
MIN( plsc->boxbb_xmin, plsc->vppxmi /
1661 plsc->xpmm - height_mm - string_length_mm );
1662 pos_mm = ( plsc->vppymi + pos *
1663 ( plsc->vppyma - plsc->vppymi ) ) /
1667 plsc->boxbb_ymin =
MIN( plsc->boxbb_ymin,
1668 pos_mm - 0.6 * char_height_mm );
1669 plsc->boxbb_ymax =
MAX( plsc->boxbb_ymax,
1670 pos_mm + 0.7 * char_height_mm );
1674 plmtex(
"lv", height, pos, 1.0,
string );
1680 height = liy ? 1.75 : 1.5;
1681 if ( plsc->if_boxbb )
1690 height_mm = ( height + 0.8 ) * char_height_mm;
1691 plsc->boxbb_xmin =
MIN( plsc->boxbb_xmin, plsc->vppxmi /
1692 plsc->xpmm - height_mm );
1693 pos_mm = ( plsc->vppymi + pos *
1694 ( plsc->vppyma - plsc->vppymi ) ) /
1696 string_length_mm =
plstrl(
string );
1697 plsc->boxbb_ymin =
MIN( plsc->boxbb_ymin,
1698 pos_mm - 0.5 * string_length_mm );
1699 plsc->boxbb_ymax =
MAX( plsc->boxbb_ymax,
1700 pos_mm + 0.5 * string_length_mm );
1704 plmtex(
"l", height, pos, 0.5,
string );
1713 height = liy ? 1.0 : 0.5;
1714 if ( plsc->if_boxbb )
1722 height_mm = ( height + 0.0 ) * char_height_mm;
1723 string_length_mm =
plstrl(
string );
1724 plsc->boxbb_xmax =
MAX( plsc->boxbb_xmax, plsc->vppxma /
1725 plsc->xpmm + height_mm + string_length_mm );
1726 pos_mm = ( plsc->vppymi + pos *
1727 ( plsc->vppyma - plsc->vppymi ) ) /
1731 plsc->boxbb_ymin =
MIN( plsc->boxbb_ymin,
1732 pos_mm - 0.6 * char_height_mm );
1733 plsc->boxbb_ymax =
MAX( plsc->boxbb_ymax,
1734 pos_mm + 0.7 * char_height_mm );
1738 plmtex(
"rv", height, pos, 0.0,
string );
1744 height = liy ? 1.75 : 1.5;
1745 if ( plsc->if_boxbb )
1754 height_mm = ( height + 0.8 ) * char_height_mm;
1755 plsc->boxbb_xmax =
MAX( plsc->boxbb_xmax, plsc->vppxma /
1756 plsc->xpmm + height_mm );
1757 pos_mm = ( plsc->vppymi + pos *
1758 ( plsc->vppyma - plsc->vppymi ) ) /
1760 string_length_mm =
plstrl(
string );
1761 plsc->boxbb_ymin =
MIN( plsc->boxbb_ymin,
1762 pos_mm - 0.5 * string_length_mm );
1763 plsc->boxbb_ymax =
MAX( plsc->boxbb_ymax,
1764 pos_mm + 0.5 * string_length_mm );
1768 plmtex(
"r", height, pos, 0.5,
string );
1772 ydigits =
MAX( ydigits, (
PLINT) strlen(
string ) );
1777 plsyax( ydigmax, ydigits );
1781 if ( !lly && !ldy && !loy && ymode )
1783 snprintf(
string,
STRING_LEN,
"(x10%su%d%sd)", esc_string, (
int) yscale, esc_string );
1784 if ( custom_exponent_placement )
1801 if ( !custom_exponent_placement )
1807 if ( plsc->if_boxbb )
1814 height_mm = ( height + 1.4 ) * char_height_mm;
1815 plsc->boxbb_ymax =
MAX( plsc->boxbb_ymax, plsc->vppyma /
1816 plsc->ypmm + height_mm );
1817 string_length_mm =
plstrl(
string );
1818 pos_mm = ( plsc->vppxmi + pos *
1819 ( plsc->vppxma - plsc->vppxmi ) ) /
1821 plsc->boxbb_xmin =
MIN( plsc->boxbb_xmin,
1822 pos_mm - string_length_mm );
1828 plmtex(
"lv", height, pos, just,
string );
1832 plmtex(
"l", height, pos, just,
string );
1839 if ( !custom_exponent_placement )
1845 if ( plsc->if_boxbb )
1852 height_mm = ( height + 1.4 ) * char_height_mm;
1853 plsc->boxbb_ymax =
MAX( plsc->boxbb_ymax, plsc->vppyma /
1854 plsc->ypmm + height_mm );
1855 string_length_mm =
plstrl(
string );
1856 pos_mm = ( plsc->vppxmi + pos *
1857 ( plsc->vppxma - plsc->vppxmi ) ) /
1859 plsc->boxbb_xmax =
MAX( plsc->boxbb_xmin,
1860 pos_mm + string_length_mm );
1866 plmtex(
"rv", height, pos, just,
string );
1870 plmtex(
"r", height, pos, just,
string );
1888 PLBOOL ldx, lfx, lix, llx, lmx, lnx, ltx, lox, lxx;
1889 PLBOOL ldy, lfy, liy, lly, lmy, lny, lty, lvy, loy, lxy;
1890 PLFLT vpwxmi, vpwxma, vpwymi, vpwyma;
1891 PLFLT vpwxmin, vpwxmax, vpwymin, vpwymax;
1893 const char *timefmt;
1895 PLINT xdigmax, xdigits, xdigmax_old, xdigits_old;
1896 PLINT ydigmax, ydigits, ydigmax_old, ydigits_old;
1897 PLINT lxmin, lxmax, lymin, lymax;
1898 PLINT pxmin, pxmax, pymin, pymax;
1899 PLFLT default_mm, char_height_mm, height_mm;
1900 PLFLT string_length_mm = 0.0, pos_mm = 0.0;
1904 PLBOOL custom_exponent_placement = !plsc->label_func && plsc->label_data;
1910 PLFLT pos = 0.0, height = 0.0, just = 0.0;
1913 plgchr( &default_mm, &char_height_mm );
1916 plgxax( &xdigmax, &xdigits );
1917 plgyax( &ydigmax, &ydigits );
1918 xdigmax_old = xdigmax;
1919 xdigits_old = xdigits;
1920 ydigmax_old = ydigmax;
1921 ydigits_old = ydigits;
1925 plP_gclp( &lxmin, &lxmax, &lymin, &lymax );
1926 plP_gphy( &pxmin, &pxmax, &pymin, &pymax );
1927 plP_sclp( pxmin, pxmax, pymin, pymax );
1952 plP_xgvpw( &vpwxmin, &vpwxmax, &vpwymin, &vpwymax );
1955 vpwxmi = ( vpwxmax > vpwxmin ) ? vpwxmin : vpwxmax;
1956 vpwxma = ( vpwxmax > vpwxmin ) ? vpwxmax : vpwxmin;
1957 vpwymi = ( vpwymax > vpwymin ) ? vpwymin : vpwymax;
1958 vpwyma = ( vpwymax > vpwymin ) ? vpwymax : vpwymin;
1960 if ( plsc->if_boxbb )
1966 plsc->boxbb_xmin = plsc->vppxmi / plsc->xpmm;
1967 plsc->boxbb_xmax = plsc->vppxma / plsc->xpmm;
1968 plsc->boxbb_ymin = plsc->vppymi / plsc->ypmm;
1969 plsc->boxbb_ymax = plsc->vppyma / plsc->ypmm;
1974 if ( lix && ( lmx || lnx ) && ( ltx && !lxx ) )
1976 plsc->boxbb_ymin -= xmajor / plsc->ypmm;
1977 plsc->boxbb_ymax += xmajor / plsc->ypmm;
1979 if ( liy && ( lmy || lny ) && ( lty && !lxy ) )
1981 plsc->boxbb_xmin -= ymajor / plsc->xpmm;
1982 plsc->boxbb_xmax += ymajor / plsc->xpmm;
1987 if ( ( lmx || lnx ) && ( ltx || lxx ) )
1990 PLFLT x_spacing, x_spacing_tmp;
1994 x_spacing = vpwxma - vpwxmi;
1998 for ( i = 1; i < n_xticks; i++ )
2000 x_spacing_tmp = fabs( xticks[i] - xticks[i - 1] );
2001 x_spacing =
MIN( x_spacing, x_spacing_tmp );
2005 plgxax( &xdigmax, &xdigits );
2006 pldprec( vpwxmi, vpwxma, x_spacing, lfx, &xmode, &xprec, xdigmax, &xscale );
2009 height = lix ? 1.75 : 1.5;
2010 if ( plsc->if_boxbb )
2017 height_mm = ( height + 0.7 ) * char_height_mm;
2019 plsc->boxbb_ymin =
MIN( plsc->boxbb_ymin, plsc->vppymi /
2020 plsc->ypmm - height_mm );
2022 plsc->boxbb_ymax =
MAX( plsc->boxbb_ymax, plsc->vppyma /
2023 plsc->ypmm + height_mm );
2026 for ( i = 0; i < n_xticks; i++ )
2029 if (
BETW( tn, vpwxmi, vpwxma ) )
2031 if ( !lxx && !plsc->if_boxbb )
2044 pos = ( vpwxmax > vpwxmin ) ?
2045 ( tn - vpwxmi ) / ( vpwxma - vpwxmi ) :
2046 ( vpwxma - tn ) / ( vpwxma - vpwxmi );
2047 if ( plsc->if_boxbb )
2049 string_length_mm =
plstrl(
string );
2050 pos_mm = ( plsc->vppxmi + pos *
2051 ( plsc->vppxma - plsc->vppxmi ) ) /
2057 if ( plsc->if_boxbb )
2059 plsc->boxbb_xmin =
MIN( plsc->boxbb_xmin,
2060 pos_mm - 0.5 * string_length_mm );
2061 plsc->boxbb_xmax =
MAX( plsc->boxbb_xmax,
2062 pos_mm + 0.5 * string_length_mm );
2066 plmtex(
"b", height, pos, 0.5,
string );
2072 if ( plsc->if_boxbb )
2074 plsc->boxbb_xmin =
MIN( plsc->boxbb_xmin,
2075 pos_mm - 0.5 * string_length_mm );
2076 plsc->boxbb_xmax =
MAX( plsc->boxbb_xmax,
2077 pos_mm + 0.5 * string_length_mm );
2081 plmtex(
"t", height, pos, 0.5,
string );
2087 plsxax( xdigmax, xdigits );
2091 if ( !llx && !ldx && !lox && xmode )
2093 if ( custom_exponent_placement )
2105 snprintf(
string,
STRING_LEN,
"(x10%su%d%sd)", esc_string, (
int) xscale, esc_string );
2109 if ( plsc->if_boxbb )
2116 height_mm = ( height + 0.9 ) * char_height_mm;
2117 plsc->boxbb_ymin =
MIN( plsc->boxbb_ymin, plsc->vppymi /
2118 plsc->ypmm - height_mm );
2119 string_length_mm =
plstrl(
string );
2120 pos_mm = ( plsc->vppxmi + pos *
2121 ( plsc->vppxma - plsc->vppxmi ) ) /
2123 plsc->boxbb_xmin =
MIN( plsc->boxbb_xmin,
2124 pos_mm - 0.5 * string_length_mm );
2125 plsc->boxbb_xmax =
MAX( plsc->boxbb_xmax,
2126 pos_mm + 0.5 * string_length_mm );
2130 plmtex(
"b", height, pos, just,
string );
2136 if ( plsc->if_boxbb )
2143 height_mm = ( height + 1.4 ) * char_height_mm;
2144 plsc->boxbb_ymax =
MAX( plsc->boxbb_ymax, plsc->vppyma /
2145 plsc->ypmm + height_mm );
2146 string_length_mm =
plstrl(
string );
2147 pos_mm = ( plsc->vppxmi + pos *
2148 ( plsc->vppxma - plsc->vppxmi ) ) /
2150 plsc->boxbb_xmin =
MIN( plsc->boxbb_xmin,
2151 pos_mm - 0.5 * string_length_mm );
2152 plsc->boxbb_xmax =
MAX( plsc->boxbb_xmax,
2153 pos_mm + 0.5 * string_length_mm );
2157 plmtex(
"t", height, pos, just,
string );
2164 if ( ( lmy || lny ) && ( lty || lxy ) )
2167 PLFLT y_spacing, y_spacing_tmp;
2171 y_spacing = vpwyma - vpwymi;
2175 for ( i = 1; i < n_yticks; i++ )
2177 y_spacing_tmp = fabs( yticks[i] - yticks[i - 1] );
2178 y_spacing =
MIN( y_spacing, y_spacing_tmp );
2182 plgyax( &ydigmax, &ydigits );
2183 pldprec( vpwymi, vpwyma, y_spacing, lfy, &ymode, &yprec, ydigmax, &yscale );
2187 for ( i = 0; i < n_yticks; i++ )
2190 if (
BETW( tn, vpwymi, vpwyma ) )
2192 if ( !lxy && !plsc->if_boxbb )
2205 pos = ( vpwymax > vpwymin ) ?
2206 ( tn - vpwymi ) / ( vpwyma - vpwymi ) :
2207 ( vpwyma - tn ) / ( vpwyma - vpwymi );
2213 height = liy ? 1.0 : 0.5;
2214 if ( plsc->if_boxbb )
2222 height_mm = ( height + 0.0 ) * char_height_mm;
2223 string_length_mm =
plstrl(
string );
2224 plsc->boxbb_xmin =
MIN( plsc->boxbb_xmin, plsc->vppxmi /
2225 plsc->xpmm - height_mm - string_length_mm );
2226 pos_mm = ( plsc->vppymi + pos *
2227 ( plsc->vppyma - plsc->vppymi ) ) /
2231 plsc->boxbb_ymin =
MIN( plsc->boxbb_ymin,
2232 pos_mm - 0.6 * char_height_mm );
2233 plsc->boxbb_ymax =
MAX( plsc->boxbb_ymax,
2234 pos_mm + 0.7 * char_height_mm );
2238 plmtex(
"lv", height, pos, 1.0,
string );
2244 height = liy ? 1.75 : 1.5;
2245 if ( plsc->if_boxbb )
2254 height_mm = ( height + 0.8 ) * char_height_mm;
2255 plsc->boxbb_xmin =
MIN( plsc->boxbb_xmin, plsc->vppxmi /
2256 plsc->xpmm - height_mm );
2257 pos_mm = ( plsc->vppymi + pos *
2258 ( plsc->vppyma - plsc->vppymi ) ) /
2260 string_length_mm =
plstrl(
string );
2261 plsc->boxbb_ymin =
MIN( plsc->boxbb_ymin,
2262 pos_mm - 0.5 * string_length_mm );
2263 plsc->boxbb_ymax =
MAX( plsc->boxbb_ymax,
2264 pos_mm + 0.5 * string_length_mm );
2268 plmtex(
"l", height, pos, 0.5,
string );
2277 height = liy ? 1.0 : 0.5;
2278 if ( plsc->if_boxbb )
2286 height_mm = ( height + 0.0 ) * char_height_mm;
2287 string_length_mm =
plstrl(
string );
2288 plsc->boxbb_xmax =
MAX( plsc->boxbb_xmax, plsc->vppxma /
2289 plsc->xpmm + height_mm + string_length_mm );
2290 pos_mm = ( plsc->vppymi + pos *
2291 ( plsc->vppyma - plsc->vppymi ) ) /
2295 plsc->boxbb_ymin =
MIN( plsc->boxbb_ymin,
2296 pos_mm - 0.6 * char_height_mm );
2297 plsc->boxbb_ymax =
MAX( plsc->boxbb_ymax,
2298 pos_mm + 0.7 * char_height_mm );
2302 plmtex(
"rv", height, pos, 0.0,
string );
2308 height = liy ? 1.75 : 1.5;
2309 if ( plsc->if_boxbb )
2318 height_mm = ( height + 0.8 ) * char_height_mm;
2319 plsc->boxbb_xmax =
MAX( plsc->boxbb_xmax, plsc->vppxma /
2320 plsc->xpmm + height_mm );
2321 pos_mm = ( plsc->vppymi + pos *
2322 ( plsc->vppyma - plsc->vppymi ) ) /
2324 string_length_mm =
plstrl(
string );
2325 plsc->boxbb_ymin =
MIN( plsc->boxbb_ymin,
2326 pos_mm - 0.5 * string_length_mm );
2327 plsc->boxbb_ymax =
MAX( plsc->boxbb_ymax,
2328 pos_mm + 0.5 * string_length_mm );
2332 plmtex(
"r", height, pos, 0.5,
string );
2336 ydigits =
MAX( ydigits, (
PLINT) strlen(
string ) );
2342 plsyax( ydigmax, ydigits );
2346 if ( !lly && !ldy && !loy && ymode )
2348 snprintf(
string,
STRING_LEN,
"(x10%su%d%sd)", esc_string, (
int) yscale, esc_string );
2349 if ( custom_exponent_placement )
2366 if ( !custom_exponent_placement )
2372 if ( plsc->if_boxbb )
2379 height_mm = ( height + 1.4 ) * char_height_mm;
2380 plsc->boxbb_ymax =
MAX( plsc->boxbb_ymax, plsc->vppyma /
2381 plsc->ypmm + height_mm );
2382 string_length_mm =
plstrl(
string );
2383 pos_mm = ( plsc->vppxmi + pos *
2384 ( plsc->vppxma - plsc->vppxmi ) ) /
2386 plsc->boxbb_xmin =
MIN( plsc->boxbb_xmin,
2387 pos_mm - string_length_mm );
2393 plmtex(
"lv", height, pos, just,
string );
2397 plmtex(
"l", height, pos, just,
string );
2404 if ( !custom_exponent_placement )
2410 if ( plsc->if_boxbb )
2417 height_mm = ( height + 1.4 ) * char_height_mm;
2418 plsc->boxbb_ymax =
MAX( plsc->boxbb_ymax, plsc->vppyma /
2419 plsc->ypmm + height_mm );
2420 string_length_mm =
plstrl(
string );
2421 pos_mm = ( plsc->vppxmi + pos *
2422 ( plsc->vppxma - plsc->vppxmi ) ) /
2424 plsc->boxbb_xmax =
MAX( plsc->boxbb_xmin,
2425 pos_mm + string_length_mm );
2431 plmtex(
"rv", height, pos, just,
string );
2435 plmtex(
"r", height, pos, just,
string );
2443 plsxax( xdigmax_old, xdigits_old );
2444 plsyax( ydigmax_old, ydigits_old );
2447 plP_sclp( lxmin, lxmax, lymin, lymax );
2465 snprintf(
string, (
size_t) len,
"10%su%d", esc_string, (
int)
ROUND( value ) );
2472 int exponent =
ROUND( value );
2474 value = pow( 10.0, exponent );
2479 snprintf(
string, (
size_t) len, form, value );
2483 snprintf(
string, (
size_t) len,
"%d", (
int) value );
2490 PLINT setpre, precis;
2494 scale = ( (
PLINT *) data )[0];
2495 prec = ( (
PLINT *) data )[1];
2503 value /= pow( 10., (
double) scale );
2507 scale2 = pow( 10., prec );
2508 value = floor( ( value * scale2 ) + .5 ) / scale2;
2512 strncpy(
string, temp, (
size_t) ( len - 1 ) );
2513 string[len - 1] =
'\0';
2547 if ( lo && plsc->label_func )
2549 ( *plsc->label_func )( axis, value,
string, len, plsc->label_data );
2555 plwarn(
"Custom axis labels requested without a labeling function \
2556 - using default." );
2576 PLINT scale_prec[2] = { scale, prec };
2608 plsc->label_data = label_data;
2614 static const char *esc_strings = {
"!\0#\0$\0%\0&\0*\0@\0^\0~\0" };
2618 if ( plsc->esc ==
'\0' )
2621 switch ( plsc->esc )
2651 plwarn(
"plgesc_string: Invalid escape character, assuming '#' instead" );
2655 return &( esc_strings[d * 2] );