30 #define N_EDGE_SEGMENTS 50
34 0.301030, 0.477121, 0.602060, 0.698970,
35 0.778151, 0.845098, 0.903090, 0.954243
63 const char *yopt,
PLFLT ytick1,
PLINT nysub1 );
94 c_plaxes( 0.0, 0.0, xopt, xtick, nxsub, yopt, ytick, nysub );
141 PLBOOL lax, lbx, lcx, ldx, lgx, lix, llx, lsx, ltx, lux, lwx, lxx;
142 PLBOOL lay, lby, lcy, ldy, lgy, liy, lly, lsy, lty, luy, lwy, lxy;
143 PLINT xmajor, xminor, ymajor, yminor;
144 PLINT i, i1x, i2x, i3x, i4x, i1y, i2y, i3y, i4y;
145 PLINT nxsub1, nysub1;
146 PLINT lxmin, lxmax, lymin, lymax;
147 PLINT pxmin, pxmax, pymin, pymax;
148 PLINT vppxmi, vppxma, vppymi, vppyma;
149 PLFLT xtick1, ytick1, vpwxmi, vpwxma, vpwymi, vpwyma;
150 PLFLT vpwxmin, vpwxmax, vpwymin, vpwymax;
151 PLFLT xp0, yp0, tn, tp, temp;
152 PLFLT factor, tstart;
154 if ( plsc->level < 3 )
156 plabort(
"plbox: Please set up window first" );
162 plP_gclp( &lxmin, &lxmax, &lymin, &lymax );
163 plP_gphy( &pxmin, &pxmax, &pymin, &pymax );
164 plP_sclp( pxmin, pxmax, pymin, pymax );
166 vppxmi = plsc->vppxmi;
167 vppxma = plsc->vppxma;
168 vppymi = plsc->vppymi;
169 vppyma = plsc->vppyma;
171 if ( plsc->if_boxbb )
175 plsc->boxbb_xmin = plsc->vppxmi / plsc->xpmm;
176 plsc->boxbb_xmax = plsc->vppxma / plsc->xpmm;
177 plsc->boxbb_ymin = plsc->vppymi / plsc->ypmm;
178 plsc->boxbb_ymax = plsc->vppyma / plsc->ypmm;
216 xmajor =
MAX(
ROUND( plsc->majht * plsc->ypmm ), 1 );
217 ymajor =
MAX(
ROUND( plsc->majht * plsc->xpmm ), 1 );
218 xminor =
MAX(
ROUND( plsc->minht * plsc->ypmm ), 1 );
219 yminor =
MAX(
ROUND( plsc->minht * plsc->xpmm ), 1 );
223 xtick1 = llx ? 1.0 : xtick;
224 ytick1 = lly ? 1.0 : ytick;
226 plP_xgvpw( &vpwxmin, &vpwxmax, &vpwymin, &vpwymax );
229 vpwxmi = ( vpwxmax > vpwxmin ) ? vpwxmin : vpwxmax;
230 vpwxma = ( vpwxmax > vpwxmin ) ? vpwxmax : vpwxmin;
231 vpwymi = ( vpwymax > vpwymin ) ? vpwymin : vpwymax;
232 vpwyma = ( vpwymax > vpwymin ) ? vpwymax : vpwymin;
235 lax = lax && vpwymi < y0 && y0 < vpwyma;
236 lay = lay && vpwxmi < x0 && x0 < vpwxma;
240 if ( ltx || lgx || lxx )
241 pldtik( vpwxmi, vpwxma, &xtick1, &nxsub1, ldx );
243 if ( lty || lgy || lxy )
244 pldtik( vpwymi, vpwyma, &ytick1, &nysub1, ldy );
279 if ( plsc->if_boxbb )
286 if ( lix && ( lbx || lux ) && ( ltx && !lxx ) )
287 plsc->boxbb_ymin -= xmajor / plsc->ypmm;
288 if ( liy && ( lcy || lwy ) && ( lty && !lxy ) )
289 plsc->boxbb_xmax += ymajor / plsc->xpmm;
290 if ( lix && ( lcx || lwx ) && ( ltx && !lxx ) )
291 plsc->boxbb_ymax += xmajor / plsc->ypmm;
292 if ( liy && ( lby || luy ) && ( lty && !lxy ) )
293 plsc->boxbb_xmin -= ymajor / plsc->xpmm;
310 pldtfac( vpwxmi, vpwxma, &factor, &tstart );
311 tp = xtick1 * ( floor( ( vpwxmi - tstart ) / xtick1 ) ) + tstart;
314 tp = xtick1 * floor( vpwxmi / xtick1 );
322 for ( i = 0; i <= 7; i++ )
325 if (
BETW( temp, vpwxmi, vpwxma ) )
331 for ( i = 1; i <= nxsub1 - 1; i++ )
333 temp = tp + i * xtick1 / nxsub1;
334 if (
BETW( temp, vpwxmi, vpwxma ) )
339 if ( !
BETW( tn, vpwxmi, vpwxma ) )
360 pldtfac( vpwymi, vpwyma, &factor, &tstart );
361 tp = ytick1 * ( floor( ( vpwymi - tstart ) / ytick1 ) ) + tstart;
364 tp = ytick1 * floor( vpwymi / ytick1 );
372 for ( i = 0; i <= 7; i++ )
375 if (
BETW( temp, vpwymi, vpwyma ) )
381 for ( i = 1; i <= nysub1 - 1; i++ )
383 temp = tp + i * ytick1 / nysub1;
384 if (
BETW( temp, vpwymi, vpwyma ) )
389 if ( !
BETW( tn, vpwymi, vpwyma ) )
410 pldtfac( vpwxmi, vpwxma, &factor, &tstart );
411 tp = xtick1 * ( floor( ( vpwxma - tstart ) / xtick1 ) + 1 ) + tstart;
414 tp = xtick1 * ( floor( vpwxma / xtick1 ) + 1 );
422 for ( i = 7; i >= 0; i-- )
425 if (
BETW( temp, vpwxmi, vpwxma ) )
431 for ( i = nxsub1 - 1; i >= 1; i-- )
433 temp = tn + i * xtick1 / nxsub1;
434 if (
BETW( temp, vpwxmi, vpwxma ) )
439 if ( !
BETW( tn, vpwxmi, vpwxma ) )
460 pldtfac( vpwymi, vpwyma, &factor, &tstart );
461 tp = ytick1 * ( floor( ( vpwyma - tstart ) / ytick1 ) + 1 ) + tstart;
464 tp = ytick1 * ( floor( vpwyma / ytick1 ) + 1 );
472 for ( i = 7; i >= 0; i-- )
475 if (
BETW( temp, vpwymi, vpwyma ) )
481 for ( i = nysub1 - 1; i >= 1; i-- )
483 temp = tn + i * ytick1 / nysub1;
484 if (
BETW( temp, vpwymi, vpwyma ) )
489 if ( !
BETW( tn, vpwymi, vpwyma ) )
504 tp = xtick1 * floor( vpwxmi / xtick1 );
512 for ( i = 0; i <= 7; i++ )
515 if (
BETW( temp, vpwxmi, vpwxma ) )
521 for ( i = 1; i <= nxsub1 - 1; i++ )
523 temp = tp + i * xtick1 / nxsub1;
524 if (
BETW( temp, vpwxmi, vpwxma ) )
529 if ( !
BETW( tn, vpwxmi, vpwxma ) )
544 tp = ytick1 * floor( vpwymi / ytick1 );
552 for ( i = 0; i <= 7; i++ )
555 if (
BETW( temp, vpwymi, vpwyma ) )
561 for ( i = 1; i <= nysub1 - 1; i++ )
563 temp = tp + i * ytick1 / nysub1;
564 if (
BETW( temp, vpwymi, vpwyma ) )
569 if ( !
BETW( tn, vpwymi, vpwyma ) )
578 grid_box( xopt, xtick1, nxsub1, yopt, ytick1, nysub1 );
586 plP_sclp( lxmin, lxmax, lymin, lymax );
597 const char *yopt,
const char *ylabel,
PLFLT ytick,
PLINT nysub,
598 const char *zopt,
const char *zlabel,
PLFLT ztick,
PLINT nzsub )
602 PLFLT cxx, cxy, cyx, cyy, cyz;
607 PLINT xdigmax, xdigits;
608 PLINT ydigmax, ydigits;
609 PLINT zdigmax, zdigits;
611 if ( plsc->level < 3 )
613 plabort(
"plbox3: Please set up window first" );
617 plP_gw3wc( &cxx, &cxy, &cyx, &cyy, &cyz );
618 plP_gdom( &xmin, &xmax, &ymin, &ymax );
621 plgxax( &xdigmax, &xdigits );
622 plgyax( &ydigmax, &ydigits );
623 plgzax( &zdigmax, &zdigits );
632 plP_gzback( &zbflg, &zbcol, &zbtck, &zbwidth );
637 *zbcol = plsc->icol0;
638 *zbwidth = plsc->width;
641 if ( cxx >= 0.0 && cxy <= 0.0 )
649 xmin, xmax, xtick, nxsub, 0, &xdigits );
653 plzbx( zopt, zlabel, 1, dx, dy, ux, uy,
654 plP_w3wcy( xmax, ymin, zmax ), zmin, zmax, ztick, nzsub, &zdigits );
661 ymax, ymin, ytick, nysub, ln, &ydigits );
667 plzbx( zopt, zlabel, 0, dx, dy, tx, ty,
668 plP_w3wcy( xmin, ymax, zmax ), zmin, zmax, ztick, nzsub, &zdigits );
670 else if ( cxx <= 0.0 && cxy <= 0.0 )
678 ymax, ymin, ytick, nysub, 0, &ydigits );
682 plzbx( zopt, zlabel, 1, dx, dy, ux, uy,
683 plP_w3wcy( xmin, ymin, zmax ), zmin, zmax, ztick, nzsub, &zdigits );
690 xmax, xmin, xtick, nxsub, ln, &xdigits );
696 plzbx( zopt, zlabel, 0, dx, dy, tx, ty,
697 plP_w3wcy( xmax, ymax, zmax ), zmin, zmax, ztick, nzsub, &zdigits );
699 else if ( cxx <= 0.0 && cxy >= 0.0 )
707 xmax, xmin, xtick, nxsub, 0, &xdigits );
711 plzbx( zopt, zlabel, 1, dx, dy, ux, uy,
712 plP_w3wcy( xmin, ymax, zmax ), zmin, zmax, ztick, nzsub, &zdigits );
719 ymin, ymax, ytick, nysub, ln, &ydigits );
725 plzbx( zopt, zlabel, 0, dx, dy, tx, ty,
726 plP_w3wcy( xmax, ymin, zmax ), zmin, zmax, ztick, nzsub, &zdigits );
728 else if ( cxx >= 0.0 && cxy >= 0.0 )
736 ymin, ymax, ytick, nysub, 0, &ydigits );
740 plzbx( zopt, zlabel, 1, dx, dy, ux, uy,
741 plP_w3wcy( xmax, ymax, zmax ), zmin, zmax, ztick, nzsub, &zdigits );
748 xmin, xmax, xtick, nxsub, ln, &xdigits );
754 plzbx( zopt, zlabel, 0, dx, dy, tx, ty,
755 plP_w3wcy( xmin, ymin, zmax ), zmin, zmax, ztick, nzsub, &zdigits );
757 plsxax( xdigmax, xdigits );
758 plsyax( ydigmax, ydigits );
759 plszax( zdigmax, zdigits );
792 PLINT lb, ld, lf, li, ll, ln, ls, lt, lu, lo;
793 PLINT major, minor, mode, prec, scale;
794 PLINT i, i1, i2, i3, i4;
796 PLFLT pos, tn, tp, temp, height, tick1, vmin, vmax;
799 PLFLT dwx, dwy, lambda, tcrit, tspace = 0.1;
802 vmin = ( vmax_in > vmin_in ) ? vmin_in : vmax_in;
803 vmax = ( vmax_in > vmin_in ) ? vmax_in : vmin_in;
810 major =
MAX(
ROUND( plsc->majht * plsc->ypmm ), 1 );
811 minor =
MAX(
ROUND( plsc->minht * plsc->ypmm ), 1 );
828 plxytx( wx1, wy1, wx2, wy2, 3.2, 0.5, 0.5, label );
833 tick1 = ( vmax > vmin ) ? 1.0 : -1.0;
835 pldtik( vmin, vmax, &tick1, &nsub1, ld );
858 tp = tick1 * floor( vmin / tick1 );
866 for ( i = 0; i <= 7; i++ )
869 if (
BETW( temp, vmin, vmax ) )
871 lambda = ( vmax_in > vmin_in ) ?
872 ( temp - vmin ) / ( vmax - vmin ) :
873 ( vmax - temp ) / ( vmax - vmin );
882 for ( i = 1; i <= nsub1 - 1; i++ )
884 temp = tp + i * ( tn - tp ) / nsub1;
885 if (
BETW( temp, vmin, vmax ) )
887 lambda = ( vmax_in > vmin_in ) ?
888 ( temp - vmin ) / ( vmax - vmin ) :
889 ( vmax - temp ) / ( vmax - vmin );
898 if ( !
BETW( temp, vmin, vmax ) )
901 lambda = ( vmax_in > vmin_in ) ?
902 ( temp - vmin ) / ( vmax - vmin ) :
903 ( vmax - temp ) / ( vmax - vmin );
915 pldprec( vmin, vmax, tick1, lf, &mode, &prec, *digits, &scale );
918 tcrit = tspace * tick1;
919 tp = tick1 * ( 1. + floor( vmin / tick1 ) );
920 for ( tn = tp;
BETW( tn, vmin, vmax ); tn += tick1 )
922 if (
BETW( tn, vmin + tcrit, vmax - tcrit ) )
925 pos = ( vmax_in > vmin_in ) ?
926 ( tn - vmin ) / ( vmax - vmin ) :
927 ( vmax - tn ) / ( vmax - vmin );
928 plxytx( wx1, wy1, wx2, wy2, 1.5, pos, 0.5,
string );
932 if ( !ll && !lo && mode )
935 plxytx( wx1, wy1, wx2, wy2, height, 1.0, 0.5,
string );
952 PLFLT shift, cc, ss, wx, wy;
953 PLFLT xdv, ydv, xmm, ymm, refxmm, refymm,
xform[4], diag;
957 cc = plsc->wmxscl * ( wx2 - wx1 );
958 ss = plsc->wmyscl * ( wy2 - wy1 );
959 diag = sqrt( cc * cc + ss * ss );
962 wx = wx1 + pos * ( wx2 - wx1 );
963 wy = wy1 + pos * ( wy2 - wy1 );
976 plgchr( &chrdef, &chrht );
977 shift = ( just == 0.0 ) ? 0.0 :
plstrl( text ) * just;
981 refxmm = xmm - shift * xform[0];
982 refymm = ymm - shift * xform[2];
989 plP_text( 0, just, xform, x, y, refx, refy, text );
1021 PLINT lb, lc, ld, lf, li, ll, lm, ln, ls, lt, lu, lv, lo;
1022 PLINT i, mode, prec, scale;
1023 PLINT nsub1, lstring;
1024 PLFLT pos, tn, tp, temp, height, tick1;
1025 PLFLT dwy, lambda, diag, major, minor, xmajor, xminor;
1026 PLFLT ymajor, yminor, dxm, dym, vmin, vmax;
1029 vmin = ( vmax_in > vmin_in ) ? vmin_in : vmax_in;
1030 vmax = ( vmax_in > vmin_in ) ? vmax_in : vmin_in;
1036 major = plsc->majht;
1037 minor = plsc->minht;
1057 plztx(
"h", dx, dy, wx, wy1, wy2, 5.0, 0.5, 0.5, label );
1060 plztx(
"h", dx, dy, wx, wy1, wy2, -5.0, 0.5, 0.5, label );
1065 if ( !right && !lb )
1072 pldtik( vmin, vmax, &tick1, &nsub1, ld );
1074 if ( ( li && !right ) || ( !li && right ) )
1080 dxm = dx * plsc->wmxscl;
1081 dym = dy * plsc->wmyscl;
1082 diag = sqrt( dxm * dxm + dym * dym );
1084 xminor = minor * dxm / diag;
1085 xmajor = major * dxm / diag;
1086 yminor = minor * dym / diag;
1087 ymajor = major * dym / diag;
1095 tp = tick1 * floor( vmin / tick1 );
1103 for ( i = 0; i <= 7; i++ )
1105 temp = tp +
xlog[i];
1106 if (
BETW( temp, vmin, vmax ) )
1108 lambda = ( vmax_in > vmin_in ) ?
1109 ( temp - vmin ) / ( vmax - vmin ) :
1110 ( vmax - temp ) / ( vmax - vmin );
1119 for ( i = 1; i <= nsub1 - 1; i++ )
1121 temp = tp + i * tick1 / nsub1;
1122 if (
BETW( temp, vmin, vmax ) )
1124 lambda = ( vmax_in > vmin_in ) ?
1125 ( temp - vmin ) / ( vmax - vmin ) :
1126 ( vmax - temp ) / ( vmax - vmin );
1135 if ( !
BETW( temp, vmin, vmax ) )
1137 lambda = ( vmax_in > vmin_in ) ?
1138 ( temp - vmin ) / ( vmax - vmin ) :
1139 ( vmax - temp ) / ( vmax - vmin );
1149 if ( ( ln || lm ) && lt )
1151 pldprec( vmin, vmax, tick1, lf, &mode, &prec, *digits, &scale );
1153 tp = tick1 * floor( vmin / tick1 );
1154 for ( tn = tp + tick1;
BETW( tn, vmin, vmax ); tn += tick1 )
1157 pos = ( vmax_in > vmin_in ) ?
1158 ( tn - vmin ) / ( vmax - vmin ) :
1159 ( vmax - tn ) / ( vmax - vmin );
1161 plztx(
"v", dx, dy, wx, wy1, wy2, 0.5, pos, 1.0,
string );
1164 plztx(
"v", dx, dy, wx, wy1, wy2, -0.5, pos, 0.0,
string );
1166 lstring = (
PLINT) strlen(
string );
1167 *digits =
MAX( *digits, lstring );
1169 if ( !ll && !lo && mode )
1171 snprintf(
string,
STRING_LEN,
"(x10%su%d%sd)", esc_string, (
int) scale, esc_string );
1176 plztx(
"v", dx, dy, wx, wy1, wy2, height, pos, 0.5,
string );
1180 plztx(
"v", dx, dy, wx, wy1, wy2,
1181 (
PLFLT) -height, pos, 0.5,
string );
1198 PLINT refx = 0, refy = 0,
x = 0,
y = 0, vert = 0;
1199 PLFLT shift, cc, ss, wy;
1200 PLFLT xdv, ydv, xmm, ymm, refxmm, refymm,
xform[4], diag;
1202 PLFLT chrdef, chrht;
1204 cc = plsc->wmxscl *
dx;
1205 ss = plsc->wmyscl *
dy;
1206 diag = sqrt( cc * cc + ss * ss );
1209 wy = wy1 + pos * ( wy2 - wy1 );
1237 plgchr( &chrdef, &chrht );
1238 shift = ( just == 0.0 ) ? 0.0 :
plstrl( text ) * just;
1242 refxmm = xmm - shift * xform[0];
1243 refymm = ymm - shift * xform[2];
1250 plP_text( 0, just, xform,
x,
y, refx, refy, text );
1265 const char *yopt,
PLFLT ytick1,
PLINT nysub1 )
1267 PLINT lgx, lhx, llx, ldx;
1268 PLINT lgy, lhy, lly, ldy;
1269 PLFLT vpwxmi, vpwxma, vpwymi, vpwyma;
1270 PLFLT vpwxmin, vpwxmax, vpwymin, vpwymax;
1271 PLFLT tn, temp, tcrit, tspace = 0.1;
1272 PLFLT tstart, factor;
1287 plP_xgvpw( &vpwxmin, &vpwxmax, &vpwymin, &vpwymax );
1290 vpwxmi = ( vpwxmax > vpwxmin ) ? vpwxmin : vpwxmax;
1291 vpwxma = ( vpwxmax > vpwxmin ) ? vpwxmax : vpwxmin;
1292 vpwymi = ( vpwymax > vpwymin ) ? vpwymin : vpwymax;
1293 vpwyma = ( vpwymax > vpwymin ) ? vpwymax : vpwymin;
1301 pldtfac( vpwxmi, vpwxma, &factor, &tstart );
1302 tn = xtick1 * ( floor( ( vpwxmi - tstart ) / xtick1 ) ) + tstart;
1306 tn = xtick1 * floor( vpwxmi / xtick1 );
1308 for (; tn <= vpwxma; tn += xtick1 )
1315 for ( i = 0; i <= 7; i++ )
1317 temp = tn +
xlog[i];
1318 tcrit = ( temp - otemp ) * tspace;
1320 if (
BETW( temp, vpwxmi + tcrit, vpwxma - tcrit ) )
1321 pljoin( temp, vpwymi, temp, vpwyma );
1326 for ( i = 1; i <= nxsub1 - 1; i++ )
1328 temp = tn + i * xtick1 / nxsub1;
1329 tcrit = xtick1 / nxsub1 * tspace;
1330 if (
BETW( temp, vpwxmi + tcrit, vpwxma - tcrit ) )
1331 pljoin( temp, vpwymi, temp, vpwyma );
1335 tcrit = xtick1 * tspace;
1336 if (
BETW( tn, vpwxmi + tcrit, vpwxma - tcrit ) )
1337 pljoin( tn, vpwymi, tn, vpwyma );
1347 pldtfac( vpwymi, vpwyma, &factor, &tstart );
1348 tn = ytick1 * ( floor( ( vpwymi - tstart ) / ytick1 ) ) + tstart;
1352 tn = ytick1 * floor( vpwymi / ytick1 );
1354 for (; tn <= vpwyma; tn += ytick1 )
1361 for ( i = 0; i <= 7; i++ )
1363 temp = tn +
xlog[i];
1364 tcrit = ( temp - otemp ) * tspace;
1366 if (
BETW( temp, vpwymi + tcrit, vpwyma - tcrit ) )
1367 pljoin( vpwxmi, temp, vpwxma, temp );
1372 for ( i = 1; i <= nysub1 - 1; i++ )
1374 temp = tn + i * ytick1 / nysub1;
1375 tcrit = ytick1 / nysub1 * tspace;
1376 if (
BETW( temp, vpwymi + tcrit, vpwyma - tcrit ) )
1377 pljoin( vpwxmi, temp, vpwxma, temp );
1381 tcrit = ytick1 * tspace;
1382 if (
BETW( tn, vpwymi + tcrit, vpwyma - tcrit ) )
1383 pljoin( vpwxmi, tn, vpwxma, tn );
1398 PLBOOL ldx, lfx, lix, llx, lmx, lnx, ltx, lox, lxx;
1399 PLBOOL ldy, lfy, liy, lly, lmy, lny, lty, lvy, loy, lxy;
1400 PLFLT vpwxmi, vpwxma, vpwymi, vpwyma;
1401 PLFLT vpwxmin, vpwxmax, vpwymin, vpwymax;
1402 PLFLT tn, tp, offset;
1403 PLFLT factor, tstart;
1404 const char *timefmt = NULL;
1405 PLFLT default_mm, char_height_mm, height_mm;
1406 PLFLT string_length_mm = 0.0, pos_mm = 0.0;
1410 PLBOOL custom_exponent_placement = !plsc->label_func && plsc->label_data;
1416 PLFLT pos = 0.0, height = 0.0, just = 0.0;
1419 plgchr( &default_mm, &char_height_mm );
1444 plP_xgvpw( &vpwxmin, &vpwxmax, &vpwymin, &vpwymax );
1447 vpwxmi = ( vpwxmax > vpwxmin ) ? vpwxmin : vpwxmax;
1448 vpwxma = ( vpwxmax > vpwxmin ) ? vpwxmax : vpwxmin;
1449 vpwymi = ( vpwymax > vpwymin ) ? vpwymin : vpwymax;
1450 vpwyma = ( vpwymax > vpwymin ) ? vpwymax : vpwymin;
1453 if ( ( lmx || lnx ) && ( ltx || lxx ) )
1457 plgxax( &xdigmax, &xdigits );
1458 pldprec( vpwxmi, vpwxma, xtick1, lfx, &xmode, &xprec, xdigmax, &xscale );
1463 pldtfac( vpwxmi, vpwxma, &factor, &tstart );
1464 tp = xtick1 * ( 1. + floor( ( vpwxmi - tstart ) / xtick1 ) ) + tstart;
1468 tp = xtick1 * ( 1. + floor( vpwxmi / xtick1 ) );
1470 height = lix ? 1.75 : 1.5;
1471 if ( plsc->if_boxbb )
1478 height_mm = ( height + 0.7 ) * char_height_mm;
1480 plsc->boxbb_ymin =
MIN( plsc->boxbb_ymin, plsc->vppymi /
1481 plsc->ypmm - height_mm );
1483 plsc->boxbb_ymax =
MAX( plsc->boxbb_ymax, plsc->vppyma /
1484 plsc->ypmm + height_mm );
1487 for ( tn = tp;
BETW( tn, vpwxmi, vpwxma ); tn += xtick1 )
1497 pos = ( vpwxmax > vpwxmin ) ?
1498 ( tn - vpwxmi ) / ( vpwxma - vpwxmi ) :
1499 ( vpwxma - tn ) / ( vpwxma - vpwxmi );
1500 if ( plsc->if_boxbb )
1502 string_length_mm =
plstrl(
string );
1503 pos_mm = ( plsc->vppxmi + pos *
1504 ( plsc->vppxma - plsc->vppxmi ) ) /
1510 if ( plsc->if_boxbb )
1512 plsc->boxbb_xmin =
MIN( plsc->boxbb_xmin,
1513 pos_mm - 0.5 * string_length_mm );
1514 plsc->boxbb_xmax =
MAX( plsc->boxbb_xmax,
1515 pos_mm + 0.5 * string_length_mm );
1519 plmtex(
"b", height, pos, 0.5,
string );
1525 if ( plsc->if_boxbb )
1527 plsc->boxbb_xmin =
MIN( plsc->boxbb_xmin,
1528 pos_mm - 0.5 * string_length_mm );
1529 plsc->boxbb_xmax =
MAX( plsc->boxbb_xmax,
1530 pos_mm + 0.5 * string_length_mm );
1534 plmtex(
"t", height, pos, 0.5,
string );
1539 plsxax( xdigmax, xdigits );
1543 if ( !llx && !ldx && !lox && xmode )
1545 if ( custom_exponent_placement )
1557 snprintf(
string,
STRING_LEN,
"(x10%su%d%sd)", esc_string, (
int) xscale, esc_string );
1561 if ( plsc->if_boxbb )
1568 height_mm = ( height + 0.9 ) * char_height_mm;
1569 plsc->boxbb_ymin =
MIN( plsc->boxbb_ymin, plsc->vppymi /
1570 plsc->ypmm - height_mm );
1571 string_length_mm =
plstrl(
string );
1572 pos_mm = ( plsc->vppxmi + pos *
1573 ( plsc->vppxma - plsc->vppxmi ) ) /
1575 plsc->boxbb_xmin =
MIN( plsc->boxbb_xmin,
1576 pos_mm - 0.5 * string_length_mm );
1577 plsc->boxbb_xmax =
MAX( plsc->boxbb_xmax,
1578 pos_mm + 0.5 * string_length_mm );
1582 plmtex(
"b", height, pos, just,
string );
1588 if ( plsc->if_boxbb )
1595 height_mm = ( height + 1.4 ) * char_height_mm;
1596 plsc->boxbb_ymax =
MAX( plsc->boxbb_ymax, plsc->vppyma /
1597 plsc->ypmm + height_mm );
1598 string_length_mm =
plstrl(
string );
1599 pos_mm = ( plsc->vppxmi + pos *
1600 ( plsc->vppxma - plsc->vppxmi ) ) /
1602 plsc->boxbb_xmin =
MIN( plsc->boxbb_xmin,
1603 pos_mm - 0.5 * string_length_mm );
1604 plsc->boxbb_xmax =
MAX( plsc->boxbb_xmax,
1605 pos_mm + 0.5 * string_length_mm );
1609 plmtex(
"t", height, pos, just,
string );
1617 if ( ( lmy || lny ) && ( lty || lxy ) )
1621 plgyax( &ydigmax, &ydigits );
1622 pldprec( vpwymi, vpwyma, ytick1, lfy, &ymode, &yprec, ydigmax, &yscale );
1627 pldtfac( vpwymi, vpwyma, &factor, &tstart );
1628 tp = ytick1 * ( 1. + floor( ( vpwymi - tstart ) / ytick1 ) ) + tstart;
1632 tp = ytick1 * ( 1. + floor( vpwymi / ytick1 ) );
1634 for ( tn = tp;
BETW( tn, vpwymi, vpwyma ); tn += ytick1 )
1644 pos = ( vpwymax > vpwymin ) ?
1645 ( tn - vpwymi ) / ( vpwyma - vpwymi ) :
1646 ( vpwyma - tn ) / ( vpwyma - vpwymi );
1652 height = liy ? 1.0 : 0.5;
1653 if ( plsc->if_boxbb )
1661 height_mm = ( height + 0.0 ) * char_height_mm;
1662 string_length_mm =
plstrl(
string );
1663 plsc->boxbb_xmin =
MIN( plsc->boxbb_xmin, plsc->vppxmi /
1664 plsc->xpmm - height_mm - string_length_mm );
1665 pos_mm = ( plsc->vppymi + pos *
1666 ( plsc->vppyma - plsc->vppymi ) ) /
1670 plsc->boxbb_ymin =
MIN( plsc->boxbb_ymin,
1671 pos_mm - 0.6 * char_height_mm );
1672 plsc->boxbb_ymax =
MAX( plsc->boxbb_ymax,
1673 pos_mm + 0.7 * char_height_mm );
1677 plmtex(
"lv", height, pos, 1.0,
string );
1683 height = liy ? 1.75 : 1.5;
1684 if ( plsc->if_boxbb )
1693 height_mm = ( height + 0.8 ) * char_height_mm;
1694 plsc->boxbb_xmin =
MIN( plsc->boxbb_xmin, plsc->vppxmi /
1695 plsc->xpmm - height_mm );
1696 pos_mm = ( plsc->vppymi + pos *
1697 ( plsc->vppyma - plsc->vppymi ) ) /
1699 string_length_mm =
plstrl(
string );
1700 plsc->boxbb_ymin =
MIN( plsc->boxbb_ymin,
1701 pos_mm - 0.5 * string_length_mm );
1702 plsc->boxbb_ymax =
MAX( plsc->boxbb_ymax,
1703 pos_mm + 0.5 * string_length_mm );
1707 plmtex(
"l", height, pos, 0.5,
string );
1716 height = liy ? 1.0 : 0.5;
1717 if ( plsc->if_boxbb )
1725 height_mm = ( height + 0.0 ) * char_height_mm;
1726 string_length_mm =
plstrl(
string );
1727 plsc->boxbb_xmax =
MAX( plsc->boxbb_xmax, plsc->vppxma /
1728 plsc->xpmm + height_mm + string_length_mm );
1729 pos_mm = ( plsc->vppymi + pos *
1730 ( plsc->vppyma - plsc->vppymi ) ) /
1734 plsc->boxbb_ymin =
MIN( plsc->boxbb_ymin,
1735 pos_mm - 0.6 * char_height_mm );
1736 plsc->boxbb_ymax =
MAX( plsc->boxbb_ymax,
1737 pos_mm + 0.7 * char_height_mm );
1741 plmtex(
"rv", height, pos, 0.0,
string );
1747 height = liy ? 1.75 : 1.5;
1748 if ( plsc->if_boxbb )
1757 height_mm = ( height + 0.8 ) * char_height_mm;
1758 plsc->boxbb_xmax =
MAX( plsc->boxbb_xmax, plsc->vppxma /
1759 plsc->xpmm + height_mm );
1760 pos_mm = ( plsc->vppymi + pos *
1761 ( plsc->vppyma - plsc->vppymi ) ) /
1763 string_length_mm =
plstrl(
string );
1764 plsc->boxbb_ymin =
MIN( plsc->boxbb_ymin,
1765 pos_mm - 0.5 * string_length_mm );
1766 plsc->boxbb_ymax =
MAX( plsc->boxbb_ymax,
1767 pos_mm + 0.5 * string_length_mm );
1771 plmtex(
"r", height, pos, 0.5,
string );
1775 ydigits =
MAX( ydigits, (
PLINT) strlen(
string ) );
1780 plsyax( ydigmax, ydigits );
1784 if ( !lly && !ldy && !loy && ymode )
1786 snprintf(
string,
STRING_LEN,
"(x10%su%d%sd)", esc_string, (
int) yscale, esc_string );
1787 if ( custom_exponent_placement )
1804 if ( !custom_exponent_placement )
1810 if ( plsc->if_boxbb )
1817 height_mm = ( height + 1.4 ) * char_height_mm;
1818 plsc->boxbb_ymax =
MAX( plsc->boxbb_ymax, plsc->vppyma /
1819 plsc->ypmm + height_mm );
1820 string_length_mm =
plstrl(
string );
1821 pos_mm = ( plsc->vppxmi + pos *
1822 ( plsc->vppxma - plsc->vppxmi ) ) /
1824 plsc->boxbb_xmin =
MIN( plsc->boxbb_xmin,
1825 pos_mm - string_length_mm );
1831 plmtex(
"lv", height, pos, just,
string );
1835 plmtex(
"l", height, pos, just,
string );
1842 if ( !custom_exponent_placement )
1848 if ( plsc->if_boxbb )
1855 height_mm = ( height + 1.4 ) * char_height_mm;
1856 plsc->boxbb_ymax =
MAX( plsc->boxbb_ymax, plsc->vppyma /
1857 plsc->ypmm + height_mm );
1858 string_length_mm =
plstrl(
string );
1859 pos_mm = ( plsc->vppxmi + pos *
1860 ( plsc->vppxma - plsc->vppxmi ) ) /
1862 plsc->boxbb_xmax =
MAX( plsc->boxbb_xmin,
1863 pos_mm + string_length_mm );
1869 plmtex(
"rv", height, pos, just,
string );
1873 plmtex(
"r", height, pos, just,
string );
1891 PLBOOL ldx, lfx, lix, llx, lmx, lnx, ltx, lox, lxx;
1892 PLBOOL ldy, lfy, liy, lly, lmy, lny, lty, lvy, loy, lxy;
1893 PLFLT vpwxmi, vpwxma, vpwymi, vpwyma;
1894 PLFLT vpwxmin, vpwxmax, vpwymin, vpwymax;
1896 const char *timefmt;
1898 PLINT xdigmax, xdigits, xdigmax_old, xdigits_old;
1899 PLINT ydigmax, ydigits, ydigmax_old, ydigits_old;
1900 PLINT lxmin, lxmax, lymin, lymax;
1901 PLINT pxmin, pxmax, pymin, pymax;
1902 PLFLT default_mm, char_height_mm, height_mm;
1903 PLFLT string_length_mm = 0.0, pos_mm = 0.0;
1907 PLBOOL custom_exponent_placement = !plsc->label_func && plsc->label_data;
1913 PLFLT pos = 0.0, height = 0.0, just = 0.0;
1916 plgchr( &default_mm, &char_height_mm );
1919 plgxax( &xdigmax, &xdigits );
1920 plgyax( &ydigmax, &ydigits );
1921 xdigmax_old = xdigmax;
1922 xdigits_old = xdigits;
1923 ydigmax_old = ydigmax;
1924 ydigits_old = ydigits;
1928 plP_gclp( &lxmin, &lxmax, &lymin, &lymax );
1929 plP_gphy( &pxmin, &pxmax, &pymin, &pymax );
1930 plP_sclp( pxmin, pxmax, pymin, pymax );
1955 plP_xgvpw( &vpwxmin, &vpwxmax, &vpwymin, &vpwymax );
1958 vpwxmi = ( vpwxmax > vpwxmin ) ? vpwxmin : vpwxmax;
1959 vpwxma = ( vpwxmax > vpwxmin ) ? vpwxmax : vpwxmin;
1960 vpwymi = ( vpwymax > vpwymin ) ? vpwymin : vpwymax;
1961 vpwyma = ( vpwymax > vpwymin ) ? vpwymax : vpwymin;
1963 if ( plsc->if_boxbb )
1969 plsc->boxbb_xmin = plsc->vppxmi / plsc->xpmm;
1970 plsc->boxbb_xmax = plsc->vppxma / plsc->xpmm;
1971 plsc->boxbb_ymin = plsc->vppymi / plsc->ypmm;
1972 plsc->boxbb_ymax = plsc->vppyma / plsc->ypmm;
1977 if ( lix && ( lmx || lnx ) && ( ltx && !lxx ) )
1979 plsc->boxbb_ymin -= xmajor / plsc->ypmm;
1980 plsc->boxbb_ymax += xmajor / plsc->ypmm;
1982 if ( liy && ( lmy || lny ) && ( lty && !lxy ) )
1984 plsc->boxbb_xmin -= ymajor / plsc->xpmm;
1985 plsc->boxbb_xmax += ymajor / plsc->xpmm;
1990 if ( ( lmx || lnx ) && ( ltx || lxx ) )
1993 PLFLT x_spacing, x_spacing_tmp;
1997 x_spacing = vpwxma - vpwxmi;
2001 for ( i = 1; i < n_xticks; i++ )
2003 x_spacing_tmp = fabs( xticks[i] - xticks[i - 1] );
2004 x_spacing =
MIN( x_spacing, x_spacing_tmp );
2008 plgxax( &xdigmax, &xdigits );
2009 pldprec( vpwxmi, vpwxma, x_spacing, lfx, &xmode, &xprec, xdigmax, &xscale );
2012 height = lix ? 1.75 : 1.5;
2013 if ( plsc->if_boxbb )
2020 height_mm = ( height + 0.7 ) * char_height_mm;
2022 plsc->boxbb_ymin =
MIN( plsc->boxbb_ymin, plsc->vppymi /
2023 plsc->ypmm - height_mm );
2025 plsc->boxbb_ymax =
MAX( plsc->boxbb_ymax, plsc->vppyma /
2026 plsc->ypmm + height_mm );
2029 for ( i = 0; i < n_xticks; i++ )
2032 if (
BETW( tn, vpwxmi, vpwxma ) )
2034 if ( !lxx && !plsc->if_boxbb )
2047 pos = ( vpwxmax > vpwxmin ) ?
2048 ( tn - vpwxmi ) / ( vpwxma - vpwxmi ) :
2049 ( vpwxma - tn ) / ( vpwxma - vpwxmi );
2050 if ( plsc->if_boxbb )
2052 string_length_mm =
plstrl(
string );
2053 pos_mm = ( plsc->vppxmi + pos *
2054 ( plsc->vppxma - plsc->vppxmi ) ) /
2060 if ( plsc->if_boxbb )
2062 plsc->boxbb_xmin =
MIN( plsc->boxbb_xmin,
2063 pos_mm - 0.5 * string_length_mm );
2064 plsc->boxbb_xmax =
MAX( plsc->boxbb_xmax,
2065 pos_mm + 0.5 * string_length_mm );
2069 plmtex(
"b", height, pos, 0.5,
string );
2075 if ( plsc->if_boxbb )
2077 plsc->boxbb_xmin =
MIN( plsc->boxbb_xmin,
2078 pos_mm - 0.5 * string_length_mm );
2079 plsc->boxbb_xmax =
MAX( plsc->boxbb_xmax,
2080 pos_mm + 0.5 * string_length_mm );
2084 plmtex(
"t", height, pos, 0.5,
string );
2090 plsxax( xdigmax, xdigits );
2094 if ( !llx && !ldx && !lox && xmode )
2096 if ( custom_exponent_placement )
2108 snprintf(
string,
STRING_LEN,
"(x10%su%d%sd)", esc_string, (
int) xscale, esc_string );
2112 if ( plsc->if_boxbb )
2119 height_mm = ( height + 0.9 ) * char_height_mm;
2120 plsc->boxbb_ymin =
MIN( plsc->boxbb_ymin, plsc->vppymi /
2121 plsc->ypmm - height_mm );
2122 string_length_mm =
plstrl(
string );
2123 pos_mm = ( plsc->vppxmi + pos *
2124 ( plsc->vppxma - plsc->vppxmi ) ) /
2126 plsc->boxbb_xmin =
MIN( plsc->boxbb_xmin,
2127 pos_mm - 0.5 * string_length_mm );
2128 plsc->boxbb_xmax =
MAX( plsc->boxbb_xmax,
2129 pos_mm + 0.5 * string_length_mm );
2133 plmtex(
"b", height, pos, just,
string );
2139 if ( plsc->if_boxbb )
2146 height_mm = ( height + 1.4 ) * char_height_mm;
2147 plsc->boxbb_ymax =
MAX( plsc->boxbb_ymax, plsc->vppyma /
2148 plsc->ypmm + height_mm );
2149 string_length_mm =
plstrl(
string );
2150 pos_mm = ( plsc->vppxmi + pos *
2151 ( plsc->vppxma - plsc->vppxmi ) ) /
2153 plsc->boxbb_xmin =
MIN( plsc->boxbb_xmin,
2154 pos_mm - 0.5 * string_length_mm );
2155 plsc->boxbb_xmax =
MAX( plsc->boxbb_xmax,
2156 pos_mm + 0.5 * string_length_mm );
2160 plmtex(
"t", height, pos, just,
string );
2167 if ( ( lmy || lny ) && ( lty || lxy ) )
2170 PLFLT y_spacing, y_spacing_tmp;
2174 y_spacing = vpwyma - vpwymi;
2178 for ( i = 1; i < n_yticks; i++ )
2180 y_spacing_tmp = fabs( yticks[i] - yticks[i - 1] );
2181 y_spacing =
MIN( y_spacing, y_spacing_tmp );
2185 plgyax( &ydigmax, &ydigits );
2186 pldprec( vpwymi, vpwyma, y_spacing, lfy, &ymode, &yprec, ydigmax, &yscale );
2190 for ( i = 0; i < n_yticks; i++ )
2193 if (
BETW( tn, vpwymi, vpwyma ) )
2195 if ( !lxy && !plsc->if_boxbb )
2208 pos = ( vpwymax > vpwymin ) ?
2209 ( tn - vpwymi ) / ( vpwyma - vpwymi ) :
2210 ( vpwyma - tn ) / ( vpwyma - vpwymi );
2216 height = liy ? 1.0 : 0.5;
2217 if ( plsc->if_boxbb )
2225 height_mm = ( height + 0.0 ) * char_height_mm;
2226 string_length_mm =
plstrl(
string );
2227 plsc->boxbb_xmin =
MIN( plsc->boxbb_xmin, plsc->vppxmi /
2228 plsc->xpmm - height_mm - string_length_mm );
2229 pos_mm = ( plsc->vppymi + pos *
2230 ( plsc->vppyma - plsc->vppymi ) ) /
2234 plsc->boxbb_ymin =
MIN( plsc->boxbb_ymin,
2235 pos_mm - 0.6 * char_height_mm );
2236 plsc->boxbb_ymax =
MAX( plsc->boxbb_ymax,
2237 pos_mm + 0.7 * char_height_mm );
2241 plmtex(
"lv", height, pos, 1.0,
string );
2247 height = liy ? 1.75 : 1.5;
2248 if ( plsc->if_boxbb )
2257 height_mm = ( height + 0.8 ) * char_height_mm;
2258 plsc->boxbb_xmin =
MIN( plsc->boxbb_xmin, plsc->vppxmi /
2259 plsc->xpmm - height_mm );
2260 pos_mm = ( plsc->vppymi + pos *
2261 ( plsc->vppyma - plsc->vppymi ) ) /
2263 string_length_mm =
plstrl(
string );
2264 plsc->boxbb_ymin =
MIN( plsc->boxbb_ymin,
2265 pos_mm - 0.5 * string_length_mm );
2266 plsc->boxbb_ymax =
MAX( plsc->boxbb_ymax,
2267 pos_mm + 0.5 * string_length_mm );
2271 plmtex(
"l", height, pos, 0.5,
string );
2280 height = liy ? 1.0 : 0.5;
2281 if ( plsc->if_boxbb )
2289 height_mm = ( height + 0.0 ) * char_height_mm;
2290 string_length_mm =
plstrl(
string );
2291 plsc->boxbb_xmax =
MAX( plsc->boxbb_xmax, plsc->vppxma /
2292 plsc->xpmm + height_mm + string_length_mm );
2293 pos_mm = ( plsc->vppymi + pos *
2294 ( plsc->vppyma - plsc->vppymi ) ) /
2298 plsc->boxbb_ymin =
MIN( plsc->boxbb_ymin,
2299 pos_mm - 0.6 * char_height_mm );
2300 plsc->boxbb_ymax =
MAX( plsc->boxbb_ymax,
2301 pos_mm + 0.7 * char_height_mm );
2305 plmtex(
"rv", height, pos, 0.0,
string );
2311 height = liy ? 1.75 : 1.5;
2312 if ( plsc->if_boxbb )
2321 height_mm = ( height + 0.8 ) * char_height_mm;
2322 plsc->boxbb_xmax =
MAX( plsc->boxbb_xmax, plsc->vppxma /
2323 plsc->xpmm + height_mm );
2324 pos_mm = ( plsc->vppymi + pos *
2325 ( plsc->vppyma - plsc->vppymi ) ) /
2327 string_length_mm =
plstrl(
string );
2328 plsc->boxbb_ymin =
MIN( plsc->boxbb_ymin,
2329 pos_mm - 0.5 * string_length_mm );
2330 plsc->boxbb_ymax =
MAX( plsc->boxbb_ymax,
2331 pos_mm + 0.5 * string_length_mm );
2335 plmtex(
"r", height, pos, 0.5,
string );
2339 ydigits =
MAX( ydigits, (
PLINT) strlen(
string ) );
2345 plsyax( ydigmax, ydigits );
2349 if ( !lly && !ldy && !loy && ymode )
2351 snprintf(
string,
STRING_LEN,
"(x10%su%d%sd)", esc_string, (
int) yscale, esc_string );
2352 if ( custom_exponent_placement )
2369 if ( !custom_exponent_placement )
2375 if ( plsc->if_boxbb )
2382 height_mm = ( height + 1.4 ) * char_height_mm;
2383 plsc->boxbb_ymax =
MAX( plsc->boxbb_ymax, plsc->vppyma /
2384 plsc->ypmm + height_mm );
2385 string_length_mm =
plstrl(
string );
2386 pos_mm = ( plsc->vppxmi + pos *
2387 ( plsc->vppxma - plsc->vppxmi ) ) /
2389 plsc->boxbb_xmin =
MIN( plsc->boxbb_xmin,
2390 pos_mm - string_length_mm );
2396 plmtex(
"lv", height, pos, just,
string );
2400 plmtex(
"l", height, pos, just,
string );
2407 if ( !custom_exponent_placement )
2413 if ( plsc->if_boxbb )
2420 height_mm = ( height + 1.4 ) * char_height_mm;
2421 plsc->boxbb_ymax =
MAX( plsc->boxbb_ymax, plsc->vppyma /
2422 plsc->ypmm + height_mm );
2423 string_length_mm =
plstrl(
string );
2424 pos_mm = ( plsc->vppxmi + pos *
2425 ( plsc->vppxma - plsc->vppxmi ) ) /
2427 plsc->boxbb_xmax =
MAX( plsc->boxbb_xmin,
2428 pos_mm + string_length_mm );
2434 plmtex(
"rv", height, pos, just,
string );
2438 plmtex(
"r", height, pos, just,
string );
2446 plsxax( xdigmax_old, xdigits_old );
2447 plsyax( ydigmax_old, ydigits_old );
2450 plP_sclp( lxmin, lxmax, lymin, lymax );
2468 snprintf(
string, (
size_t) len,
"10%su%d", esc_string, (
int)
ROUND( value ) );
2475 int exponent =
ROUND( value );
2477 value = pow( 10.0, exponent );
2482 snprintf(
string, (
size_t) len, form, value );
2486 snprintf(
string, (
size_t) len,
"%d", (
int) value );
2493 PLINT setpre, precis;
2497 scale = ( (
PLINT *) data )[0];
2498 prec = ( (
PLINT *) data )[1];
2506 value /= pow( 10., (
double) scale );
2510 scale2 = pow( 10., prec );
2511 value = floor( ( value * scale2 ) + .5 ) / scale2;
2515 strncpy(
string, temp, (
size_t) ( len - 1 ) );
2516 string[len - 1] =
'\0';
2550 if ( lo && plsc->label_func )
2552 ( *plsc->label_func )( axis, value,
string, len, plsc->label_data );
2558 plwarn(
"Custom axis labels requested without a labeling function \
2559 - using default." );
2579 PLINT scale_prec[2] = { scale, prec };
2611 plsc->label_data = label_data;
2617 static const char *esc_strings = {
"!\0#\0$\0%\0&\0*\0@\0^\0~\0" };
2621 if ( plsc->esc ==
'\0' )
2624 switch ( plsc->esc )
2654 plwarn(
"plgesc_string: Invalid escape character, assuming '#' instead" );
2658 return &( esc_strings[d * 2] );