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 );
91 c_plaxes( 0.0, 0.0, xopt, xtick, nxsub, yopt, ytick, nysub );
138 PLBOOL lax, lbx, lcx, ldx, lgx, lix, llx, lsx, ltx, lux, lwx, lxx;
139 PLBOOL lay, lby, lcy, ldy, lgy, liy, lly, lsy, lty, luy, lwy, lxy;
140 PLINT xmajor, xminor, ymajor, yminor;
141 PLINT i, i1x, i2x, i3x, i4x, i1y, i2y, i3y, i4y;
142 PLINT nxsub1, nysub1;
143 PLINT lxmin, lxmax, lymin, lymax;
144 PLINT pxmin, pxmax, pymin, pymax;
145 PLINT vppxmi, vppxma, vppymi, vppyma;
146 PLFLT xtick1, ytick1, vpwxmi, vpwxma, vpwymi, vpwyma;
147 PLFLT vpwxmin, vpwxmax, vpwymin, vpwymax;
148 PLFLT xp0, yp0, tn, tp, temp;
149 PLFLT factor, tstart;
151 if ( plsc->level < 3 )
153 plabort(
"plbox: Please set up window first" );
159 plP_gclp( &lxmin, &lxmax, &lymin, &lymax );
160 plP_gphy( &pxmin, &pxmax, &pymin, &pymax );
161 plP_sclp( pxmin, pxmax, pymin, pymax );
163 vppxmi = plsc->vppxmi;
164 vppxma = plsc->vppxma;
165 vppymi = plsc->vppymi;
166 vppyma = plsc->vppyma;
168 if ( plsc->if_boxbb )
172 plsc->boxbb_xmin = plsc->vppxmi / plsc->xpmm;
173 plsc->boxbb_xmax = plsc->vppxma / plsc->xpmm;
174 plsc->boxbb_ymin = plsc->vppymi / plsc->ypmm;
175 plsc->boxbb_ymax = plsc->vppyma / plsc->ypmm;
213 xmajor =
MAX(
ROUND( plsc->majht * plsc->ypmm ), 1 );
214 ymajor =
MAX(
ROUND( plsc->majht * plsc->xpmm ), 1 );
215 xminor =
MAX(
ROUND( plsc->minht * plsc->ypmm ), 1 );
216 yminor =
MAX(
ROUND( plsc->minht * plsc->xpmm ), 1 );
220 xtick1 = llx ? 1.0 : xtick;
221 ytick1 = lly ? 1.0 : ytick;
223 plP_xgvpw( &vpwxmin, &vpwxmax, &vpwymin, &vpwymax );
226 vpwxmi = ( vpwxmax > vpwxmin ) ? vpwxmin : vpwxmax;
227 vpwxma = ( vpwxmax > vpwxmin ) ? vpwxmax : vpwxmin;
228 vpwymi = ( vpwymax > vpwymin ) ? vpwymin : vpwymax;
229 vpwyma = ( vpwymax > vpwymin ) ? vpwymax : vpwymin;
232 lax = lax && vpwymi < y0 && y0 < vpwyma;
233 lay = lay && vpwxmi < x0 && x0 < vpwxma;
237 if ( ltx || lgx || lxx )
238 pldtik( vpwxmi, vpwxma, &xtick1, &nxsub1, ldx );
240 if ( lty || lgy || lxy )
241 pldtik( vpwymi, vpwyma, &ytick1, &nysub1, ldy );
276 if ( plsc->if_boxbb )
283 if ( lix && ( lbx || lux ) && ( ltx && !lxx ) )
284 plsc->boxbb_ymin -= xmajor / plsc->ypmm;
285 if ( liy && ( lcy || lwy ) && ( lty && !lxy ) )
286 plsc->boxbb_xmax += ymajor / plsc->xpmm;
287 if ( lix && ( lcx || lwx ) && ( ltx && !lxx ) )
288 plsc->boxbb_ymax += xmajor / plsc->ypmm;
289 if ( liy && ( lby || luy ) && ( lty && !lxy ) )
290 plsc->boxbb_xmin -= ymajor / plsc->xpmm;
307 pldtfac( vpwxmi, vpwxma, &factor, &tstart );
308 tp = xtick1 * ( floor( ( vpwxmi - tstart ) / xtick1 ) ) + tstart;
311 tp = xtick1 * floor( vpwxmi / xtick1 );
319 for ( i = 0; i <= 7; i++ )
322 if (
BETW( temp, vpwxmi, vpwxma ) )
328 for ( i = 1; i <= nxsub1 - 1; i++ )
330 temp = tp + i * xtick1 / nxsub1;
331 if (
BETW( temp, vpwxmi, vpwxma ) )
336 if ( !
BETW( tn, vpwxmi, vpwxma ) )
357 pldtfac( vpwymi, vpwyma, &factor, &tstart );
358 tp = ytick1 * ( floor( ( vpwymi - tstart ) / ytick1 ) ) + tstart;
361 tp = ytick1 * floor( vpwymi / ytick1 );
369 for ( i = 0; i <= 7; i++ )
372 if (
BETW( temp, vpwymi, vpwyma ) )
378 for ( i = 1; i <= nysub1 - 1; i++ )
380 temp = tp + i * ytick1 / nysub1;
381 if (
BETW( temp, vpwymi, vpwyma ) )
386 if ( !
BETW( tn, vpwymi, vpwyma ) )
407 pldtfac( vpwxmi, vpwxma, &factor, &tstart );
408 tp = xtick1 * ( floor( ( vpwxma - tstart ) / xtick1 ) + 1 ) + tstart;
411 tp = xtick1 * ( floor( vpwxma / xtick1 ) + 1 );
419 for ( i = 7; i >= 0; i-- )
422 if (
BETW( temp, vpwxmi, vpwxma ) )
428 for ( i = nxsub1 - 1; i >= 1; i-- )
430 temp = tn + i * xtick1 / nxsub1;
431 if (
BETW( temp, vpwxmi, vpwxma ) )
436 if ( !
BETW( tn, vpwxmi, vpwxma ) )
457 pldtfac( vpwymi, vpwyma, &factor, &tstart );
458 tp = ytick1 * ( floor( ( vpwyma - tstart ) / ytick1 ) + 1 ) + tstart;
461 tp = ytick1 * ( floor( vpwyma / ytick1 ) + 1 );
469 for ( i = 7; i >= 0; i-- )
472 if (
BETW( temp, vpwymi, vpwyma ) )
478 for ( i = nysub1 - 1; i >= 1; i-- )
480 temp = tn + i * ytick1 / nysub1;
481 if (
BETW( temp, vpwymi, vpwyma ) )
486 if ( !
BETW( tn, vpwymi, vpwyma ) )
501 tp = xtick1 * floor( vpwxmi / xtick1 );
509 for ( i = 0; i <= 7; i++ )
512 if (
BETW( temp, vpwxmi, vpwxma ) )
518 for ( i = 1; i <= nxsub1 - 1; i++ )
520 temp = tp + i * xtick1 / nxsub1;
521 if (
BETW( temp, vpwxmi, vpwxma ) )
526 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 nsuby,
595 const char *zopt,
const char *zlabel,
PLFLT ztick,
PLINT nsubz )
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, nsubx, 0, &xdigits );
650 plzbx( zopt, zlabel, 1, dx, dy, ux, uy,
651 plP_w3wcy( xmax, ymin, zmax ), zmin, zmax, ztick, nsubz, &zdigits );
658 ymax, ymin, ytick, nsuby, ln, &ydigits );
664 plzbx( zopt, zlabel, 0, dx, dy, tx, ty,
665 plP_w3wcy( xmin, ymax, zmax ), zmin, zmax, ztick, nsubz, &zdigits );
667 else if ( cxx <= 0.0 && cxy <= 0.0 )
675 ymax, ymin, ytick, nsuby, 0, &ydigits );
679 plzbx( zopt, zlabel, 1, dx, dy, ux, uy,
680 plP_w3wcy( xmin, ymin, zmax ), zmin, zmax, ztick, nsubz, &zdigits );
687 xmax, xmin, xtick, nsubx, ln, &xdigits );
693 plzbx( zopt, zlabel, 0, dx, dy, tx, ty,
694 plP_w3wcy( xmax, ymax, zmax ), zmin, zmax, ztick, nsubz, &zdigits );
696 else if ( cxx <= 0.0 && cxy >= 0.0 )
704 xmax, xmin, xtick, nsubx, 0, &xdigits );
708 plzbx( zopt, zlabel, 1, dx, dy, ux, uy,
709 plP_w3wcy( xmin, ymax, zmax ), zmin, zmax, ztick, nsubz, &zdigits );
716 ymin, ymax, ytick, nsuby, ln, &ydigits );
722 plzbx( zopt, zlabel, 0, dx, dy, tx, ty,
723 plP_w3wcy( xmax, ymin, zmax ), zmin, zmax, ztick, nsubz, &zdigits );
725 else if ( cxx >= 0.0 && cxy >= 0.0 )
733 ymin, ymax, ytick, nsuby, 0, &ydigits );
737 plzbx( zopt, zlabel, 1, dx, dy, ux, uy,
738 plP_w3wcy( xmax, ymax, zmax ), zmin, zmax, ztick, nsubz, &zdigits );
745 xmin, xmax, xtick, nsubx, ln, &xdigits );
751 plzbx( zopt, zlabel, 0, dx, dy, tx, ty,
752 plP_w3wcy( xmin, ymin, zmax ), zmin, zmax, ztick, nsubz, &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;
798 vmin = ( vmax_in > vmin_in ) ? vmin_in : vmax_in;
799 vmax = ( vmax_in > vmin_in ) ? vmax_in : vmin_in;
806 major =
MAX(
ROUND( plsc->majht * plsc->ypmm ), 1 );
807 minor =
MAX(
ROUND( plsc->minht * plsc->ypmm ), 1 );
824 plxytx( wx1, wy1, wx2, wy2, 3.2, 0.5, 0.5, label );
829 tick1 = ( vmax > vmin ) ? 1.0 : -1.0;
831 pldtik( vmin, vmax, &tick1, &nsub1, ld );
854 tp = tick1 * floor( vmin / tick1 );
862 for ( i = 0; i <= 7; i++ )
865 if (
BETW( temp, vmin, vmax ) )
867 lambda = ( vmax_in > vmin_in ) ?
868 ( temp - vmin ) / ( vmax - vmin ) :
869 ( vmax - temp ) / ( vmax - vmin );
878 for ( i = 1; i <= nsub1 - 1; i++ )
880 temp = tp + i * ( tn - tp ) / nsub1;
881 if (
BETW( temp, vmin, vmax ) )
883 lambda = ( vmax_in > vmin_in ) ?
884 ( temp - vmin ) / ( vmax - vmin ) :
885 ( vmax - temp ) / ( vmax - vmin );
894 if ( !
BETW( temp, vmin, vmax ) )
897 lambda = ( vmax_in > vmin_in ) ?
898 ( temp - vmin ) / ( vmax - vmin ) :
899 ( vmax - temp ) / ( vmax - vmin );
911 pldprec( vmin, vmax, tick1, lf, &mode, &prec, *digits, &scale );
914 tcrit = tspace * tick1;
915 tp = tick1 * ( 1. + floor( vmin / tick1 ) );
916 for ( tn = tp;
BETW( tn, vmin, vmax ); tn += tick1 )
918 if (
BETW( tn, vmin + tcrit, vmax - tcrit ) )
921 pos = ( vmax_in > vmin_in ) ?
922 ( tn - vmin ) / ( vmax - vmin ) :
923 ( vmax - tn ) / ( vmax - vmin );
924 plxytx( wx1, wy1, wx2, wy2, 1.5, pos, 0.5,
string );
928 if ( !ll && !lo && mode )
931 plxytx( wx1, wy1, wx2, wy2, height, 1.0, 0.5,
string );
948 PLFLT shift, cc, ss, wx, wy;
949 PLFLT xdv, ydv, xmm, ymm, refxmm, refymm,
xform[4], diag;
953 cc = plsc->wmxscl * ( wx2 - wx1 );
954 ss = plsc->wmyscl * ( wy2 - wy1 );
955 diag = sqrt( cc * cc + ss * ss );
958 wx = wx1 + pos * ( wx2 - wx1 );
959 wy = wy1 + pos * ( wy2 - wy1 );
972 plgchr( &chrdef, &chrht );
973 shift = ( just == 0.0 ) ? 0.0 :
plstrl( text ) * just;
977 refxmm = xmm - shift * xform[0];
978 refymm = ymm - shift * xform[2];
985 plP_text( 0, just, xform, x, y, refx, refy, text );
1017 PLINT lb, lc, ld, lf, li, ll, lm, ln, ls, lt, lu, lv, lo;
1018 PLINT i, mode, prec, scale;
1019 PLINT nsub1, lstring;
1020 PLFLT pos, tn, tp, temp, height, tick1;
1021 PLFLT dwy, lambda, diag, major, minor, xmajor, xminor;
1022 PLFLT ymajor, yminor, dxm, dym, vmin, vmax;
1024 vmin = ( vmax_in > vmin_in ) ? vmin_in : vmax_in;
1025 vmax = ( vmax_in > vmin_in ) ? vmax_in : vmin_in;
1031 major = plsc->majht;
1032 minor = plsc->minht;
1052 plztx(
"h", dx, dy, wx, wy1, wy2, 5.0, 0.5, 0.5, label );
1055 plztx(
"h", dx, dy, wx, wy1, wy2, -5.0, 0.5, 0.5, label );
1060 if ( !right && !lb )
1067 pldtik( vmin, vmax, &tick1, &nsub1, ld );
1069 if ( ( li && !right ) || ( !li && right ) )
1075 dxm = dx * plsc->wmxscl;
1076 dym = dy * plsc->wmyscl;
1077 diag = sqrt( dxm * dxm + dym * dym );
1079 xminor = minor * dxm / diag;
1080 xmajor = major * dxm / diag;
1081 yminor = minor * dym / diag;
1082 ymajor = major * dym / diag;
1090 tp = tick1 * floor( vmin / tick1 );
1098 for ( i = 0; i <= 7; i++ )
1100 temp = tp +
xlog[i];
1101 if (
BETW( temp, vmin, vmax ) )
1103 lambda = ( vmax_in > vmin_in ) ?
1104 ( temp - vmin ) / ( vmax - vmin ) :
1105 ( vmax - temp ) / ( vmax - vmin );
1114 for ( i = 1; i <= nsub1 - 1; i++ )
1116 temp = tp + i * tick1 / nsub1;
1117 if (
BETW( temp, vmin, vmax ) )
1119 lambda = ( vmax_in > vmin_in ) ?
1120 ( temp - vmin ) / ( vmax - vmin ) :
1121 ( vmax - temp ) / ( vmax - vmin );
1130 if ( !
BETW( temp, vmin, vmax ) )
1132 lambda = ( vmax_in > vmin_in ) ?
1133 ( temp - vmin ) / ( vmax - vmin ) :
1134 ( vmax - temp ) / ( vmax - vmin );
1144 if ( ( ln || lm ) && lt )
1146 pldprec( vmin, vmax, tick1, lf, &mode, &prec, *digits, &scale );
1148 tp = tick1 * floor( vmin / tick1 );
1149 for ( tn = tp + tick1;
BETW( tn, vmin, vmax ); tn += tick1 )
1152 pos = ( vmax_in > vmin_in ) ?
1153 ( tn - vmin ) / ( vmax - vmin ) :
1154 ( vmax - tn ) / ( vmax - vmin );
1156 plztx(
"v", dx, dy, wx, wy1, wy2, 0.5, pos, 1.0,
string );
1159 plztx(
"v", dx, dy, wx, wy1, wy2, -0.5, pos, 0.0,
string );
1161 lstring = (
PLINT) strlen(
string );
1162 *digits =
MAX( *digits, lstring );
1164 if ( !ll && !lo && mode )
1171 plztx(
"v", dx, dy, wx, wy1, wy2, height, pos, 0.5,
string );
1175 plztx(
"v", dx, dy, wx, wy1, wy2,
1176 (
PLFLT) -height, pos, 0.5,
string );
1193 PLINT refx = 0, refy = 0,
x = 0,
y = 0, vert = 0;
1194 PLFLT shift, cc, ss, wy;
1195 PLFLT xdv, ydv, xmm, ymm, refxmm, refymm,
xform[4], diag;
1197 PLFLT chrdef, chrht;
1199 cc = plsc->wmxscl *
dx;
1200 ss = plsc->wmyscl *
dy;
1201 diag = sqrt( cc * cc + ss * ss );
1204 wy = wy1 + pos * ( wy2 - wy1 );
1232 plgchr( &chrdef, &chrht );
1233 shift = ( just == 0.0 ) ? 0.0 :
plstrl( text ) * just;
1237 refxmm = xmm - shift * xform[0];
1238 refymm = ymm - shift * xform[2];
1245 plP_text( 0, just, xform,
x,
y, refx, refy, text );
1260 const char *yopt,
PLFLT ytick1,
PLINT nysub1 )
1262 PLINT lgx, lhx, llx, ldx;
1263 PLINT lgy, lhy, lly, ldy;
1264 PLFLT vpwxmi, vpwxma, vpwymi, vpwyma;
1265 PLFLT vpwxmin, vpwxmax, vpwymin, vpwymax;
1266 PLFLT tn, temp, tcrit, tspace = 0.1;
1267 PLFLT tstart, factor;
1282 plP_xgvpw( &vpwxmin, &vpwxmax, &vpwymin, &vpwymax );
1285 vpwxmi = ( vpwxmax > vpwxmin ) ? vpwxmin : vpwxmax;
1286 vpwxma = ( vpwxmax > vpwxmin ) ? vpwxmax : vpwxmin;
1287 vpwymi = ( vpwymax > vpwymin ) ? vpwymin : vpwymax;
1288 vpwyma = ( vpwymax > vpwymin ) ? vpwymax : vpwymin;
1296 pldtfac( vpwxmi, vpwxma, &factor, &tstart );
1297 tn = xtick1 * ( floor( ( vpwxmi - tstart ) / xtick1 ) ) + tstart;
1301 tn = xtick1 * floor( vpwxmi / xtick1 );
1303 for (; tn <= vpwxma; tn += xtick1 )
1310 for ( i = 0; i <= 7; i++ )
1312 temp = tn +
xlog[i];
1313 tcrit = ( temp - otemp ) * tspace;
1315 if (
BETW( temp, vpwxmi + tcrit, vpwxma - tcrit ) )
1316 pljoin( temp, vpwymi, temp, vpwyma );
1321 for ( i = 1; i <= nxsub1 - 1; i++ )
1323 temp = tn + i * xtick1 / nxsub1;
1324 tcrit = xtick1 / nxsub1 * tspace;
1325 if (
BETW( temp, vpwxmi + tcrit, vpwxma - tcrit ) )
1326 pljoin( temp, vpwymi, temp, vpwyma );
1330 tcrit = xtick1 * tspace;
1331 if (
BETW( tn, vpwxmi + tcrit, vpwxma - tcrit ) )
1332 pljoin( tn, vpwymi, tn, vpwyma );
1342 pldtfac( vpwymi, vpwyma, &factor, &tstart );
1343 tn = ytick1 * ( floor( ( vpwymi - tstart ) / ytick1 ) ) + tstart;
1347 tn = ytick1 * floor( vpwymi / ytick1 );
1349 for (; tn <= vpwyma; tn += ytick1 )
1356 for ( i = 0; i <= 7; i++ )
1358 temp = tn +
xlog[i];
1359 tcrit = ( temp - otemp ) * tspace;
1361 if (
BETW( temp, vpwymi + tcrit, vpwyma - tcrit ) )
1362 pljoin( vpwxmi, temp, vpwxma, temp );
1367 for ( i = 1; i <= nysub1 - 1; i++ )
1369 temp = tn + i * ytick1 / nysub1;
1370 tcrit = ytick1 / nysub1 * tspace;
1371 if (
BETW( temp, vpwymi + tcrit, vpwyma - tcrit ) )
1372 pljoin( vpwxmi, temp, vpwxma, temp );
1376 tcrit = ytick1 * tspace;
1377 if (
BETW( tn, vpwymi + tcrit, vpwyma - tcrit ) )
1378 pljoin( vpwxmi, tn, vpwxma, tn );
1393 PLBOOL ldx, lfx, lix, llx, lmx, lnx, ltx, lox, lxx;
1394 PLBOOL ldy, lfy, liy, lly, lmy, lny, lty, lvy, loy, lxy;
1395 PLFLT vpwxmi, vpwxma, vpwymi, vpwyma;
1396 PLFLT vpwxmin, vpwxmax, vpwymin, vpwymax;
1397 PLFLT pos, tn, tp, offset, height, just;
1398 PLFLT factor, tstart;
1399 const char *timefmt = NULL;
1400 PLFLT default_mm, char_height_mm, height_mm;
1401 PLFLT string_length_mm = 0.0, pos_mm = 0.0;
1403 plgchr( &default_mm, &char_height_mm );
1428 plP_xgvpw( &vpwxmin, &vpwxmax, &vpwymin, &vpwymax );
1431 vpwxmi = ( vpwxmax > vpwxmin ) ? vpwxmin : vpwxmax;
1432 vpwxma = ( vpwxmax > vpwxmin ) ? vpwxmax : vpwxmin;
1433 vpwymi = ( vpwymax > vpwymin ) ? vpwymin : vpwymax;
1434 vpwyma = ( vpwymax > vpwymin ) ? vpwymax : vpwymin;
1437 if ( ( lmx || lnx ) && ( ltx || lxx ) )
1441 plgxax( &xdigmax, &xdigits );
1442 pldprec( vpwxmi, vpwxma, xtick1, lfx, &xmode, &xprec, xdigmax, &xscale );
1447 pldtfac( vpwxmi, vpwxma, &factor, &tstart );
1448 tp = xtick1 * ( 1. + floor( ( vpwxmi - tstart ) / xtick1 ) ) + tstart;
1452 tp = xtick1 * ( 1. + floor( vpwxmi / xtick1 ) );
1454 height = lix ? 1.75 : 1.5;
1455 if ( plsc->if_boxbb )
1462 height_mm = ( height + 0.7 ) * char_height_mm;
1464 plsc->boxbb_ymin =
MIN( plsc->boxbb_ymin, plsc->vppymi /
1465 plsc->ypmm - height_mm );
1467 plsc->boxbb_ymax =
MAX( plsc->boxbb_ymax, plsc->vppyma /
1468 plsc->ypmm + height_mm );
1471 for ( tn = tp;
BETW( tn, vpwxmi, vpwxma ); tn += xtick1 )
1481 pos = ( vpwxmax > vpwxmin ) ?
1482 ( tn - vpwxmi ) / ( vpwxma - vpwxmi ) :
1483 ( vpwxma - tn ) / ( vpwxma - vpwxmi );
1484 if ( plsc->if_boxbb )
1486 string_length_mm =
plstrl(
string );
1487 pos_mm = ( plsc->vppxmi + pos *
1488 ( plsc->vppxma - plsc->vppxmi ) ) /
1494 if ( plsc->if_boxbb )
1496 plsc->boxbb_xmin =
MIN( plsc->boxbb_xmin,
1497 pos_mm - 0.5 * string_length_mm );
1498 plsc->boxbb_xmax =
MAX( plsc->boxbb_xmax,
1499 pos_mm + 0.5 * string_length_mm );
1503 plmtex(
"b", height, pos, 0.5,
string );
1509 if ( plsc->if_boxbb )
1511 plsc->boxbb_xmin =
MIN( plsc->boxbb_xmin,
1512 pos_mm - 0.5 * string_length_mm );
1513 plsc->boxbb_xmax =
MAX( plsc->boxbb_xmax,
1514 pos_mm + 0.5 * string_length_mm );
1518 plmtex(
"t", height, pos, 0.5,
string );
1523 plsxax( xdigmax, xdigits );
1527 if ( !llx && !ldx && !lox && xmode )
1531 if ( !plsc->label_func && plsc->label_data )
1547 if ( plsc->if_boxbb )
1554 height_mm = ( height + 0.9 ) * char_height_mm;
1555 plsc->boxbb_ymin =
MIN( plsc->boxbb_ymin, plsc->vppymi /
1556 plsc->ypmm - height_mm );
1557 string_length_mm =
plstrl(
string );
1558 pos_mm = ( plsc->vppxmi + pos *
1559 ( plsc->vppxma - plsc->vppxmi ) ) /
1561 plsc->boxbb_xmin =
MIN( plsc->boxbb_xmin,
1562 pos_mm - 0.5 * string_length_mm );
1563 plsc->boxbb_xmax =
MAX( plsc->boxbb_xmax,
1564 pos_mm + 0.5 * string_length_mm );
1568 plmtex(
"b", height, pos, just,
string );
1574 if ( plsc->if_boxbb )
1581 height_mm = ( height + 1.4 ) * char_height_mm;
1582 plsc->boxbb_ymax =
MAX( plsc->boxbb_ymax, plsc->vppyma /
1583 plsc->ypmm + height_mm );
1584 string_length_mm =
plstrl(
string );
1585 pos_mm = ( plsc->vppxmi + pos *
1586 ( plsc->vppxma - plsc->vppxmi ) ) /
1588 plsc->boxbb_xmin =
MIN( plsc->boxbb_xmin,
1589 pos_mm - 0.5 * string_length_mm );
1590 plsc->boxbb_xmax =
MAX( plsc->boxbb_xmax,
1591 pos_mm + 0.5 * string_length_mm );
1595 plmtex(
"t", height, pos, just,
string );
1603 if ( ( lmy || lny ) && ( lty || lxy ) )
1607 plgyax( &ydigmax, &ydigits );
1608 pldprec( vpwymi, vpwyma, ytick1, lfy, &ymode, &yprec, ydigmax, &yscale );
1613 pldtfac( vpwymi, vpwyma, &factor, &tstart );
1614 tp = ytick1 * ( 1. + floor( ( vpwymi - tstart ) / ytick1 ) ) + tstart;
1618 tp = ytick1 * ( 1. + floor( vpwymi / ytick1 ) );
1620 for ( tn = tp;
BETW( tn, vpwymi, vpwyma ); tn += ytick1 )
1630 pos = ( vpwymax > vpwymin ) ?
1631 ( tn - vpwymi ) / ( vpwyma - vpwymi ) :
1632 ( vpwyma - tn ) / ( vpwyma - vpwymi );
1638 height = liy ? 1.0 : 0.5;
1639 if ( plsc->if_boxbb )
1647 height_mm = ( height + 0.0 ) * char_height_mm;
1648 string_length_mm =
plstrl(
string );
1649 plsc->boxbb_xmin =
MIN( plsc->boxbb_xmin, plsc->vppxmi /
1650 plsc->xpmm - height_mm - string_length_mm );
1651 pos_mm = ( plsc->vppymi + pos *
1652 ( plsc->vppyma - plsc->vppymi ) ) /
1656 plsc->boxbb_ymin =
MIN( plsc->boxbb_ymin,
1657 pos_mm - 0.6 * char_height_mm );
1658 plsc->boxbb_ymax =
MAX( plsc->boxbb_ymax,
1659 pos_mm + 0.7 * char_height_mm );
1663 plmtex(
"lv", height, pos, 1.0,
string );
1669 height = liy ? 1.75 : 1.5;
1670 if ( plsc->if_boxbb )
1679 height_mm = ( height + 0.8 ) * char_height_mm;
1680 plsc->boxbb_xmin =
MIN( plsc->boxbb_xmin, plsc->vppxmi /
1681 plsc->xpmm - height_mm );
1682 pos_mm = ( plsc->vppymi + pos *
1683 ( plsc->vppyma - plsc->vppymi ) ) /
1685 string_length_mm =
plstrl(
string );
1686 plsc->boxbb_ymin =
MIN( plsc->boxbb_ymin,
1687 pos_mm - 0.5 * string_length_mm );
1688 plsc->boxbb_ymax =
MAX( plsc->boxbb_ymax,
1689 pos_mm + 0.5 * string_length_mm );
1693 plmtex(
"l", height, pos, 0.5,
string );
1702 height = liy ? 1.0 : 0.5;
1703 if ( plsc->if_boxbb )
1711 height_mm = ( height + 0.0 ) * char_height_mm;
1712 string_length_mm =
plstrl(
string );
1713 plsc->boxbb_xmax =
MAX( plsc->boxbb_xmax, plsc->vppxma /
1714 plsc->xpmm + height_mm + string_length_mm );
1715 pos_mm = ( plsc->vppymi + pos *
1716 ( plsc->vppyma - plsc->vppymi ) ) /
1720 plsc->boxbb_ymin =
MIN( plsc->boxbb_ymin,
1721 pos_mm - 0.6 * char_height_mm );
1722 plsc->boxbb_ymax =
MAX( plsc->boxbb_ymax,
1723 pos_mm + 0.7 * char_height_mm );
1727 plmtex(
"rv", height, pos, 0.0,
string );
1733 height = liy ? 1.75 : 1.5;
1734 if ( plsc->if_boxbb )
1743 height_mm = ( height + 0.8 ) * char_height_mm;
1744 plsc->boxbb_xmax =
MAX( plsc->boxbb_xmax, plsc->vppxma /
1745 plsc->xpmm + height_mm );
1746 pos_mm = ( plsc->vppymi + pos *
1747 ( plsc->vppyma - plsc->vppymi ) ) /
1749 string_length_mm =
plstrl(
string );
1750 plsc->boxbb_ymin =
MIN( plsc->boxbb_ymin,
1751 pos_mm - 0.5 * string_length_mm );
1752 plsc->boxbb_ymax =
MAX( plsc->boxbb_ymax,
1753 pos_mm + 0.5 * string_length_mm );
1757 plmtex(
"r", height, pos, 0.5,
string );
1761 ydigits =
MAX( ydigits, (
PLINT) strlen(
string ) );
1766 plsyax( ydigmax, ydigits );
1770 if ( !lly && !ldy && !loy && ymode )
1773 if ( !plsc->label_func && plsc->label_data )
1790 if ( !plsc->label_data )
1796 if ( plsc->if_boxbb )
1803 height_mm = ( height + 1.4 ) * char_height_mm;
1804 plsc->boxbb_ymax =
MAX( plsc->boxbb_ymax, plsc->vppyma /
1805 plsc->ypmm + height_mm );
1806 string_length_mm =
plstrl(
string );
1807 pos_mm = ( plsc->vppxmi + pos *
1808 ( plsc->vppxma - plsc->vppxmi ) ) /
1810 plsc->boxbb_xmin =
MIN( plsc->boxbb_xmin,
1811 pos_mm - string_length_mm );
1817 plmtex(
"lv", height, pos, just,
string );
1821 plmtex(
"l", height, pos, just,
string );
1828 if ( !plsc->label_data )
1834 if ( plsc->if_boxbb )
1841 height_mm = ( height + 1.4 ) * char_height_mm;
1842 plsc->boxbb_ymax =
MAX( plsc->boxbb_ymax, plsc->vppyma /
1843 plsc->ypmm + height_mm );
1844 string_length_mm =
plstrl(
string );
1845 pos_mm = ( plsc->vppxmi + pos *
1846 ( plsc->vppxma - plsc->vppxmi ) ) /
1848 plsc->boxbb_xmax =
MAX( plsc->boxbb_xmin,
1849 pos_mm + string_length_mm );
1855 plmtex(
"rv", height, pos, just,
string );
1859 plmtex(
"r", height, pos, just,
string );
1877 PLBOOL ldx, lfx, lix, llx, lmx, lnx, ltx, lox, lxx;
1878 PLBOOL ldy, lfy, liy, lly, lmy, lny, lty, lvy, loy, lxy;
1879 PLFLT vpwxmi, vpwxma, vpwymi, vpwyma;
1880 PLFLT vpwxmin, vpwxmax, vpwymin, vpwymax;
1881 PLFLT pos, tn, offset, height, just;
1882 const char *timefmt;
1884 PLINT xdigmax, xdigits, xdigmax_old, xdigits_old;
1885 PLINT ydigmax, ydigits, ydigmax_old, ydigits_old;
1886 PLINT lxmin, lxmax, lymin, lymax;
1887 PLINT pxmin, pxmax, pymin, pymax;
1888 PLFLT default_mm, char_height_mm, height_mm;
1889 PLFLT string_length_mm = 0.0, pos_mm = 0.0;
1891 plgchr( &default_mm, &char_height_mm );
1894 plgxax( &xdigmax, &xdigits );
1895 plgyax( &ydigmax, &ydigits );
1896 xdigmax_old = xdigmax;
1897 xdigits_old = xdigits;
1898 ydigmax_old = ydigmax;
1899 ydigits_old = ydigits;
1903 plP_gclp( &lxmin, &lxmax, &lymin, &lymax );
1904 plP_gphy( &pxmin, &pxmax, &pymin, &pymax );
1905 plP_sclp( pxmin, pxmax, pymin, pymax );
1930 plP_xgvpw( &vpwxmin, &vpwxmax, &vpwymin, &vpwymax );
1933 vpwxmi = ( vpwxmax > vpwxmin ) ? vpwxmin : vpwxmax;
1934 vpwxma = ( vpwxmax > vpwxmin ) ? vpwxmax : vpwxmin;
1935 vpwymi = ( vpwymax > vpwymin ) ? vpwymin : vpwymax;
1936 vpwyma = ( vpwymax > vpwymin ) ? vpwymax : vpwymin;
1938 if ( plsc->if_boxbb )
1944 plsc->boxbb_xmin = plsc->vppxmi / plsc->xpmm;
1945 plsc->boxbb_xmax = plsc->vppxma / plsc->xpmm;
1946 plsc->boxbb_ymin = plsc->vppymi / plsc->ypmm;
1947 plsc->boxbb_ymax = plsc->vppyma / plsc->ypmm;
1952 if ( lix && ( lmx || lnx ) && ( ltx && !lxx ) )
1954 plsc->boxbb_ymin -= xmajor / plsc->ypmm;
1955 plsc->boxbb_ymax += xmajor / plsc->ypmm;
1957 if ( liy && ( lmy || lny ) && ( lty && !lxy ) )
1959 plsc->boxbb_xmin -= ymajor / plsc->xpmm;
1960 plsc->boxbb_xmax += ymajor / plsc->xpmm;
1965 if ( ( lmx || lnx ) && ( ltx || lxx ) )
1968 PLFLT x_spacing, x_spacing_tmp;
1972 x_spacing = vpwxma - vpwxmi;
1976 for ( i = 1; i < n_xticks; i++ )
1978 x_spacing_tmp = fabs( xticks[i] - xticks[i - 1] );
1979 x_spacing =
MIN( x_spacing, x_spacing_tmp );
1983 plgxax( &xdigmax, &xdigits );
1984 pldprec( vpwxmi, vpwxma, x_spacing, lfx, &xmode, &xprec, xdigmax, &xscale );
1987 height = lix ? 1.75 : 1.5;
1988 if ( plsc->if_boxbb )
1995 height_mm = ( height + 0.7 ) * char_height_mm;
1997 plsc->boxbb_ymin =
MIN( plsc->boxbb_ymin, plsc->vppymi /
1998 plsc->ypmm - height_mm );
2000 plsc->boxbb_ymax =
MAX( plsc->boxbb_ymax, plsc->vppyma /
2001 plsc->ypmm + height_mm );
2004 for ( i = 0; i < n_xticks; i++ )
2007 if (
BETW( tn, vpwxmi, vpwxma ) )
2009 if ( !lxx && !plsc->if_boxbb )
2022 pos = ( vpwxmax > vpwxmin ) ?
2023 ( tn - vpwxmi ) / ( vpwxma - vpwxmi ) :
2024 ( vpwxma - tn ) / ( vpwxma - vpwxmi );
2025 if ( plsc->if_boxbb )
2027 string_length_mm =
plstrl(
string );
2028 pos_mm = ( plsc->vppxmi + pos *
2029 ( plsc->vppxma - plsc->vppxmi ) ) /
2035 if ( plsc->if_boxbb )
2037 plsc->boxbb_xmin =
MIN( plsc->boxbb_xmin,
2038 pos_mm - 0.5 * string_length_mm );
2039 plsc->boxbb_xmax =
MAX( plsc->boxbb_xmax,
2040 pos_mm + 0.5 * string_length_mm );
2044 plmtex(
"b", height, pos, 0.5,
string );
2050 if ( plsc->if_boxbb )
2052 plsc->boxbb_xmin =
MIN( plsc->boxbb_xmin,
2053 pos_mm - 0.5 * string_length_mm );
2054 plsc->boxbb_xmax =
MAX( plsc->boxbb_xmax,
2055 pos_mm + 0.5 * string_length_mm );
2059 plmtex(
"t", height, pos, 0.5,
string );
2065 plsxax( xdigmax, xdigits );
2069 if ( !llx && !ldx && !lox && xmode )
2073 if ( !plsc->label_func && plsc->label_data )
2089 if ( plsc->if_boxbb )
2096 height_mm = ( height + 0.9 ) * char_height_mm;
2097 plsc->boxbb_ymin =
MIN( plsc->boxbb_ymin, plsc->vppymi /
2098 plsc->ypmm - height_mm );
2099 string_length_mm =
plstrl(
string );
2100 pos_mm = ( plsc->vppxmi + pos *
2101 ( plsc->vppxma - plsc->vppxmi ) ) /
2103 plsc->boxbb_xmin =
MIN( plsc->boxbb_xmin,
2104 pos_mm - 0.5 * string_length_mm );
2105 plsc->boxbb_xmax =
MAX( plsc->boxbb_xmax,
2106 pos_mm + 0.5 * string_length_mm );
2110 plmtex(
"b", height, pos, just,
string );
2116 if ( plsc->if_boxbb )
2123 height_mm = ( height + 1.4 ) * char_height_mm;
2124 plsc->boxbb_ymax =
MAX( plsc->boxbb_ymax, plsc->vppyma /
2125 plsc->ypmm + height_mm );
2126 string_length_mm =
plstrl(
string );
2127 pos_mm = ( plsc->vppxmi + pos *
2128 ( plsc->vppxma - plsc->vppxmi ) ) /
2130 plsc->boxbb_xmin =
MIN( plsc->boxbb_xmin,
2131 pos_mm - 0.5 * string_length_mm );
2132 plsc->boxbb_xmax =
MAX( plsc->boxbb_xmax,
2133 pos_mm + 0.5 * string_length_mm );
2137 plmtex(
"t", height, pos, just,
string );
2144 if ( ( lmy || lny ) && ( lty || lxy ) )
2147 PLFLT y_spacing, y_spacing_tmp;
2151 y_spacing = vpwyma - vpwymi;
2155 for ( i = 1; i < n_yticks; i++ )
2157 y_spacing_tmp = fabs( yticks[i] - yticks[i - 1] );
2158 y_spacing =
MIN( y_spacing, y_spacing_tmp );
2162 plgyax( &ydigmax, &ydigits );
2163 pldprec( vpwymi, vpwyma, y_spacing, lfy, &ymode, &yprec, ydigmax, &yscale );
2167 for ( i = 0; i < n_yticks; i++ )
2170 if (
BETW( tn, vpwymi, vpwyma ) )
2172 if ( !lxy && !plsc->if_boxbb )
2185 pos = ( vpwymax > vpwymin ) ?
2186 ( tn - vpwymi ) / ( vpwyma - vpwymi ) :
2187 ( vpwyma - tn ) / ( vpwyma - vpwymi );
2193 height = liy ? 1.0 : 0.5;
2194 if ( plsc->if_boxbb )
2202 height_mm = ( height + 0.0 ) * char_height_mm;
2203 string_length_mm =
plstrl(
string );
2204 plsc->boxbb_xmin =
MIN( plsc->boxbb_xmin, plsc->vppxmi /
2205 plsc->xpmm - height_mm - string_length_mm );
2206 pos_mm = ( plsc->vppymi + pos *
2207 ( plsc->vppyma - plsc->vppymi ) ) /
2211 plsc->boxbb_ymin =
MIN( plsc->boxbb_ymin,
2212 pos_mm - 0.6 * char_height_mm );
2213 plsc->boxbb_ymax =
MAX( plsc->boxbb_ymax,
2214 pos_mm + 0.7 * char_height_mm );
2218 plmtex(
"lv", height, pos, 1.0,
string );
2224 height = liy ? 1.75 : 1.5;
2225 if ( plsc->if_boxbb )
2234 height_mm = ( height + 0.8 ) * char_height_mm;
2235 plsc->boxbb_xmin =
MIN( plsc->boxbb_xmin, plsc->vppxmi /
2236 plsc->xpmm - height_mm );
2237 pos_mm = ( plsc->vppymi + pos *
2238 ( plsc->vppyma - plsc->vppymi ) ) /
2240 string_length_mm =
plstrl(
string );
2241 plsc->boxbb_ymin =
MIN( plsc->boxbb_ymin,
2242 pos_mm - 0.5 * string_length_mm );
2243 plsc->boxbb_ymax =
MAX( plsc->boxbb_ymax,
2244 pos_mm + 0.5 * string_length_mm );
2248 plmtex(
"l", height, pos, 0.5,
string );
2257 height = liy ? 1.0 : 0.5;
2258 if ( plsc->if_boxbb )
2266 height_mm = ( height + 0.0 ) * char_height_mm;
2267 string_length_mm =
plstrl(
string );
2268 plsc->boxbb_xmax =
MAX( plsc->boxbb_xmax, plsc->vppxma /
2269 plsc->xpmm + height_mm + string_length_mm );
2270 pos_mm = ( plsc->vppymi + pos *
2271 ( plsc->vppyma - plsc->vppymi ) ) /
2275 plsc->boxbb_ymin =
MIN( plsc->boxbb_ymin,
2276 pos_mm - 0.6 * char_height_mm );
2277 plsc->boxbb_ymax =
MAX( plsc->boxbb_ymax,
2278 pos_mm + 0.7 * char_height_mm );
2282 plmtex(
"rv", height, pos, 0.0,
string );
2288 height = liy ? 1.75 : 1.5;
2289 if ( plsc->if_boxbb )
2298 height_mm = ( height + 0.8 ) * char_height_mm;
2299 plsc->boxbb_xmax =
MAX( plsc->boxbb_xmax, plsc->vppxma /
2300 plsc->xpmm + height_mm );
2301 pos_mm = ( plsc->vppymi + pos *
2302 ( plsc->vppyma - plsc->vppymi ) ) /
2304 string_length_mm =
plstrl(
string );
2305 plsc->boxbb_ymin =
MIN( plsc->boxbb_ymin,
2306 pos_mm - 0.5 * string_length_mm );
2307 plsc->boxbb_ymax =
MAX( plsc->boxbb_ymax,
2308 pos_mm + 0.5 * string_length_mm );
2312 plmtex(
"r", height, pos, 0.5,
string );
2316 ydigits =
MAX( ydigits, (
PLINT) strlen(
string ) );
2322 plsyax( ydigmax, ydigits );
2326 if ( !lly && !ldy && !loy && ymode )
2329 if ( !plsc->label_func && plsc->label_data )
2346 if ( !plsc->label_data )
2352 if ( plsc->if_boxbb )
2359 height_mm = ( height + 1.4 ) * char_height_mm;
2360 plsc->boxbb_ymax =
MAX( plsc->boxbb_ymax, plsc->vppyma /
2361 plsc->ypmm + height_mm );
2362 string_length_mm =
plstrl(
string );
2363 pos_mm = ( plsc->vppxmi + pos *
2364 ( plsc->vppxma - plsc->vppxmi ) ) /
2366 plsc->boxbb_xmin =
MIN( plsc->boxbb_xmin,
2367 pos_mm - string_length_mm );
2373 plmtex(
"lv", height, pos, just,
string );
2377 plmtex(
"l", height, pos, just,
string );
2384 if ( !plsc->label_data )
2390 if ( plsc->if_boxbb )
2397 height_mm = ( height + 1.4 ) * char_height_mm;
2398 plsc->boxbb_ymax =
MAX( plsc->boxbb_ymax, plsc->vppyma /
2399 plsc->ypmm + height_mm );
2400 string_length_mm =
plstrl(
string );
2401 pos_mm = ( plsc->vppxmi + pos *
2402 ( plsc->vppxma - plsc->vppxmi ) ) /
2404 plsc->boxbb_xmax =
MAX( plsc->boxbb_xmin,
2405 pos_mm + string_length_mm );
2411 plmtex(
"rv", height, pos, just,
string );
2415 plmtex(
"r", height, pos, just,
string );
2423 plsxax( xdigmax_old, xdigits_old );
2424 plsyax( ydigmax_old, ydigits_old );
2427 plP_sclp( lxmin, lxmax, lymin, lymax );
2444 snprintf(
string, (
size_t) len,
"10#u%d", (
int)
ROUND( value ) );
2451 int exponent =
ROUND( value );
2453 value = pow( 10.0, exponent );
2458 snprintf(
string, (
size_t) len, form, value );
2462 snprintf(
string, (
size_t) len,
"%d", (
int) value );
2469 PLINT setpre, precis;
2473 scale = ( (
PLINT *) data )[0];
2474 prec = ( (
PLINT *) data )[1];
2482 value /= pow( 10., (
double) scale );
2486 scale2 = pow( 10., prec );
2487 value = floor( ( value * scale2 ) + .5 ) / scale2;
2491 strncpy(
string, temp, (
size_t) ( len - 1 ) );
2492 string[len - 1] =
'\0';
2526 if ( lo && plsc->label_func )
2528 ( *plsc->label_func )( axis, value,
string, len, plsc->label_data );
2534 plwarn(
"Custom axis labels requested without a labeling function \
2535 - using default." );
2555 PLINT scale_prec[2] = { scale, prec };
2587 plsc->label_data = label_data;