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 {
00123 plabort( "plenv: Please call plinit first" );
00124 return;
00125 }
00126 if ( xmin == xmax )
00127 {
00128 plabort( "plenv: Invalid xmin and xmax arguments" );
00129 return;
00130 }
00131 if ( ymin == ymax )
00132 {
00133 plabort( "plenv: Invalid ymin and ymax arguments" );
00134 return;
00135 }
00136 if ( just < -1 || just > 2 )
00137 {
00138 plabort( "plenv: Invalid just option" );
00139 return;
00140 }
00141
00142 if ( plsc->nsubx * plsc->nsuby == 1 )
00143 old = 1;
00144
00145 if ( old == 1 )
00146 pladv( 0 );
00147 else
00148 plclear();
00149
00150 if ( just == 0 )
00151 plvsta();
00152 else if ( just == 1 )
00153 {
00154 lb = 8.0 * plsc->chrht;
00155 rb = 5.0 * plsc->chrht;
00156 tb = 5.0 * plsc->chrht;
00157 bb = 5.0 * plsc->chrht;
00158 dx = ABS( xmax - xmin );
00159 dy = ABS( ymax - ymin );
00160 plgspa( &spxmin, &spxmax, &spymin, &spymax );
00161 xsize = spxmax - spxmin;
00162 ysize = spymax - spymin;
00163 xscale = dx / ( xsize - lb - rb );
00164 yscale = dy / ( ysize - tb - bb );
00165 scale = MAX( xscale, yscale );
00166 vpxmin = MAX( lb, 0.5 * ( xsize - dx / scale ) );
00167 vpxmax = vpxmin + ( dx / scale );
00168 vpymin = MAX( bb, 0.5 * ( ysize - dy / scale ) );
00169 vpymax = vpymin + ( dy / scale );
00170 plsvpa( vpxmin, vpxmax, vpymin, vpymax );
00171 }
00172 else if ( just == 2 )
00173 {
00174 lb = 8.0 * plsc->chrht;
00175 rb = 5.0 * plsc->chrht;
00176 tb = 5.0 * plsc->chrht;
00177 bb = 5.0 * plsc->chrht;
00178 plgspa( &spxmin, &spxmax, &spymin, &spymax );
00179 xsize = spxmax - spxmin;
00180 ysize = spymax - spymin;
00181 size = MIN( xsize - lb - rb, ysize - tb - bb );
00182 dx = ( xsize - size - lb - rb ) / 2;
00183 vpxmin = lb + dx;
00184 vpxmax = vpxmin + size;
00185 dy = ( ysize - size - bb - tb ) / 2;
00186 vpymin = bb + dy;
00187 vpymax = vpymin + size;
00188 plsvpa( vpxmin, vpxmax, vpymin, vpymax );
00189 }
00190
00191 plwind( xmin, xmax, ymin, ymax );
00192
00193 switch ( axis )
00194 {
00195 case -2:
00196 break;
00197 case -1:
00198 plbox( "bc", (PLFLT) 0.0, 0, "bc", (PLFLT) 0.0, 0 );
00199 break;
00200 case 0:
00201 plbox( "bcnst", (PLFLT) 0.0, 0, "bcnstv", (PLFLT) 0.0, 0 );
00202 break;
00203 case 1:
00204 plbox( "abcnst", (PLFLT) 0.0, 0, "abcnstv", (PLFLT) 0.0, 0 );
00205 break;
00206 case 2:
00207 plbox( "abcgnst", (PLFLT) 0.0, 0, "abcgnstv", (PLFLT) 0.0, 0 );
00208 break;
00209 case 3:
00210 plbox( "abcgnsth", (PLFLT) 0.0, 0, "abcgnstvh", (PLFLT) 0.0, 0 );
00211 break;
00212 case 10:
00213 plbox( "bclnst", (PLFLT) 0.0, 0, "bcnstv", (PLFLT) 0.0, 0 );
00214 break;
00215 case 11:
00216 plbox( "abclnst", (PLFLT) 0.0, 0, "abcnstv", (PLFLT) 0.0, 0 );
00217 break;
00218 case 12:
00219 plbox( "abcglnst", (PLFLT) 0.0, 0, "abcgnstv", (PLFLT) 0.0, 0 );
00220 break;
00221 case 13:
00222 plbox( "abcglnsth", (PLFLT) 0.0, 0, "abcgnstvh", (PLFLT) 0.0, 0 );
00223 break;
00224 case 20:
00225 plbox( "bcnst", (PLFLT) 0.0, 0, "bclnstv", (PLFLT) 0.0, 0 );
00226 break;
00227 case 21:
00228 plbox( "abcnst", (PLFLT) 0.0, 0, "abclnstv", (PLFLT) 0.0, 0 );
00229 break;
00230 case 22:
00231 plbox( "abcgnst", (PLFLT) 0.0, 0, "abcglnstv", (PLFLT) 0.0, 0 );
00232 break;
00233 case 23:
00234 plbox( "abcgnsth", (PLFLT) 0.0, 0, "abcglnstvh", (PLFLT) 0.0, 0 );
00235 break;
00236 case 30:
00237 plbox( "bclnst", (PLFLT) 0.0, 0, "bclnstv", (PLFLT) 0.0, 0 );
00238 break;
00239 case 31:
00240 plbox( "abclnst", (PLFLT) 0.0, 0, "abclnstv", (PLFLT) 0.0, 0 );
00241 break;
00242 case 32:
00243 plbox( "abcglnst", (PLFLT) 0.0, 0, "abcglnstv", (PLFLT) 0.0, 0 );
00244 break;
00245 case 33:
00246 plbox( "abcglnsth", (PLFLT) 0.0, 0, "abcglnstvh", (PLFLT) 0.0, 0 );
00247 break;
00248 case 40:
00249 plbox( "bcdnst", (PLFLT) 0.0, 0, "bcnstv", (PLFLT) 0.0, 0 );
00250 break;
00251 case 41:
00252 plbox( "abcdnst", (PLFLT) 0.0, 0, "abcnstv", (PLFLT) 0.0, 0 );
00253 break;
00254 case 42:
00255 plbox( "abcgdnst", (PLFLT) 0.0, 0, "abcgnstv", (PLFLT) 0.0, 0 );
00256 break;
00257 case 43:
00258 plbox( "abcgdnsth", (PLFLT) 0.0, 0, "abcgnstvh", (PLFLT) 0.0, 0 );
00259 break;
00260 case 50:
00261 plbox( "bcnst", (PLFLT) 0.0, 0, "bcdnstv", (PLFLT) 0.0, 0 );
00262 break;
00263 case 51:
00264 plbox( "abcnst", (PLFLT) 0.0, 0, "abcdnstv", (PLFLT) 0.0, 0 );
00265 break;
00266 case 52:
00267 plbox( "abcgnst", (PLFLT) 0.0, 0, "abcgdnstv", (PLFLT) 0.0, 0 );
00268 break;
00269 case 53:
00270 plbox( "abcgnsth", (PLFLT) 0.0, 0, "abcgdnstvh", (PLFLT) 0.0, 0 );
00271 break;
00272 case 60:
00273 plbox( "bcdnst", (PLFLT) 0.0, 0, "bcdnstv", (PLFLT) 0.0, 0 );
00274 break;
00275 case 61:
00276 plbox( "abcdnst", (PLFLT) 0.0, 0, "abcdnstv", (PLFLT) 0.0, 0 );
00277 break;
00278 case 62:
00279 plbox( "abcgdnst", (PLFLT) 0.0, 0, "abcgdnstv", (PLFLT) 0.0, 0 );
00280 break;
00281 case 63:
00282 plbox( "abcgdnsth", (PLFLT) 0.0, 0, "abcgdnstvh", (PLFLT) 0.0, 0 );
00283 break;
00284 case 70:
00285 plbox( "bcnost", (PLFLT) 0.0, 0, "bcnostv", (PLFLT) 0.0, 0 );
00286 break;
00287 case 71:
00288 plbox( "abcnost", (PLFLT) 0.0, 0, "abcnostv", (PLFLT) 0.0, 0 );
00289 break;
00290 case 72:
00291 plbox( "abcgnost", (PLFLT) 0.0, 0, "abcgnostv", (PLFLT) 0.0, 0 );
00292 break;
00293 case 73:
00294 plbox( "abcgnosth", (PLFLT) 0.0, 0, "abcgnostvh", (PLFLT) 0.0, 0 );
00295 break;
00296 default:
00297 plwarn( "plenv: Invalid axis argument" );
00298 }
00299 }
00300
00301
00302
00303
00304
00305
00306
00307
00308 void
00309 c_plvsta( void )
00310 {
00311 PLFLT xmin, xmax, ymin, ymax;
00312 PLFLT lb, rb, tb, bb;
00313
00314 if ( plsc->level < 1 )
00315 {
00316 plabort( "plvsta: Please call plinit first" );
00317 return;
00318 }
00319
00320
00321
00322
00323
00324 lb = 8.0 * plsc->chrht;
00325 rb = 5.0 * plsc->chrht;
00326 tb = 5.0 * plsc->chrht;
00327 bb = 5.0 * plsc->chrht;
00328
00329 xmin = plP_dcscx( plP_mmdcx( (PLFLT) ( plP_dcmmx( plsc->spdxmi ) + lb ) ) );
00330 xmax = plP_dcscx( plP_mmdcx( (PLFLT) ( plP_dcmmx( plsc->spdxma ) - rb ) ) );
00331 ymin = plP_dcscy( plP_mmdcy( (PLFLT) ( plP_dcmmy( plsc->spdymi ) + tb ) ) );
00332 ymax = plP_dcscy( plP_mmdcy( (PLFLT) ( plP_dcmmy( plsc->spdyma ) - bb ) ) );
00333
00334 plvpor( xmin, xmax, ymin, ymax );
00335 }
00336
00337
00338
00339
00340
00341
00342
00343 void
00344 c_plvpor( PLFLT xmin, PLFLT xmax, PLFLT ymin, PLFLT ymax )
00345 {
00346 if ( plsc->level < 1 )
00347 {
00348 plabort( "plvpor: Please call plinit first" );
00349 return;
00350 }
00351 if ( ( xmin >= xmax ) || ( ymin >= ymax ) )
00352 {
00353 plabort( "plvpor: Invalid limits" );
00354 return;
00355 }
00356 if ( ( plsc->cursub <= 0 ) || ( plsc->cursub > ( plsc->nsubx * plsc->nsuby ) ) )
00357 {
00358 plabort( "plvpor: Please call pladv or plenv to go to a subpage" );
00359 return;
00360 }
00361
00362 plsc->vpdxmi = plsc->spdxmi + ( plsc->spdxma - plsc->spdxmi ) * xmin;
00363 plsc->vpdxma = plsc->spdxmi + ( plsc->spdxma - plsc->spdxmi ) * xmax;
00364 plsc->vpdymi = plsc->spdymi + ( plsc->spdyma - plsc->spdymi ) * ymin;
00365 plsc->vpdyma = plsc->spdymi + ( plsc->spdyma - plsc->spdymi ) * ymax;
00366
00367 plsc->vppxmi = plP_dcpcx( plsc->vpdxmi );
00368 plsc->vppxma = plP_dcpcx( plsc->vpdxma );
00369 plsc->vppymi = plP_dcpcy( plsc->vpdymi );
00370 plsc->vppyma = plP_dcpcy( plsc->vpdyma );
00371
00372 plsc->clpxmi = MAX( plsc->vppxmi, plsc->phyxmi );
00373 plsc->clpxma = MIN( plsc->vppxma, plsc->phyxma );
00374 plsc->clpymi = MAX( plsc->vppymi, plsc->phyymi );
00375 plsc->clpyma = MIN( plsc->vppyma, plsc->phyyma );
00376
00377 plsc->level = 2;
00378 }
00379
00380
00381
00382
00383
00384
00385
00386
00387 void
00388 c_plvpas( PLFLT xmin, PLFLT xmax, PLFLT ymin, PLFLT ymax, PLFLT aspect )
00389 {
00390 PLFLT spxmin, spxmax, spymin, spymax;
00391 PLFLT vpxmin, vpxmax, vpymin, vpymax;
00392 PLFLT spxmid, spymid, xsize, ysize, nxsize, nysize, w_aspect, ratio;
00393 PLFLT xoffset, yoffset;
00394
00395 if ( plsc->level < 1 )
00396 {
00397 plabort( "plvpas: Please call plinit first" );
00398 return;
00399 }
00400 if ( ( xmin >= xmax ) || ( ymin >= ymax ) )
00401 {
00402 plabort( "plvpas: Invalid limits" );
00403 return;
00404 }
00405
00406 if ( aspect <= 0.0 )
00407 {
00408 c_plvpor( xmin, xmax, ymin, ymax );
00409 return;
00410 }
00411
00412 plgspa( &spxmin, &spxmax, &spymin, &spymax );
00413
00414 xsize = spxmax - spxmin;
00415 ysize = spymax - spymin;
00416
00417 xoffset = xsize * xmin;
00418 yoffset = ysize * ymin;
00419
00420 spxmax = spxmin + xsize * xmax;
00421 spxmin = spxmin + xsize * xmin;
00422 spymax = spymin + ysize * ymax;
00423 spymin = spymin + ysize * ymin;
00424
00425
00426 xsize = spxmax - spxmin;
00427 ysize = spymax - spymin;
00428
00429 if ( aspect * xsize > ysize )
00430 {
00431 nxsize = ysize / aspect;
00432 nysize = ysize;
00433 }
00434 else
00435 {
00436 nxsize = xsize;
00437 nysize = xsize * aspect;
00438 }
00439
00440
00441
00442 vpxmin = 0.5 * ( xsize - nxsize ) + xoffset;
00443 vpxmax = vpxmin + nxsize;
00444 vpymin = 0.5 * ( ysize - nysize ) + yoffset;
00445 vpymax = vpymin + nysize;
00446
00447 plsvpa( vpxmin, vpxmax, vpymin, vpymax );
00448 }
00449
00450
00451
00452
00453
00454
00455
00456
00457 void
00458 c_plvasp( PLFLT aspect )
00459 {
00460 PLFLT spxmin, spxmax, spymin, spymax;
00461 PLFLT vpxmin, vpxmax, vpymin, vpymax;
00462 PLFLT xsize, ysize, nxsize, nysize;
00463 PLFLT lb, rb, tb, bb;
00464
00465 if ( plsc->level < 1 )
00466 {
00467 plabort( "plvasp: Please call plinit first" );
00468 return;
00469 }
00470
00471 lb = 8.0 * plsc->chrht;
00472 rb = 5.0 * plsc->chrht;
00473 tb = 5.0 * plsc->chrht;
00474 bb = 5.0 * plsc->chrht;
00475
00476 plgspa( &spxmin, &spxmax, &spymin, &spymax );
00477 xsize = spxmax - spxmin;
00478 ysize = spymax - spymin;
00479 xsize -= lb + rb;
00480 ysize -= bb + tb;
00481 if ( aspect * xsize > ysize )
00482 {
00483 nxsize = ysize / aspect;
00484 nysize = ysize;
00485 }
00486 else
00487 {
00488 nxsize = xsize;
00489 nysize = xsize * aspect;
00490 }
00491
00492
00493
00494 vpxmin = .5 * ( xsize - nxsize ) + lb;
00495 vpxmax = vpxmin + nxsize;
00496 vpymin = .5 * ( ysize - nysize ) + bb;
00497 vpymax = vpymin + nysize;
00498
00499 plsvpa( vpxmin, vpxmax, vpymin, vpymax );
00500 }
00501
00502
00503
00504
00505
00506
00507
00508
00509 void
00510 c_plsvpa( PLFLT xmin, PLFLT xmax, PLFLT ymin, PLFLT ymax )
00511 {
00512 PLFLT sxmin, symin;
00513
00514 if ( plsc->level < 1 )
00515 {
00516 plabort( "plsvpa: Please call plinit first" );
00517 return;
00518 }
00519 if ( ( xmin >= xmax ) || ( ymin >= ymax ) )
00520 {
00521 plabort( "plsvpa: Invalid limits" );
00522 return;
00523 }
00524 if ( ( plsc->cursub <= 0 ) || ( plsc->cursub > ( plsc->nsubx * plsc->nsuby ) ) )
00525 {
00526 plabort( "plsvpa: Please call pladv or plenv to go to a subpage" );
00527 return;
00528 }
00529
00530 sxmin = plP_dcmmx( plsc->spdxmi );
00531 symin = plP_dcmmy( plsc->spdymi );
00532
00533 plsc->vpdxmi = plP_mmdcx( (PLFLT) ( sxmin + xmin ) );
00534 plsc->vpdxma = plP_mmdcx( (PLFLT) ( sxmin + xmax ) );
00535 plsc->vpdymi = plP_mmdcy( (PLFLT) ( symin + ymin ) );
00536 plsc->vpdyma = plP_mmdcy( (PLFLT) ( symin + ymax ) );
00537
00538 plsc->vppxmi = plP_dcpcx( plsc->vpdxmi );
00539 plsc->vppxma = plP_dcpcx( plsc->vpdxma );
00540 plsc->vppymi = plP_dcpcy( plsc->vpdymi );
00541 plsc->vppyma = plP_dcpcy( plsc->vpdyma );
00542
00543 plsc->clpxmi = plP_dcpcx( plsc->vpdxmi );
00544 plsc->clpxma = plP_dcpcx( plsc->vpdxma );
00545 plsc->clpymi = plP_dcpcy( plsc->vpdymi );
00546 plsc->clpyma = plP_dcpcy( plsc->vpdyma );
00547
00548 plsc->level = 2;
00549 }