00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "plplotP.h"
00026
00027 #define STRING_LEN 40
00028 #define FORMAT_LEN 10
00029 #define TEMP_LEN 30
00030
00031 static PLFLT xlog[8] =
00032 {
00033 0.301030, 0.477121, 0.602060, 0.698970,
00034 0.778151, 0.845098, 0.903090, 0.954243
00035 };
00036
00037
00038
00039 static void
00040 plxybx(const char *opt, const char *label, PLINT axis, PLFLT wx1, PLFLT wy1,
00041 PLFLT wx2, PLFLT wy2, PLFLT vmin, PLFLT vmax,
00042 PLFLT tick, PLINT nsub, PLINT nolast, PLINT *digits);
00043
00044 static void
00045 plzbx(const char *opt, const char *label, PLINT right, PLFLT dx, PLFLT dy,
00046 PLFLT wx, PLFLT wy1, PLFLT wy2, PLFLT vmin, PLFLT vmax,
00047 PLFLT tick, PLINT nsub, PLINT *digits);
00048
00049 static void
00050 plxytx(PLFLT wx1, PLFLT wy1, PLFLT wx2, PLFLT wy2,
00051 PLFLT disp, PLFLT pos, PLFLT just, const char *text);
00052
00053 static void
00054 plztx(const char *opt, PLFLT dx, PLFLT dy, PLFLT wx, PLFLT wy1,
00055 PLFLT wy2, PLFLT disp, PLFLT pos, PLFLT just, const char *text);
00056
00057 static void
00058 plform(PLINT axis, PLFLT value, PLINT scale, PLINT prec, char *result, PLINT len, PLBOOL ll, PLBOOL lf, PLBOOL lo);
00059
00060 static void
00061 grid_box(const char *xopt, PLFLT xtick1, PLINT nxsub1,
00062 const char *yopt, PLFLT ytick1, PLINT nysub1);
00063
00064 static void
00065 label_box(const char *xopt, PLFLT xtick1, const char *yopt, PLFLT ytick1);
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077 void
00078 c_plbox(const char *xopt, PLFLT xtick, PLINT nxsub,
00079 const char *yopt, PLFLT ytick, PLINT nysub)
00080 {
00081 c_plaxes(0.0, 0.0, xopt, xtick, nxsub, yopt, ytick, nysub);
00082 }
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117 void
00118 c_plaxes(PLFLT x0, PLFLT y0,
00119 const char *xopt, PLFLT xtick, PLINT nxsub,
00120 const char *yopt, PLFLT ytick, PLINT nysub)
00121 {
00122 PLBOOL lax, lbx, lcx, ldx, lgx, lix, llx, lsx, ltx;
00123 PLBOOL lay, lby, lcy, ldy, lgy, liy, lly, lsy, lty;
00124 PLINT xmajor, xminor, ymajor, yminor;
00125 PLINT i, i1x, i2x, i3x, i4x, i1y, i2y, i3y, i4y;
00126 PLINT nxsub1, nysub1;
00127 PLINT lxmin, lxmax, lymin, lymax;
00128 PLINT pxmin, pxmax, pymin, pymax;
00129 PLINT vppxmi, vppxma, vppymi, vppyma;
00130 PLFLT xtick1, ytick1, vpwxmi, vpwxma, vpwymi, vpwyma;
00131 PLFLT vpwxmin, vpwxmax, vpwymin, vpwymax;
00132 PLFLT xp0, yp0, tn, tp, temp;
00133 PLFLT factor, tstart;
00134
00135 if (plsc->level < 3) {
00136 plabort("plbox: Please set up window first");
00137 return;
00138 }
00139
00140
00141
00142 plP_gclp(&lxmin, &lxmax, &lymin, &lymax);
00143 plP_gphy(&pxmin, &pxmax, &pymin, &pymax);
00144 plP_sclp(pxmin, pxmax, pymin, pymax);
00145
00146 vppxmi = plsc->vppxmi;
00147 vppxma = plsc->vppxma;
00148 vppymi = plsc->vppymi;
00149 vppyma = plsc->vppyma;
00150
00151
00152
00153 xp0 = plP_wcpcx(x0);
00154 yp0 = plP_wcpcy(y0);
00155
00156
00157
00158 lax = plP_stsearch(xopt, 'a');
00159 lbx = plP_stsearch(xopt, 'b');
00160 lcx = plP_stsearch(xopt, 'c');
00161 ldx = plP_stsearch(xopt, 'd');
00162 lgx = plP_stsearch(xopt, 'g');
00163 lix = plP_stsearch(xopt, 'i');
00164 llx = plP_stsearch(xopt, 'l');
00165 lsx = plP_stsearch(xopt, 's');
00166 ltx = plP_stsearch(xopt, 't');
00167
00168 lay = plP_stsearch(yopt, 'a');
00169 lby = plP_stsearch(yopt, 'b');
00170 lcy = plP_stsearch(yopt, 'c');
00171 ldy = plP_stsearch(yopt, 'd');
00172 lgy = plP_stsearch(yopt, 'g');
00173 liy = plP_stsearch(yopt, 'i');
00174 lly = plP_stsearch(yopt, 'l');
00175 lsy = plP_stsearch(yopt, 's');
00176 lty = plP_stsearch(yopt, 't');
00177
00178
00179
00180 xmajor = MAX(ROUND(plsc->majht * plsc->ypmm), 1);
00181 ymajor = MAX(ROUND(plsc->majht * plsc->xpmm), 1);
00182 xminor = MAX(ROUND(plsc->minht * plsc->ypmm), 1);
00183 yminor = MAX(ROUND(plsc->minht * plsc->xpmm), 1);
00184
00185 nxsub1 = nxsub;
00186 nysub1 = nysub;
00187 xtick1 = llx ? 1.0 : xtick;
00188 ytick1 = lly ? 1.0 : ytick;
00189
00190 plP_xgvpw(&vpwxmin, &vpwxmax, &vpwymin, &vpwymax);
00191
00192
00193 vpwxmi = (vpwxmax > vpwxmin) ? vpwxmin : vpwxmax;
00194 vpwxma = (vpwxmax > vpwxmin) ? vpwxmax : vpwxmin;
00195 vpwymi = (vpwymax > vpwymin) ? vpwymin : vpwymax;
00196 vpwyma = (vpwymax > vpwymin) ? vpwymax : vpwymin;
00197
00198 lax = lax && vpwymi < y0 && y0 < vpwyma ;
00199 lay = lay && vpwxmi < x0 && x0 < vpwxma ;
00200
00201
00202
00203 if (ltx || lgx)
00204 pldtik(vpwxmi, vpwxma, &xtick1, &nxsub1, ldx);
00205
00206 if (lty || lgy)
00207 pldtik(vpwymi, vpwyma, &ytick1, &nysub1, ldy);
00208
00209
00210
00211
00212 if (lix) {
00213 i1x = xminor;
00214 i2x = 0;
00215 i3x = xmajor;
00216 i4x = 0;
00217 }
00218 else {
00219 i1x = 0;
00220 i2x = xminor;
00221 i3x = 0;
00222 i4x = xmajor;
00223 }
00224
00225 if (liy) {
00226 i1y = yminor;
00227 i2y = 0;
00228 i3y = ymajor;
00229 i4y = 0;
00230 }
00231 else {
00232 i1y = 0;
00233 i2y = yminor;
00234 i3y = 0;
00235 i4y = ymajor;
00236 }
00237
00238
00239
00240 if (lbx) {
00241 plP_movphy(vppxmi, vppymi);
00242 plP_draphy(vppxma, vppymi);
00243 if (ltx) {
00244 if (ldx) {
00245 pldtfac(vpwxmi, vpwxma, &factor, &tstart);
00246 tp = xtick1 * (floor((vpwxmi-tstart) / xtick1)) + tstart;
00247 }
00248 else
00249 tp = xtick1 * floor(vpwxmi / xtick1);
00250 for (;;) {
00251 tn = tp + xtick1;
00252 if (lsx) {
00253 if (llx) {
00254 for (i = 0; i <= 7; i++) {
00255 temp = tp + xlog[i];
00256 if (BETW(temp, vpwxmi, vpwxma))
00257 plxtik(plP_wcpcx(temp), vppymi, i1x, i2x);
00258 }
00259 }
00260 else {
00261 for (i = 1; i <= nxsub1 - 1; i++) {
00262 temp = tp + i * xtick1 / nxsub1;
00263 if (BETW(temp, vpwxmi, vpwxma))
00264 plxtik(plP_wcpcx(temp), vppymi, i1x, i2x);
00265 }
00266 }
00267 }
00268 if (!BETW(tn, vpwxmi, vpwxma))
00269 break;
00270 plxtik(plP_wcpcx(tn), vppymi, i3x, i4x);
00271 tp = tn;
00272 }
00273 }
00274 }
00275
00276
00277
00278 if (lcy) {
00279 plP_movphy(vppxma, vppymi);
00280 plP_draphy(vppxma, vppyma);
00281 if (lty) {
00282 if (ldy) {
00283 pldtfac(vpwymi, vpwyma, &factor, &tstart);
00284 tp = ytick1 * (floor((vpwymi-tstart) / ytick1)) + tstart;
00285 }
00286 else
00287 tp = ytick1 * floor(vpwymi / ytick1);
00288 for (;;) {
00289 tn = tp + ytick1;
00290 if (lsy) {
00291 if (lly) {
00292 for (i = 0; i <= 7; i++) {
00293 temp = tp + xlog[i];
00294 if (BETW(temp, vpwymi, vpwyma))
00295 plytik(vppxma, plP_wcpcy(temp), i2y, i1y);
00296 }
00297 }
00298 else {
00299 for (i = 1; i <= nysub1 - 1; i++) {
00300 temp = tp + i * ytick1 / nysub1;
00301 if (BETW(temp, vpwymi, vpwyma))
00302 plytik(vppxma, plP_wcpcy(temp), i2y, i1y);
00303 }
00304 }
00305 }
00306 if (!BETW(tn, vpwymi, vpwyma))
00307 break;
00308 plytik(vppxma, plP_wcpcy(tn), i4y, i3y);
00309 tp = tn;
00310 }
00311 }
00312 }
00313
00314
00315
00316 if (lcx) {
00317 plP_movphy(vppxma, vppyma);
00318 plP_draphy(vppxmi, vppyma);
00319 if (ltx) {
00320 if (ldx) {
00321 pldtfac(vpwxmi, vpwxma, &factor, &tstart);
00322 tp = xtick1 * (floor((vpwxma-tstart) / xtick1) + 1) + tstart;
00323 }
00324 else
00325 tp = xtick1 * (floor(vpwxma / xtick1) + 1);
00326 for (;;) {
00327 tn = tp - xtick1;
00328 if (lsx) {
00329 if (llx) {
00330 for (i = 7; i >= 0; i--) {
00331 temp = tn + xlog[i];
00332 if (BETW(temp, vpwxmi, vpwxma))
00333 plxtik(plP_wcpcx(temp), vppyma, i2x, i1x);
00334 }
00335 }
00336 else {
00337 for (i = nxsub1 - 1; i >= 1; i--) {
00338 temp = tn + i * xtick1 / nxsub1;
00339 if (BETW(temp, vpwxmi, vpwxma))
00340 plxtik(plP_wcpcx(temp), vppyma, i2x, i1x);
00341 }
00342 }
00343 }
00344 if (!BETW(tn, vpwxmi, vpwxma))
00345 break;
00346 plxtik(plP_wcpcx(tn), vppyma, i4x, i3x);
00347 tp = tn;
00348 }
00349 }
00350 }
00351
00352
00353
00354 if (lby) {
00355 plP_movphy(vppxmi, vppyma);
00356 plP_draphy(vppxmi, vppymi);
00357 if (lty) {
00358 if (ldy) {
00359 pldtfac(vpwymi, vpwyma, &factor, &tstart);
00360 tp = ytick1 * (floor((vpwymi-tstart) / ytick1)+1) + tstart;
00361 }
00362 else
00363 tp = ytick1 * (floor(vpwyma / ytick1) + 1);
00364 for (;;) {
00365 tn = tp - ytick1;
00366 if (lsy) {
00367 if (lly) {
00368 for (i = 7; i >= 0; i--) {
00369 temp = tn + xlog[i];
00370 if (BETW(temp, vpwymi, vpwyma))
00371 plytik(vppxmi, plP_wcpcy(temp), i1y, i2y);
00372 }
00373 }
00374 else {
00375 for (i = nysub1 - 1; i >= 1; i--) {
00376 temp = tn + i * ytick1 / nysub1;
00377 if (BETW(temp, vpwymi, vpwyma))
00378 plytik(vppxmi, plP_wcpcy(temp), i1y, i2y);
00379 }
00380 }
00381 }
00382 if (!BETW(tn, vpwymi, vpwyma))
00383 break;
00384 plytik(vppxmi, plP_wcpcy(tn), i3y, i4y);
00385 tp = tn;
00386 }
00387 }
00388 }
00389
00390
00391
00392 if (lax) {
00393 plP_movphy(vppxmi, (PLINT)yp0);
00394 plP_draphy(vppxma, (PLINT)yp0);
00395 if (ltx) {
00396 tp = xtick1 * floor(vpwxmi / xtick1);
00397 for (;;) {
00398 tn = tp + xtick1;
00399 if (lsx) {
00400 if (llx) {
00401 for (i = 0; i <= 7; i++) {
00402 temp = tp + xlog[i];
00403 if (BETW(temp, vpwxmi, vpwxma))
00404 plxtik(plP_wcpcx(temp), (PLINT)yp0, xminor, xminor);
00405 }
00406 }
00407 else {
00408 for (i = 1; i <= nxsub1 - 1; i++) {
00409 temp = tp + i * xtick1 / nxsub1;
00410 if (BETW(temp, vpwxmi, vpwxma))
00411 plxtik(plP_wcpcx(temp), (PLINT)yp0, xminor, xminor);
00412 }
00413 }
00414 }
00415 if (!BETW(tn, vpwxmi, vpwxma))
00416 break;
00417 plxtik(plP_wcpcx(tn), (PLINT)yp0, xmajor, xmajor);
00418 tp = tn;
00419 }
00420 }
00421 }
00422
00423
00424
00425 if (lay) {
00426 plP_movphy((PLINT)xp0, vppymi);
00427 plP_draphy((PLINT)xp0, vppyma);
00428 if (lty) {
00429 tp = ytick1 * floor(vpwymi / ytick1);
00430 for (;;) {
00431 tn = tp + ytick1;
00432 if (lsy) {
00433 if (lly) {
00434 for (i = 0; i <= 7; i++) {
00435 temp = tp + xlog[i];
00436 if (BETW(temp, vpwymi, vpwyma))
00437 plytik((PLINT)xp0, plP_wcpcy(temp), yminor, yminor);
00438 }
00439 }
00440 else {
00441 for (i = 1; i <= nysub1 - 1; i++) {
00442 temp = tp + i * ytick1 / nysub1;
00443 if (BETW(temp, vpwymi, vpwyma))
00444 plytik((PLINT)xp0, plP_wcpcy(temp), yminor, yminor);
00445 }
00446 }
00447 }
00448 if (!BETW(tn, vpwymi, vpwyma))
00449 break;
00450 plytik((PLINT)xp0, plP_wcpcy(tn), ymajor, ymajor);
00451 tp = tn;
00452 }
00453 }
00454 }
00455
00456
00457
00458 grid_box(xopt, xtick1, nxsub1, yopt, ytick1, nysub1);
00459
00460
00461
00462 label_box(xopt, xtick1, yopt, ytick1);
00463
00464
00465
00466 plP_sclp(lxmin, lxmax, lymin, lymax);
00467 }
00468
00469
00470
00471
00472
00473
00474
00475 void
00476 c_plbox3(const char *xopt, const char *xlabel, PLFLT xtick, PLINT nsubx,
00477 const char *yopt, const char *ylabel, PLFLT ytick, PLINT nsuby,
00478 const char *zopt, const char *zlabel, PLFLT ztick, PLINT nsubz)
00479 {
00480 PLFLT dx, dy, tx, ty, ux, uy;
00481 PLFLT xmin, xmax, ymin, ymax, zmin, zmax, zscale;
00482 PLFLT cxx, cxy, cyx, cyy, cyz;
00483 PLINT ln;
00484 PLINT *zbflg, *zbcol, *zbwidth;
00485 PLFLT *zbtck;
00486 PLINT xdigmax, xdigits;
00487 PLINT ydigmax, ydigits;
00488 PLINT zdigmax, zdigits;
00489
00490 if (plsc->level < 3) {
00491 plabort("plbox3: Please set up window first");
00492 return;
00493 }
00494
00495 plP_gw3wc(&cxx, &cxy, &cyx, &cyy, &cyz);
00496 plP_gdom(&xmin, &xmax, &ymin, &ymax);
00497 plP_grange(&zscale, &zmin, &zmax);
00498
00499 plgxax(&xdigmax, &xdigits);
00500 plgyax(&ydigmax, &ydigits);
00501 plgzax(&zdigmax, &zdigits);
00502
00503 xdigits = xdigmax;
00504 ydigits = ydigmax;
00505 zdigits = zdigmax;
00506
00507
00508
00509
00510 plP_gzback(&zbflg, &zbcol, &zbtck, &zbwidth);
00511 *zbflg = plP_stsearch(zopt, 'd');
00512 if (*zbflg) {
00513 *zbtck = ztick;
00514 *zbcol = plsc->icol0;
00515 *zbwidth = plsc->width;
00516 }
00517
00518 if (cxx >= 0.0 && cxy <= 0.0) {
00519 ln = plP_stsearch(xopt, 'n');
00520 tx = plP_w3wcx(xmin, ymin, zmin);
00521 ty = plP_w3wcy(xmin, ymin, zmin);
00522 ux = plP_w3wcx(xmax, ymin, zmin);
00523 uy = plP_w3wcy(xmax, ymin, zmin);
00524 plxybx(xopt, xlabel, PL_X_AXIS, tx, ty, ux, uy,
00525 xmin, xmax, xtick, nsubx, 0, &xdigits);
00526
00527 dx = ux - tx;
00528 dy = uy - ty;
00529 plzbx(zopt, zlabel, 1, dx, dy, ux, uy,
00530 plP_w3wcy(xmax, ymin, zmax), zmin, zmax, ztick, nsubz, &zdigits);
00531
00532 tx = plP_w3wcx(xmin, ymax, zmin);
00533 ty = plP_w3wcy(xmin, ymax, zmin);
00534 ux = plP_w3wcx(xmin, ymin, zmin);
00535 uy = plP_w3wcy(xmin, ymin, zmin);
00536 plxybx(yopt, ylabel, PL_Y_AXIS, tx, ty, ux, uy,
00537 ymax, ymin, ytick, nsuby, ln, &ydigits);
00538
00539 dx = ux - tx;
00540 dy = uy - ty;
00541
00542 zdigits = zdigmax;
00543 plzbx(zopt, zlabel, 0, dx, dy, tx, ty,
00544 plP_w3wcy(xmin, ymax, zmax), zmin, zmax, ztick, nsubz, &zdigits);
00545 }
00546 else if (cxx <= 0.0 && cxy <= 0.0) {
00547 ln = plP_stsearch(yopt, 'n');
00548 tx = plP_w3wcx(xmin, ymax, zmin);
00549 ty = plP_w3wcy(xmin, ymax, zmin);
00550 ux = plP_w3wcx(xmin, ymin, zmin);
00551 uy = plP_w3wcy(xmin, ymin, zmin);
00552 plxybx(yopt, ylabel, PL_Y_AXIS, tx, ty, ux, uy,
00553 ymax, ymin, ytick, nsuby, 0, &ydigits);
00554
00555 dx = ux - tx;
00556 dy = uy - ty;
00557 plzbx(zopt, zlabel, 1, dx, dy, ux, uy,
00558 plP_w3wcy(xmin, ymin, zmax), zmin, zmax, ztick, nsubz, &zdigits);
00559
00560 tx = plP_w3wcx(xmax, ymax, zmin);
00561 ty = plP_w3wcy(xmax, ymax, zmin);
00562 ux = plP_w3wcx(xmin, ymax, zmin);
00563 uy = plP_w3wcy(xmin, ymax, zmin);
00564 plxybx(xopt, xlabel, PL_X_AXIS, tx, ty, ux, uy,
00565 xmax, xmin, xtick, nsubx, ln, &xdigits);
00566
00567 dx = ux - tx;
00568 dy = uy - ty;
00569
00570 zdigits = zdigmax;
00571 plzbx(zopt, zlabel, 0, dx, dy, tx, ty,
00572 plP_w3wcy(xmax, ymax, zmax), zmin, zmax, ztick, nsubz, &zdigits);
00573 }
00574 else if (cxx <= 0.0 && cxy >= 0.0) {
00575 ln = plP_stsearch(xopt, 'n');
00576 tx = plP_w3wcx(xmax, ymax, zmin);
00577 ty = plP_w3wcy(xmax, ymax, zmin);
00578 ux = plP_w3wcx(xmin, ymax, zmin);
00579 uy = plP_w3wcy(xmin, ymax, zmin);
00580 plxybx(xopt, xlabel, PL_X_AXIS, tx, ty, ux, uy,
00581 xmax, xmin, xtick, nsubx, 0, &xdigits);
00582
00583 dx = ux - tx;
00584 dy = uy - ty;
00585 plzbx(zopt, zlabel, 1, dx, dy, ux, uy,
00586 plP_w3wcy(xmin, ymax, zmax), zmin, zmax, ztick, nsubz, &zdigits);
00587
00588 tx = plP_w3wcx(xmax, ymin, zmin);
00589 ty = plP_w3wcy(xmax, ymin, zmin);
00590 ux = plP_w3wcx(xmax, ymax, zmin);
00591 uy = plP_w3wcy(xmax, ymax, zmin);
00592 plxybx(yopt, ylabel, PL_Y_AXIS, tx, ty, ux, uy,
00593 ymin, ymax, ytick, nsuby, ln, &ydigits);
00594
00595 dx = ux - tx;
00596 dy = uy - ty;
00597
00598 zdigits = zdigmax;
00599 plzbx(zopt, zlabel, 0, dx, dy, tx, ty,
00600 plP_w3wcy(xmax, ymin, zmax), zmin, zmax, ztick, nsubz, &zdigits);
00601 }
00602 else if (cxx >= 0.0 && cxy >= 0.0) {
00603 ln = plP_stsearch(yopt, 'n');
00604 tx = plP_w3wcx(xmax, ymin, zmin);
00605 ty = plP_w3wcy(xmax, ymin, zmin);
00606 ux = plP_w3wcx(xmax, ymax, zmin);
00607 uy = plP_w3wcy(xmax, ymax, zmin);
00608 plxybx(yopt, ylabel, PL_X_AXIS, tx, ty, ux, uy,
00609 ymin, ymax, ytick, nsuby, 0, &ydigits);
00610
00611 dx = ux - tx;
00612 dy = uy - ty;
00613 plzbx(zopt, zlabel, 1, dx, dy, ux, uy,
00614 plP_w3wcy(xmax, ymax, zmax), zmin, zmax, ztick, nsubz, &zdigits);
00615
00616 tx = plP_w3wcx(xmin, ymin, zmin);
00617 ty = plP_w3wcy(xmin, ymin, zmin);
00618 ux = plP_w3wcx(xmax, ymin, zmin);
00619 uy = plP_w3wcy(xmax, ymin, zmin);
00620 plxybx(xopt, xlabel, PL_X_AXIS, tx, ty, ux, uy,
00621 xmin, xmax, xtick, nsubx, ln, &xdigits);
00622
00623 dx = ux - tx;
00624 dy = uy - ty;
00625
00626 zdigits = zdigmax;
00627 plzbx(zopt, zlabel, 0, dx, dy, tx, ty,
00628 plP_w3wcy(xmin, ymin, zmax), zmin, zmax, ztick, nsubz, &zdigits);
00629 }
00630 plsxax(xdigmax, xdigits);
00631 plsyax(ydigmax, ydigits);
00632 plszax(zdigmax, zdigits);
00633 }
00634
00635
00636
00637
00638
00639
00640
00641
00642
00643
00644
00645
00646
00647
00648
00649
00650
00651
00652
00653
00654
00655
00656
00657
00658
00659 static void
00660 plxybx(const char *opt, const char *label, PLINT axis, PLFLT wx1, PLFLT wy1,
00661 PLFLT wx2, PLFLT wy2, PLFLT vmin_in, PLFLT vmax_in,
00662 PLFLT tick, PLINT nsub, PLINT nolast, PLINT *digits)
00663 {
00664 static char string[STRING_LEN];
00665 PLINT lb, ld, lf, li, ll, ln, ls, lt, lu, lo;
00666 PLINT major, minor, mode, prec, scale;
00667 PLINT i, i1, i2, i3, i4;
00668 PLINT nsub1;
00669 PLFLT pos, tn, tp, temp, height, tick1, vmin, vmax;
00670
00671
00672 PLFLT dwx, dwy, lambda, tcrit, tspace = 0.1;
00673
00674 vmin = (vmax_in > vmin_in) ? vmin_in : vmax_in;
00675 vmax = (vmax_in > vmin_in) ? vmax_in : vmin_in;
00676
00677 dwx = wx2 - wx1;
00678 dwy = wy2 - wy1;
00679
00680
00681
00682 major = MAX(ROUND(plsc->majht * plsc->ypmm), 1);
00683 minor = MAX(ROUND(plsc->minht * plsc->ypmm), 1);
00684
00685 tick1 = tick;
00686 nsub1 = nsub;
00687
00688 lb = plP_stsearch(opt, 'b');
00689 ld = plP_stsearch(opt, 'd');
00690 lf = plP_stsearch(opt, 'f');
00691 li = plP_stsearch(opt, 'i');
00692 ll = plP_stsearch(opt, 'l');
00693 ln = plP_stsearch(opt, 'n');
00694 ls = plP_stsearch(opt, 's');
00695 lt = plP_stsearch(opt, 't');
00696 lu = plP_stsearch(opt, 'u');
00697 lo = plP_stsearch(opt, 'o');
00698
00699 if (lu)
00700 plxytx(wx1, wy1, wx2, wy2, 3.2, 0.5, 0.5, label);
00701 if (!lb)
00702 return;
00703
00704 if (ll)
00705 tick1 = (vmax > vmin) ? 1.0 : -1.0 ;
00706 if (lt)
00707 pldtik(vmin, vmax, &tick1, &nsub1, ld);
00708
00709 if (li) {
00710 i1 = minor;
00711 i2 = 0;
00712 i3 = major;
00713 i4 = 0;
00714 }
00715 else {
00716 i1 = 0;
00717 i2 = minor;
00718 i3 = 0;
00719 i4 = major;
00720 }
00721
00722
00723
00724 plP_movwor(wx1, wy1);
00725 plP_drawor(wx2, wy2);
00726 if (lt) {
00727 tp = tick1 * floor(vmin / tick1);
00728 for (;;) {
00729 tn = tp + tick1;
00730 if (ls) {
00731 if (ll) {
00732 for (i = 0; i <= 7; i++) {
00733 temp = tp + xlog[i];
00734 if (BETW(temp, vmin, vmax)) {
00735 lambda = (vmax_in > vmin_in)?
00736 (temp - vmin) / (vmax - vmin):
00737 (vmax - temp) / (vmax - vmin);
00738 plxtik(plP_wcpcx((PLFLT) (wx1 + lambda * dwx)),
00739 plP_wcpcy((PLFLT) (wy1 + lambda * dwy)),
00740 i1, i2);
00741 }
00742 }
00743 }
00744 else {
00745 for (i = 1; i <= nsub1 - 1; i++) {
00746 temp = tp + i * (tn - tp) / nsub1;
00747 if (BETW(temp, vmin, vmax)) {
00748 lambda = (vmax_in > vmin_in)?
00749 (temp - vmin) / (vmax - vmin):
00750 (vmax - temp) / (vmax - vmin);
00751 plxtik(plP_wcpcx((PLFLT) (wx1 + lambda * dwx)),
00752 plP_wcpcy((PLFLT) (wy1 + lambda * dwy)),
00753 i1, i2);
00754 }
00755 }
00756 }
00757 }
00758 temp = tn;
00759 if (!BETW(temp, vmin, vmax))
00760 break;
00761
00762 lambda = (vmax_in > vmin_in)?
00763 (temp - vmin) / (vmax - vmin):
00764 (vmax - temp) / (vmax - vmin);
00765 plxtik(plP_wcpcx((PLFLT) (wx1 + lambda * dwx)),
00766 plP_wcpcy((PLFLT) (wy1 + lambda * dwy)), i3, i4);
00767 tp = tn;
00768 }
00769 }
00770
00771
00772
00773
00774 if (ln && lt) {
00775 pldprec(vmin, vmax, tick1, lf, &mode, &prec, *digits, &scale);
00776 pos = 1.0;
00777 height = 3.2;
00778 tcrit = tspace*tick1;
00779 tp = tick1 * (1. + floor(vmin / tick1));
00780 for (tn = tp; BETW(tn, vmin, vmax); tn += tick1) {
00781 if(BETW(tn, vmin+tcrit, vmax-tcrit)) {
00782 plform(axis, tn, scale, prec, string, STRING_LEN, ll, lf, lo);
00783 pos = (vmax_in > vmin_in)?
00784 (tn - vmin) / (vmax - vmin):
00785 (vmax - tn) / (vmax - vmin);
00786 plxytx(wx1, wy1, wx2, wy2, 1.5, pos, 0.5, string);
00787 }
00788 }
00789 *digits = 2;
00790 if (!ll && !lo && mode) {
00791 snprintf(string, STRING_LEN, "(x10#u%d#d)", (int) scale);
00792 plxytx(wx1, wy1, wx2, wy2, height, 1.0, 0.5, string);
00793 }
00794 }
00795 }
00796
00797
00798
00799
00800
00801
00802
00803
00804 static void
00805 plxytx(PLFLT wx1, PLFLT wy1, PLFLT wx2, PLFLT wy2,
00806 PLFLT disp, PLFLT pos, PLFLT just, const char *text)
00807 {
00808 PLINT x, y, refx, refy;
00809 PLFLT shift, cc, ss, wx, wy;
00810 PLFLT xdv, ydv, xmm, ymm, refxmm, refymm, xform[4], diag;
00811 PLFLT dispx, dispy;
00812 PLFLT chrdef, chrht;
00813
00814 cc = plsc->wmxscl * (wx2 - wx1);
00815 ss = plsc->wmyscl * (wy2 - wy1);
00816 diag = sqrt(cc * cc + ss * ss);
00817 cc /= diag;
00818 ss /= diag;
00819 wx = wx1 + pos * (wx2 - wx1);
00820 wy = wy1 + pos * (wy2 - wy1);
00821
00822 xform[0] = cc;
00823 xform[1] = 0.0;
00824 xform[2] = ss;
00825 xform[3] = 1.0;
00826
00827 xdv = plP_wcdcx(wx);
00828 ydv = plP_wcdcy(wy);
00829
00830 dispx = 0.;
00831 dispy = -disp;
00832
00833 plgchr(&chrdef, &chrht);
00834 shift = (just == 0.0) ? 0.0 : plstrl(text) * just;
00835
00836 xmm = plP_dcmmx(xdv) + dispx * chrht;
00837 ymm = plP_dcmmy(ydv) + dispy * chrht;
00838 refxmm = xmm - shift * xform[0];
00839 refymm = ymm - shift * xform[2];
00840
00841 x = plP_mmpcx(xmm);
00842 y = plP_mmpcy(ymm);
00843 refx = plP_mmpcx(refxmm);
00844 refy = plP_mmpcy(refymm);
00845
00846 plP_text(0, just, xform, x, y, refx, refy, text);
00847 }
00848
00849
00850
00851
00852
00853
00854
00855
00856
00857
00858
00859
00860
00861
00862
00863
00864
00865
00866
00867
00868
00869
00870
00871
00872 static void
00873 plzbx(const char *opt, const char *label, PLINT right, PLFLT dx, PLFLT dy,
00874 PLFLT wx, PLFLT wy1, PLFLT wy2, PLFLT vmin_in, PLFLT vmax_in,
00875 PLFLT tick, PLINT nsub, PLINT *digits)
00876 {
00877 static char string[STRING_LEN];
00878 PLINT lb, lc, ld, lf, li, ll, lm, ln, ls, lt, lu, lv, lo;
00879 PLINT i, mode, prec, scale;
00880 PLINT nsub1, lstring;
00881 PLFLT pos, tn, tp, temp, height, tick1;
00882 PLFLT dwy, lambda, diag, major, minor, xmajor, xminor;
00883 PLFLT ymajor, yminor, dxm, dym, vmin, vmax;
00884
00885 vmin = (vmax_in > vmin_in) ? vmin_in : vmax_in;
00886 vmax = (vmax_in > vmin_in) ? vmax_in : vmin_in;
00887
00888 dwy = wy2 - wy1;
00889
00890
00891
00892 major = plsc->majht;
00893 minor = plsc->minht;
00894
00895 tick1 = tick;
00896 nsub1 = nsub;
00897
00898 lb = plP_stsearch(opt, 'b');
00899 lc = plP_stsearch(opt, 'c');
00900 ld = plP_stsearch(opt, 'd');
00901 lf = plP_stsearch(opt, 'f');
00902 li = plP_stsearch(opt, 'i');
00903 ll = plP_stsearch(opt, 'l');
00904 lm = plP_stsearch(opt, 'm');
00905 ln = plP_stsearch(opt, 'n');
00906 ls = plP_stsearch(opt, 's');
00907 lt = plP_stsearch(opt, 't');
00908 lu = plP_stsearch(opt, 'u');
00909 lv = plP_stsearch(opt, 'v');
00910 lo = plP_stsearch(opt, 'o');
00911
00912 if (lu && !right)
00913 plztx("h", dx, dy, wx, wy1, wy2, 5.0, 0.5, 0.5, label);
00914
00915 if (lv && right)
00916 plztx("h", dx, dy, wx, wy1, wy2, -5.0, 0.5, 0.5, label);
00917
00918 if (right && !lc)
00919 return;
00920
00921 if (!right && !lb)
00922 return;
00923
00924 if (ll)
00925 tick1 = 1.0;
00926
00927 if (lt)
00928 pldtik(vmin, vmax, &tick1, &nsub1, ld);
00929
00930 if ((li && !right) || (!li && right)) {
00931 minor = -minor;
00932 major = -major;
00933 }
00934
00935 dxm = dx * plsc->wmxscl;
00936 dym = dy * plsc->wmyscl;
00937 diag = sqrt(dxm * dxm + dym * dym);
00938
00939 xminor = minor * dxm / diag;
00940 xmajor = major * dxm / diag;
00941 yminor = minor * dym / diag;
00942 ymajor = major * dym / diag;
00943
00944
00945
00946 plP_movwor(wx, wy1);
00947 plP_drawor(wx, wy2);
00948 if (lt) {
00949 tp = tick1 * floor(vmin / tick1);
00950 for (;;) {
00951 tn = tp + tick1;
00952 if (ls) {
00953 if (ll) {
00954 for (i = 0; i <= 7; i++) {
00955 temp = tp + xlog[i];
00956 if (BETW(temp, vmin, vmax)) {
00957 lambda = (vmax_in > vmin_in)?
00958 (temp - vmin) / (vmax - vmin):
00959 (vmax - temp) / (vmax - vmin);
00960 plstik(plP_wcmmx(wx),
00961 plP_wcmmy((PLFLT) (wy1 + lambda * dwy)),
00962 xminor, yminor);
00963 }
00964 }
00965 }
00966 else {
00967 for (i = 1; i <= nsub1 - 1; i++) {
00968 temp = tp + i * tick1 / nsub1;
00969 if (BETW(temp, vmin, vmax)) {
00970 lambda = (vmax_in > vmin_in)?
00971 (temp - vmin) / (vmax - vmin):
00972 (vmax - temp) / (vmax - vmin);
00973 plstik(plP_wcmmx(wx),
00974 plP_wcmmy((PLFLT) (wy1 + lambda * dwy)),
00975 xminor, yminor);
00976 }
00977 }
00978 }
00979 }
00980 temp = tn;
00981 if (!BETW(temp, vmin, vmax))
00982 break;
00983 lambda = (vmax_in > vmin_in)?
00984 (temp - vmin) / (vmax - vmin):
00985 (vmax - temp) / (vmax - vmin);
00986 plstik(plP_wcmmx(wx), plP_wcmmy((PLFLT) (wy1 + lambda * dwy)),
00987 xmajor, ymajor);
00988 tp = tn;
00989 }
00990 }
00991
00992
00993
00994
00995 if ((ln || lm) && lt) {
00996 pldprec(vmin, vmax, tick1, lf, &mode, &prec, *digits, &scale);
00997 *digits = 0;
00998 tp = tick1 * floor(vmin / tick1);
00999 for (tn = tp + tick1; BETW(tn, vmin, vmax); tn += tick1) {
01000 plform(PL_Z_AXIS, tn, scale, prec, string, STRING_LEN, ll, lf, lo);
01001 pos = (vmax_in > vmin_in)?
01002 (tn - vmin) / (vmax - vmin):
01003 (vmax - tn) / (vmax - vmin);
01004 if (ln && !right)
01005 plztx("v", dx, dy, wx, wy1, wy2, 0.5, pos, 1.0, string);
01006
01007 if (lm && right)
01008 plztx("v", dx, dy, wx, wy1, wy2, -0.5, pos, 0.0, string);
01009
01010 lstring = strlen(string);
01011 *digits = MAX(*digits, lstring);
01012 }
01013 if (!ll && !lo && mode) {
01014 snprintf(string, STRING_LEN, "(x10#u%d#d)", (int) scale);
01015 pos = 1.15;
01016 height = 0.5;
01017 if (ln && !right) {
01018 plztx("v", dx, dy, wx, wy1, wy2, height, pos, 0.5, string);
01019 }
01020 if (lm && right) {
01021 plztx("v", dx, dy, wx, wy1, wy2,
01022 (PLFLT) -height, pos, 0.5, string);
01023 }
01024 }
01025 }
01026 }
01027
01028
01029
01030
01031
01032
01033
01034
01035 static void
01036 plztx(const char *opt, PLFLT dx, PLFLT dy, PLFLT wx, PLFLT wy1,
01037 PLFLT wy2, PLFLT disp, PLFLT pos, PLFLT just, const char *text)
01038 {
01039 PLINT refx = 0, refy = 0, x = 0, y = 0, vert = 0;
01040 PLFLT shift, cc, ss, wy;
01041 PLFLT xdv, ydv, xmm, ymm, refxmm, refymm, xform[4], diag;
01042 PLFLT dispx, dispy;
01043 PLFLT chrdef, chrht;
01044
01045 cc = plsc->wmxscl * dx;
01046 ss = plsc->wmyscl * dy;
01047 diag = sqrt(cc * cc + ss * ss);
01048 cc /= diag;
01049 ss /= diag;
01050 wy = wy1 + pos * (wy2 - wy1);
01051
01052 if (plP_stsearch(opt, 'v'))
01053 vert = 0;
01054 else if (plP_stsearch(opt, 'h'))
01055 vert = 1;
01056
01057 if (vert) {
01058 xform[0] = 0.0;
01059 xform[1] = -cc;
01060 xform[2] = 1.0;
01061 xform[3] = -ss;
01062 } else {
01063 xform[0] = cc;
01064 xform[1] = 0.0;
01065 xform[2] = ss;
01066 xform[3] = 1.0;
01067 }
01068
01069 xdv = plP_wcdcx(wx);
01070 ydv = plP_wcdcy(wy);
01071
01072 dispx = -disp * cc;
01073 dispy = -disp * ss;
01074
01075 plgchr(&chrdef, &chrht);
01076 shift = (just == 0.0) ? 0.0 : plstrl(text) * just;
01077
01078 xmm = plP_dcmmx(xdv) + dispx * chrht;
01079 ymm = plP_dcmmy(ydv) + dispy * chrht;
01080 refxmm = xmm - shift * xform[0];
01081 refymm = ymm - shift * xform[2];
01082
01083 x = plP_mmpcx(xmm);
01084 y = plP_mmpcy(ymm);
01085 refx = plP_mmpcx(refxmm);
01086 refy = plP_mmpcy(refymm);
01087
01088 plP_text(0, just, xform, x, y, refx, refy, text);
01089 }
01090
01091
01092
01093
01094
01095
01096
01097
01098
01099
01100
01101 static void
01102 grid_box(const char *xopt, PLFLT xtick1, PLINT nxsub1,
01103 const char *yopt, PLFLT ytick1, PLINT nysub1)
01104 {
01105 PLINT lgx, lhx, llx;
01106 PLINT lgy, lhy, lly;
01107 PLFLT vpwxmi, vpwxma, vpwymi, vpwyma;
01108 PLFLT vpwxmin, vpwxmax, vpwymin, vpwymax;
01109 PLFLT tn, temp, tcrit, tspace = 0.1;
01110 PLINT i;
01111
01112
01113
01114 lgx = plP_stsearch(xopt, 'g');
01115 lhx = plP_stsearch(xopt, 'h');
01116 llx = plP_stsearch(xopt, 'l');
01117
01118 lgy = plP_stsearch(yopt, 'g');
01119 lhy = plP_stsearch(yopt, 'h');
01120 lly = plP_stsearch(yopt, 'l');
01121
01122 plP_xgvpw(&vpwxmin, &vpwxmax, &vpwymin, &vpwymax);
01123
01124
01125 vpwxmi = (vpwxmax > vpwxmin) ? vpwxmin : vpwxmax;
01126 vpwxma = (vpwxmax > vpwxmin) ? vpwxmax : vpwxmin;
01127 vpwymi = (vpwymax > vpwymin) ? vpwymin : vpwymax;
01128 vpwyma = (vpwymax > vpwymin) ? vpwymax : vpwymin;
01129
01130
01131
01132 if (lgx) {
01133 for (tn = xtick1 * floor(vpwxmi/xtick1);
01134 tn <= vpwxma; tn += xtick1) {
01135 if (lhx) {
01136 if (llx) {
01137 PLFLT otemp = tn;
01138 for (i = 0; i <= 7; i++) {
01139 temp = tn + xlog[i];
01140 tcrit = (temp - otemp)*tspace;
01141 otemp = temp;
01142 if (BETW(temp, vpwxmi+tcrit, vpwxma-tcrit))
01143 pljoin(temp, vpwymi, temp, vpwyma);
01144 }
01145 }
01146 else {
01147 for (i = 1; i <= nxsub1 - 1; i++) {
01148 temp = tn + i * xtick1 / nxsub1;
01149 tcrit = xtick1 / nxsub1 * tspace;
01150 if (BETW(temp, vpwxmi+tcrit, vpwxma-tcrit))
01151 pljoin(temp, vpwymi, temp, vpwyma);
01152 }
01153 }
01154 }
01155 tcrit = xtick1*tspace;
01156 if (BETW(tn, vpwxmi+tcrit, vpwxma-tcrit))
01157 pljoin(tn, vpwymi, tn, vpwyma);
01158 }
01159 }
01160
01161
01162
01163 if (lgy) {
01164 tn = ytick1 * floor(vpwymi / ytick1 + tspace);
01165 for (tn = ytick1 * floor(vpwymi/ytick1);
01166 tn <= vpwyma; tn += ytick1) {
01167 if (lhy) {
01168 if (lly) {
01169 PLFLT otemp = tn;
01170 for (i = 0; i <= 7; i++) {
01171 temp = tn + xlog[i];
01172 tcrit = (temp - otemp)*tspace;
01173 otemp = temp;
01174 if (BETW(temp, vpwymi+tcrit, vpwyma-tcrit))
01175 pljoin(vpwxmi, temp, vpwxma, temp);
01176 }
01177 }
01178 else {
01179 for (i = 1; i <= nysub1 - 1; i++) {
01180 temp = tn + i * ytick1 / nysub1;
01181 tcrit = ytick1 / nysub1 * tspace;
01182 if (BETW(temp, vpwymi+tcrit, vpwyma-tcrit))
01183 pljoin(vpwxmi, temp, vpwxma, temp);
01184 }
01185 }
01186 }
01187 tcrit = ytick1*tspace;
01188 if (BETW(tn, vpwymi+tcrit, vpwyma-tcrit))
01189 pljoin(vpwxmi, tn, vpwxma, tn);
01190 }
01191 }
01192 }
01193
01194
01195
01196
01197
01198
01199
01200 static void
01201 label_box(const char *xopt, PLFLT xtick1, const char *yopt, PLFLT ytick1)
01202 {
01203 static char string[STRING_LEN];
01204 PLBOOL ldx, lfx, lix, llx, lmx, lnx, ltx, lox;
01205 PLBOOL ldy, lfy, liy, lly, lmy, lny, lty, lvy, loy;
01206 PLFLT vpwxmi, vpwxma, vpwymi, vpwyma;
01207 PLFLT vpwxmin, vpwxmax, vpwymin, vpwymax;
01208 PLFLT pos, tn, tp, offset, height, just;
01209 PLFLT factor, tstart;
01210 const char *timefmt;
01211
01212
01213
01214 ldx = plP_stsearch(xopt, 'd');
01215 lfx = plP_stsearch(xopt, 'f');
01216 lix = plP_stsearch(xopt, 'i');
01217 llx = plP_stsearch(xopt, 'l');
01218 lmx = plP_stsearch(xopt, 'm');
01219 lnx = plP_stsearch(xopt, 'n');
01220 ltx = plP_stsearch(xopt, 't');
01221 lox = plP_stsearch(xopt, 'o');
01222
01223 ldy = plP_stsearch(yopt, 'd');
01224 lfy = plP_stsearch(yopt, 'f');
01225 liy = plP_stsearch(yopt, 'i');
01226 lly = plP_stsearch(yopt, 'l');
01227 lmy = plP_stsearch(yopt, 'm');
01228 lny = plP_stsearch(yopt, 'n');
01229 lty = plP_stsearch(yopt, 't');
01230 lvy = plP_stsearch(yopt, 'v');
01231 loy = plP_stsearch(yopt, 'o');
01232
01233 plP_xgvpw(&vpwxmin, &vpwxmax, &vpwymin, &vpwymax);
01234
01235
01236 vpwxmi = (vpwxmax > vpwxmin) ? vpwxmin : vpwxmax;
01237 vpwxma = (vpwxmax > vpwxmin) ? vpwxmax : vpwxmin;
01238 vpwymi = (vpwymax > vpwymin) ? vpwymin : vpwymax;
01239 vpwyma = (vpwymax > vpwymin) ? vpwymax : vpwymin;
01240
01241
01242
01243 if ((lmx || lnx) && ltx) {
01244 PLINT xmode, xprec, xdigmax, xdigits, xscale;
01245
01246 plgxax(&xdigmax, &xdigits);
01247 pldprec(vpwxmi, vpwxma, xtick1, lfx, &xmode, &xprec, xdigmax, &xscale);
01248 timefmt = plP_gtimefmt();
01249
01250 if (ldx) {
01251 pldtfac(vpwxmi, vpwxma, &factor, &tstart);
01252 tp = xtick1 * (1. + floor((vpwxmi-tstart) / xtick1)) + tstart;
01253 }
01254 else
01255 tp = xtick1 * (1. + floor(vpwxmi / xtick1));
01256 for (tn = tp; BETW(tn, vpwxmi, vpwxma); tn += xtick1) {
01257 if (ldx) {
01258 strfqsas(string, STRING_LEN, timefmt, (double) tn, plsc->qsasconfig);
01259 }
01260 else {
01261 plform(PL_X_AXIS, tn, xscale, xprec, string, STRING_LEN, llx, lfx, lox);
01262 }
01263 height = lix ? 1.75 : 1.5;
01264 pos = (vpwxmax > vpwxmin)?
01265 (tn - vpwxmi) / (vpwxma - vpwxmi):
01266 (vpwxma - tn) / (vpwxma - vpwxmi);
01267 if (lnx)
01268 plmtex("b", height, pos, 0.5, string);
01269 if (lmx)
01270 plmtex("t", height, pos, 0.5, string);
01271 }
01272 xdigits = 2;
01273 plsxax(xdigmax, xdigits);
01274
01275
01276
01277 if (!llx && !ldx && !lox && xmode) {
01278
01279
01280 if (plsc->label_data) {
01281 height = ((PLLabelDefaults *)plsc->label_data)->exp_label_disp;
01282 pos = ((PLLabelDefaults *)plsc->label_data)->exp_label_pos;
01283 just = ((PLLabelDefaults *)plsc->label_data)->exp_label_just;
01284 }
01285 else {
01286 height = 3.2;
01287 pos = 1.0;
01288 just = 0.5;
01289 }
01290 snprintf(string, STRING_LEN, "(x10#u%d#d)", (int) xscale);
01291 if (lnx)
01292 plmtex("b", height, pos, just, string);
01293 if (lmx)
01294 plmtex("t", height, pos, just, string);
01295 }
01296 }
01297
01298
01299
01300 if ((lmy || lny) && lty) {
01301 PLINT ymode, yprec, ydigmax, ydigits, yscale;
01302
01303 plgyax(&ydigmax, &ydigits);
01304 pldprec(vpwymi, vpwyma, ytick1, lfy, &ymode, &yprec, ydigmax, &yscale);
01305
01306 ydigits = 0;
01307 if (ldy) {
01308 pldtfac(vpwymi, vpwyma, &factor, &tstart);
01309 tp = ytick1 * (1. + floor((vpwymi-tstart) / ytick1)) + tstart;
01310 }
01311 else
01312 tp = ytick1 * (1. + floor(vpwymi / ytick1));
01313 for (tn = tp; BETW(tn, vpwymi, vpwyma); tn += ytick1) {
01314 if (ldy) {
01315 strfqsas(string, STRING_LEN, timefmt, (double) tn, plsc->qsasconfig);
01316 }
01317 else {
01318 plform(PL_Y_AXIS, tn, yscale, yprec, string, STRING_LEN, lly, lfy, loy);
01319 }
01320 pos = (vpwymax > vpwymin)?
01321 (tn - vpwymi) / (vpwyma - vpwymi):
01322 (vpwyma - tn) / (vpwyma - vpwymi);
01323 if (lny) {
01324 if (lvy) {
01325 height = liy ? 1.0 : 0.5;
01326 plmtex("lv", height, pos, 1.0, string);
01327 } else {
01328 height = liy ? 1.75 : 1.5;
01329 plmtex("l", height, pos, 0.5, string);
01330 }
01331 }
01332 if (lmy) {
01333 if (lvy) {
01334 height = liy ? 1.0 : 0.5;
01335 plmtex("rv", height, pos, 0.0, string);
01336 } else {
01337 height = liy ? 1.75 : 1.5;
01338 plmtex("r", height, pos, 0.5, string);
01339 }
01340 }
01341 ydigits = MAX(ydigits, (PLINT) strlen(string));
01342 }
01343 if (!lvy)
01344 ydigits = 2;
01345
01346 plsyax(ydigmax, ydigits);
01347
01348
01349
01350 if (!lly && !ldy && !loy && ymode) {
01351 snprintf(string, STRING_LEN, "(x10#u%d#d)", (int) yscale);
01352 if (plsc->label_data) {
01353 height = ((PLLabelDefaults *)plsc->label_data)->exp_label_disp;
01354 pos = ((PLLabelDefaults *)plsc->label_data)->exp_label_pos;
01355 just = ((PLLabelDefaults *)plsc->label_data)->exp_label_just;
01356 }
01357 else {
01358 offset = 0.02;
01359 height = 2.0;
01360 if (lny) {
01361 pos = 0.0 - offset;
01362 just = 1.0;
01363 }
01364 if (lmy) {
01365 pos = 1.0 + offset;
01366 just = 0.0;
01367 }
01368 }
01369 plmtex("t", height, pos, just, string);
01370 }
01371 }
01372 }
01373
01374
01375
01376
01377
01378
01379
01380
01381
01382
01383
01384
01385
01386
01387
01388
01389
01390
01391
01392
01393
01394
01395
01396
01397
01398
01399
01400 static void
01401 plform(PLINT axis, PLFLT value, PLINT scale, PLINT prec, char *string, PLINT len, PLBOOL ll, PLBOOL lf, PLBOOL lo)
01402 {
01403
01404 if (lo && plsc->label_func) {
01405 (*plsc->label_func)(axis, value, string, len, plsc->label_data);
01406 }
01407 else {
01408 if (lo) {
01409 plwarn("Custom axis labels requested without a labeling function \
01410 - using default.");
01411 }
01412 if (ll) {
01413
01414
01415
01416 if (lf) {
01417
01418
01419
01420 int exponent = ROUND(value);
01421
01422 value = pow(10.0, exponent);
01423 if (exponent < 0) {
01424 char form[FORMAT_LEN];
01425 snprintf(form, FORMAT_LEN, "%%.%df", ABS(exponent));
01426 snprintf(string, len, form, value);
01427 }
01428 else {
01429 snprintf(string, len, "%d", (int) value);
01430 }
01431 }
01432 else {
01433
01434
01435
01436 snprintf(string, len, "10#u%d", (int) ROUND(value));
01437 }
01438 }
01439 else {
01440
01441
01442
01443 PLINT setpre, precis;
01444 char form[FORMAT_LEN], temp[TEMP_LEN];
01445 double scale2;
01446
01447 plP_gprec(&setpre, &precis);
01448
01449 if (setpre)
01450 prec = precis;
01451
01452 if (scale)
01453 value /= pow(10.,(double)scale);
01454
01455
01456
01457 scale2 = pow(10., prec);
01458 value = floor((value * scale2) + .5) / scale2;
01459
01460 snprintf(form, FORMAT_LEN, "%%.%df", (int) prec);
01461 snprintf(temp, TEMP_LEN, form, value);
01462 strncpy(string, temp, len-1);
01463 string[len-1] = '\0';
01464 }
01465 }
01466 }
01467
01468
01469
01470
01471
01472
01473
01474
01475
01476
01477
01478
01479
01480
01481
01482
01483
01484
01485
01486
01487
01488
01489
01490 void
01491 c_plslabelfunc(void (*label_func)(PLINT, PLFLT, char *, PLINT, PLPointer), PLPointer label_data)
01492 {
01493 plsc->label_func = label_func;
01494 plsc->label_data = label_data;
01495 }