00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "plplotP.h"
00025
00026 static void
00027 c_plenvi(PLFLT xmin, PLFLT xmax, PLFLT ymin, PLFLT ymax,
00028 PLINT just, PLINT axis, PLINT old);
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090 void
00091 c_plenv(PLFLT xmin, PLFLT xmax, PLFLT ymin, PLFLT ymax,
00092 PLINT just, PLINT axis)
00093 {
00094 c_plenvi(xmin, xmax, ymin, ymax, just, axis, 1);
00095 }
00096
00097
00098
00099
00100
00101
00102
00103
00104 void
00105 c_plenv0(PLFLT xmin, PLFLT xmax, PLFLT ymin, PLFLT ymax,
00106 PLINT just, PLINT axis)
00107 {
00108 c_plenvi(xmin, xmax, ymin, ymax, just, axis, 0);
00109 }
00110
00111
00112 static void
00113 c_plenvi(PLFLT xmin, PLFLT xmax, PLFLT ymin, PLFLT ymax,
00114 PLINT just, PLINT axis, PLINT old)
00115 {
00116 PLFLT lb, rb, tb, bb, dx, dy;
00117 PLFLT xsize, ysize, size, xscale, yscale, scale;
00118 PLFLT spxmin, spxmax, spymin, spymax;
00119 PLFLT vpxmin, vpxmax, vpymin, vpymax;
00120
00121 if (plsc->level < 1) {
00122 plabort("plenv: Please call plinit first");
00123 return;
00124 }
00125 if (xmin == xmax) {
00126 plabort("plenv: Invalid xmin and xmax arguments");
00127 return;
00128 }
00129 if (ymin == ymax) {
00130 plabort("plenv: Invalid ymin and ymax arguments");
00131 return;
00132 }
00133 if (just < -1 || just > 2) {
00134 plabort("plenv: Invalid just option");
00135 return;
00136 }
00137
00138 if (plsc->nsubx * plsc->nsuby == 1)
00139 old = 1;
00140
00141 if (old == 1)
00142 pladv(0);
00143 else
00144 plclear();
00145
00146 if (just == 0)
00147 plvsta();
00148 else if (just == 1){
00149 lb = 8.0 * plsc->chrht;
00150 rb = 5.0 * plsc->chrht;
00151 tb = 5.0 * plsc->chrht;
00152 bb = 5.0 * plsc->chrht;
00153 dx = ABS(xmax - xmin);
00154 dy = ABS(ymax - ymin);
00155 plgspa(&spxmin, &spxmax, &spymin, &spymax);
00156 xsize = spxmax - spxmin;
00157 ysize = spymax - spymin;
00158 xscale = dx / (xsize - lb - rb);
00159 yscale = dy / (ysize - tb - bb);
00160 scale = MAX(xscale, yscale);
00161 vpxmin = MAX(lb, 0.5 * (xsize - dx / scale));
00162 vpxmax = vpxmin + (dx / scale);
00163 vpymin = MAX(bb, 0.5 * (ysize - dy / scale));
00164 vpymax = vpymin + (dy / scale);
00165 plsvpa(vpxmin, vpxmax, vpymin, vpymax);
00166 } else if(just == 2) {
00167 lb = 8.0 * plsc->chrht;
00168 rb = 5.0 * plsc->chrht;
00169 tb = 5.0 * plsc->chrht;
00170 bb = 5.0 * plsc->chrht;
00171 plgspa(&spxmin, &spxmax, &spymin, &spymax);
00172 xsize = spxmax - spxmin;
00173 ysize = spymax - spymin;
00174 size = MIN(xsize-lb-rb, ysize-tb-bb);
00175 dx = (xsize-size-lb-rb)/2;
00176 vpxmin = lb + dx;
00177 vpxmax = vpxmin + size;
00178 dy = (ysize-size-bb-tb)/2;
00179 vpymin = bb + dy;
00180 vpymax = vpymin + size;
00181 plsvpa(vpxmin, vpxmax, vpymin, vpymax);
00182 }
00183
00184 plwind(xmin, xmax, ymin, ymax);
00185
00186 switch (axis) {
00187 case -2:
00188 break;
00189 case -1:
00190 plbox("bc", (PLFLT) 0.0, 0, "bc", (PLFLT) 0.0, 0);
00191 break;
00192 case 0:
00193 plbox("bcnst", (PLFLT) 0.0, 0, "bcnstv", (PLFLT) 0.0, 0);
00194 break;
00195 case 1:
00196 plbox("abcnst", (PLFLT) 0.0, 0, "abcnstv", (PLFLT) 0.0, 0);
00197 break;
00198 case 2:
00199 plbox("abcgnst", (PLFLT) 0.0, 0, "abcgnstv", (PLFLT) 0.0, 0);
00200 break;
00201 case 3:
00202 plbox("abcgnsth", (PLFLT) 0.0, 0, "abcgnstvh", (PLFLT) 0.0, 0);
00203 break;
00204 case 10:
00205 plbox("bclnst", (PLFLT) 0.0, 0, "bcnstv", (PLFLT) 0.0, 0);
00206 break;
00207 case 11:
00208 plbox("abclnst", (PLFLT) 0.0, 0, "abcnstv", (PLFLT) 0.0, 0);
00209 break;
00210 case 12:
00211 plbox("abcglnst", (PLFLT) 0.0, 0, "abcgnstv", (PLFLT) 0.0, 0);
00212 break;
00213 case 13:
00214 plbox("abcglnsth", (PLFLT) 0.0, 0, "abcgnstvh", (PLFLT) 0.0, 0);
00215 break;
00216 case 20:
00217 plbox("bcnst", (PLFLT) 0.0, 0, "bclnstv", (PLFLT) 0.0, 0);
00218 break;
00219 case 21:
00220 plbox("abcnst", (PLFLT) 0.0, 0, "abclnstv", (PLFLT) 0.0, 0);
00221 break;
00222 case 22:
00223 plbox("abcgnst", (PLFLT) 0.0, 0, "abcglnstv", (PLFLT) 0.0, 0);
00224 break;
00225 case 23:
00226 plbox("abcgnsth", (PLFLT) 0.0, 0, "abcglnstvh", (PLFLT) 0.0, 0);
00227 break;
00228 case 30:
00229 plbox("bclnst", (PLFLT) 0.0, 0, "bclnstv", (PLFLT) 0.0, 0);
00230 break;
00231 case 31:
00232 plbox("abclnst", (PLFLT) 0.0, 0, "abclnstv", (PLFLT) 0.0, 0);
00233 break;
00234 case 32:
00235 plbox("abcglnst", (PLFLT) 0.0, 0, "abcglnstv", (PLFLT) 0.0, 0);
00236 break;
00237 case 33:
00238 plbox("abcglnsth", (PLFLT) 0.0, 0, "abcglnstvh", (PLFLT) 0.0, 0);
00239 break;
00240 case 40:
00241 plbox("bcdnst", (PLFLT) 0.0, 0, "bcnstv", (PLFLT) 0.0, 0);
00242 break;
00243 case 41:
00244 plbox("abcdnst", (PLFLT) 0.0, 0, "abcnstv", (PLFLT) 0.0, 0);
00245 break;
00246 case 42:
00247 plbox("abcgdnst", (PLFLT) 0.0, 0, "abcgnstv", (PLFLT) 0.0, 0);
00248 break;
00249 case 43:
00250 plbox("abcgdnsth", (PLFLT) 0.0, 0, "abcgnstvh", (PLFLT) 0.0, 0);
00251 break;
00252 case 50:
00253 plbox("bcnst", (PLFLT) 0.0, 0, "bcdnstv", (PLFLT) 0.0, 0);
00254 break;
00255 case 51:
00256 plbox("abcnst", (PLFLT) 0.0, 0, "abcdnstv", (PLFLT) 0.0, 0);
00257 break;
00258 case 52:
00259 plbox("abcgnst", (PLFLT) 0.0, 0, "abcgdnstv", (PLFLT) 0.0, 0);
00260 break;
00261 case 53:
00262 plbox("abcgnsth", (PLFLT) 0.0, 0, "abcgdnstvh", (PLFLT) 0.0, 0);
00263 break;
00264 case 60:
00265 plbox("bcdnst", (PLFLT) 0.0, 0, "bcdnstv", (PLFLT) 0.0, 0);
00266 break;
00267 case 61:
00268 plbox("abcdnst", (PLFLT) 0.0, 0, "abcdnstv", (PLFLT) 0.0, 0);
00269 break;
00270 case 62:
00271 plbox("abcgdnst", (PLFLT) 0.0, 0, "abcgdnstv", (PLFLT) 0.0, 0);
00272 break;
00273 case 63:
00274 plbox("abcgdnsth", (PLFLT) 0.0, 0, "abcgdnstvh", (PLFLT) 0.0, 0);
00275 break;
00276 case 70:
00277 plbox("bcnost", (PLFLT) 0.0, 0, "bcnostv", (PLFLT) 0.0, 0);
00278 break;
00279 case 71:
00280 plbox("abcnost", (PLFLT) 0.0, 0, "abcnostv", (PLFLT) 0.0, 0);
00281 break;
00282 case 72:
00283 plbox("abcgnost", (PLFLT) 0.0, 0, "abcgnostv", (PLFLT) 0.0, 0);
00284 break;
00285 case 73:
00286 plbox("abcgnosth", (PLFLT) 0.0, 0, "abcgnostvh", (PLFLT) 0.0, 0);
00287 break;
00288 default:
00289 plwarn("plenv: Invalid axis argument");
00290 }
00291 }
00292
00293
00294
00295
00296
00297
00298
00299
00300 void
00301 c_plvsta(void)
00302 {
00303 PLFLT xmin, xmax, ymin, ymax;
00304 PLFLT lb, rb, tb, bb;
00305
00306 if (plsc->level < 1) {
00307 plabort("plvsta: Please call plinit first");
00308 return;
00309 }
00310
00311
00312
00313
00314
00315 lb = 8.0 * plsc->chrht;
00316 rb = 5.0 * plsc->chrht;
00317 tb = 5.0 * plsc->chrht;
00318 bb = 5.0 * plsc->chrht;
00319
00320 xmin = plP_dcscx(plP_mmdcx((PLFLT) (plP_dcmmx(plsc->spdxmi) + lb)));
00321 xmax = plP_dcscx(plP_mmdcx((PLFLT) (plP_dcmmx(plsc->spdxma) - rb)));
00322 ymin = plP_dcscy(plP_mmdcy((PLFLT) (plP_dcmmy(plsc->spdymi) + tb)));
00323 ymax = plP_dcscy(plP_mmdcy((PLFLT) (plP_dcmmy(plsc->spdyma) - bb)));
00324
00325 plvpor(xmin, xmax, ymin, ymax);
00326 }
00327
00328
00329
00330
00331
00332
00333
00334 void
00335 c_plvpor(PLFLT xmin, PLFLT xmax, PLFLT ymin, PLFLT ymax)
00336 {
00337 if (plsc->level < 1) {
00338 plabort("plvpor: Please call plinit first");
00339 return;
00340 }
00341 if ((xmin >= xmax) || (ymin >= ymax)) {
00342 plabort("plvpor: Invalid limits");
00343 return;
00344 }
00345 if ((plsc->cursub <= 0) || (plsc->cursub > (plsc->nsubx * plsc->nsuby))) {
00346 plabort("plvpor: Please call pladv or plenv to go to a subpage");
00347 return;
00348 }
00349
00350 plsc->vpdxmi = plsc->spdxmi + (plsc->spdxma - plsc->spdxmi) * xmin;
00351 plsc->vpdxma = plsc->spdxmi + (plsc->spdxma - plsc->spdxmi) * xmax;
00352 plsc->vpdymi = plsc->spdymi + (plsc->spdyma - plsc->spdymi) * ymin;
00353 plsc->vpdyma = plsc->spdymi + (plsc->spdyma - plsc->spdymi) * ymax;
00354
00355 plsc->vppxmi = plP_dcpcx(plsc->vpdxmi);
00356 plsc->vppxma = plP_dcpcx(plsc->vpdxma);
00357 plsc->vppymi = plP_dcpcy(plsc->vpdymi);
00358 plsc->vppyma = plP_dcpcy(plsc->vpdyma);
00359
00360 plsc->clpxmi = MAX(plsc->vppxmi, plsc->phyxmi);
00361 plsc->clpxma = MIN(plsc->vppxma, plsc->phyxma);
00362 plsc->clpymi = MAX(plsc->vppymi, plsc->phyymi);
00363 plsc->clpyma = MIN(plsc->vppyma, plsc->phyyma);
00364
00365 plsc->level = 2;
00366 }
00367
00368
00369
00370
00371
00372
00373
00374
00375 void
00376 c_plvpas(PLFLT xmin, PLFLT xmax, PLFLT ymin, PLFLT ymax, PLFLT aspect)
00377 {
00378 PLFLT vpxmi, vpxma, vpymi, vpyma;
00379 PLFLT vpxmid, vpymid, vpxlen, vpylen, w_aspect, ratio;
00380
00381 if (plsc->level < 1) {
00382 plabort("plvpas: Please call plinit first");
00383 return;
00384 }
00385 if ((xmin >= xmax) || (ymin >= ymax)) {
00386 plabort("plvpas: Invalid limits");
00387 return;
00388 }
00389
00390 if (aspect <= 0.0) {
00391 c_plvpor(xmin, xmax, ymin, ymax);
00392 return;
00393 }
00394
00395 vpxmi = plP_dcmmx(xmin);
00396 vpxma = plP_dcmmx(xmax);
00397 vpymi = plP_dcmmy(ymin);
00398 vpyma = plP_dcmmy(ymax);
00399
00400 vpxmid = (vpxmi + vpxma) / 2.;
00401 vpymid = (vpymi + vpyma) / 2.;
00402
00403 vpxlen = vpxma - vpxmi;
00404 vpylen = vpyma - vpymi;
00405
00406 w_aspect = vpylen / vpxlen;
00407 ratio = aspect / w_aspect;
00408
00409
00410
00411
00412
00413
00414
00415 if (ratio <= 0.) {
00416 plabort("plvpas: Error in aspect ratio setting");
00417 return;
00418 }
00419 else if (ratio < 1.)
00420 vpylen = vpylen * ratio;
00421 else
00422 vpxlen = vpxlen / ratio;
00423
00424 vpxmi = vpxmid - vpxlen / 2.;
00425 vpxma = vpxmid + vpxlen / 2.;
00426 vpymi = vpymid - vpylen / 2.;
00427 vpyma = vpymid + vpylen / 2.;
00428
00429 plsvpa(vpxmi, vpxma, vpymi, vpyma);
00430 }
00431
00432
00433
00434
00435
00436
00437
00438
00439 void
00440 c_plvasp(PLFLT aspect)
00441 {
00442 PLFLT spxmin, spxmax, spymin, spymax;
00443 PLFLT vpxmin, vpxmax, vpymin, vpymax;
00444 PLFLT xsize, ysize, nxsize, nysize;
00445 PLFLT lb, rb, tb, bb;
00446
00447 if (plsc->level < 1) {
00448 plabort("plvasp: Please call plinit first");
00449 return;
00450 }
00451
00452 lb = 8.0 * plsc->chrht;
00453 rb = 5.0 * plsc->chrht;
00454 tb = 5.0 * plsc->chrht;
00455 bb = 5.0 * plsc->chrht;
00456
00457 plgspa(&spxmin, &spxmax, &spymin, &spymax);
00458 xsize = spxmax - spxmin;
00459 ysize = spymax - spymin;
00460 xsize -= lb + rb;
00461 ysize -= bb + tb;
00462 if (aspect * xsize > ysize) {
00463 nxsize = ysize / aspect;
00464 nysize = ysize;
00465 }
00466 else {
00467 nxsize = xsize;
00468 nysize = xsize * aspect;
00469 }
00470
00471
00472
00473 vpxmin = .5 * (xsize - nxsize) + lb;
00474 vpxmax = vpxmin + nxsize;
00475 vpymin = .5 * (ysize - nysize) + bb;
00476 vpymax = vpymin + nysize;
00477
00478 plsvpa(vpxmin, vpxmax, vpymin, vpymax);
00479 }
00480
00481
00482
00483
00484
00485
00486
00487
00488 void
00489 c_plsvpa(PLFLT xmin, PLFLT xmax, PLFLT ymin, PLFLT ymax)
00490 {
00491 PLFLT sxmin, symin;
00492
00493 if (plsc->level < 1) {
00494 plabort("plsvpa: Please call plinit first");
00495 return;
00496 }
00497 if ((xmin >= xmax) || (ymin >= ymax)) {
00498 plabort("plsvpa: Invalid limits");
00499 return;
00500 }
00501 if ((plsc->cursub <= 0) || (plsc->cursub > (plsc->nsubx * plsc->nsuby))) {
00502 plabort("plsvpa: Please call pladv or plenv to go to a subpage");
00503 return;
00504 }
00505
00506 sxmin = plP_dcmmx(plsc->spdxmi);
00507 symin = plP_dcmmy(plsc->spdymi);
00508
00509 plsc->vpdxmi = plP_mmdcx((PLFLT) (sxmin + xmin));
00510 plsc->vpdxma = plP_mmdcx((PLFLT) (sxmin + xmax));
00511 plsc->vpdymi = plP_mmdcy((PLFLT) (symin + ymin));
00512 plsc->vpdyma = plP_mmdcy((PLFLT) (symin + ymax));
00513
00514 plsc->vppxmi = plP_dcpcx(plsc->vpdxmi);
00515 plsc->vppxma = plP_dcpcx(plsc->vpdxma);
00516 plsc->vppymi = plP_dcpcy(plsc->vpdymi);
00517 plsc->vppyma = plP_dcpcy(plsc->vpdyma);
00518
00519 plsc->clpxmi = plP_dcpcx(plsc->vpdxmi);
00520 plsc->clpxma = plP_dcpcx(plsc->vpdxma);
00521 plsc->clpymi = plP_dcpcy(plsc->vpdymi);
00522 plsc->clpyma = plP_dcpcy(plsc->vpdyma);
00523
00524 plsc->level = 2;
00525 }