void c_plvpas(PLFLT xmin, PLFLT xmax, PLFLT ymin, PLFLT ymax, PLFLT aspect) { PLFLT vpxmi, vpxma, vpymi, vpyma; PLFLT vpxmid, vpymid, vpxlen, vpylen, w_aspect, ratio; if (plsc->level < 1) { plabort("plvpas: Please call plinit first"); return; } if ((xmin >= xmax) || (ymin >= ymax)) { plabort("plvpas: Invalid limits"); return; } if (aspect <= 0.0) { c_plvpor(xmin, xmax, ymin, ymax); return; } vpxmi = plP_dcmmx(xmin); vpxma = plP_dcmmx(xmax); vpymi = plP_dcmmy(ymin); vpyma = plP_dcmmy(ymax); vpxmid = (vpxmi + vpxma) / 2.; vpymid = (vpymi + vpyma) / 2.; vpxlen = vpxma - vpxmi; vpylen = vpyma - vpymi; w_aspect = vpylen / vpxlen; ratio = aspect / w_aspect; /* * If ratio < 1, you are requesting an aspect ratio (y/x) less than the natural * aspect ratio of the specified window, and you will need to reduce the length * in y correspondingly. Similarly, for ratio > 1, x length must be reduced. */ if (ratio <= 0.) { plabort("plvpas: Error in aspect ratio setting"); return; } else if (ratio < 1.) vpylen = vpylen * ratio; else vpxlen = vpxlen / ratio; vpxmi = vpxmid - vpxlen / 2.; vpxma = vpxmid + vpxlen / 2.; vpymi = vpymid - vpylen / 2.; vpyma = vpymid + vpylen / 2.; plsvpa(vpxmi, vpxma, vpymi, vpyma); }
void c_plvasp(PLFLT aspect) { PLFLT spxmin, spxmax, spymin, spymax; PLFLT vpxmin, vpxmax, vpymin, vpymax; PLFLT xsize, ysize, nxsize, nysize; PLFLT lb, rb, tb, bb; if (plsc->level < 1) { plabort("plvasp: Please call plinit first"); return; } lb = 8.0 * plsc->chrht; rb = 5.0 * plsc->chrht; tb = 5.0 * plsc->chrht; bb = 5.0 * plsc->chrht; plgspa(&spxmin, &spxmax, &spymin, &spymax); xsize = spxmax - spxmin; ysize = spymax - spymin; xsize -= lb + rb; /* adjust for labels */ ysize -= bb + tb; if (aspect * xsize > ysize) { nxsize = ysize / aspect; nysize = ysize; } else { nxsize = xsize; nysize = xsize * aspect; } /* center plot within page */ vpxmin = .5 * (xsize - nxsize) + lb; vpxmax = vpxmin + nxsize; vpymin = .5 * (ysize - nysize) + bb; vpymax = vpymin + nysize; plsvpa(vpxmin, vpxmax, vpymin, vpymax); }
int main( int argc, const char *argv[] ) { /* Parse and process command line arguments */ (void) plparseopts( &argc, argv, PL_PARSE_FULL ); /* Initialize plplot */ plinit(); pladv( 0 ); plvpor( 0.0, 1.0, 0.0, 1.0 ); plwind( 0.0, 1.0, 0.0, 1.0 ); plbox( "bc", 0.0, 0, "bc", 0.0, 0 ); plsvpa( 50.0, 150.0, 50.0, 100.0 ); plwind( 0.0, 1.0, 0.0, 1.0 ); plbox( "bc", 0.0, 0, "bc", 0.0, 0 ); plptex( 0.5, 0.5, 1.0, 0.0, 0.5, "BOX at (50,150,50,100)" ); plend(); exit( 0 ); }
static void c_plenvi(PLFLT xmin, PLFLT xmax, PLFLT ymin, PLFLT ymax, PLINT just, PLINT axis, PLINT old) { PLFLT lb, rb, tb, bb, dx, dy; PLFLT xsize, ysize, size, xscale, yscale, scale; PLFLT spxmin, spxmax, spymin, spymax; PLFLT vpxmin, vpxmax, vpymin, vpymax; if (plsc->level < 1) { plabort("plenv: Please call plinit first"); return; } if (xmin == xmax) { plabort("plenv: Invalid xmin and xmax arguments"); return; } if (ymin == ymax) { plabort("plenv: Invalid ymin and ymax arguments"); return; } if (just < -1 || just > 2) { plabort("plenv: Invalid just option"); return; } if (plsc->nsubx * plsc->nsuby == 1) /* not multiplot mode */ old = 1; if (old == 1) pladv(0); else plclear(); if (just == 0) plvsta(); else if (just == 1){ lb = 8.0 * plsc->chrht; rb = 5.0 * plsc->chrht; tb = 5.0 * plsc->chrht; bb = 5.0 * plsc->chrht; dx = ABS(xmax - xmin); dy = ABS(ymax - ymin); plgspa(&spxmin, &spxmax, &spymin, &spymax); xsize = spxmax - spxmin; ysize = spymax - spymin; xscale = dx / (xsize - lb - rb); yscale = dy / (ysize - tb - bb); scale = MAX(xscale, yscale); vpxmin = MAX(lb, 0.5 * (xsize - dx / scale)); vpxmax = vpxmin + (dx / scale); vpymin = MAX(bb, 0.5 * (ysize - dy / scale)); vpymax = vpymin + (dy / scale); plsvpa(vpxmin, vpxmax, vpymin, vpymax); } else if(just == 2) { lb = 8.0 * plsc->chrht; rb = 5.0 * plsc->chrht; tb = 5.0 * plsc->chrht; bb = 5.0 * plsc->chrht; plgspa(&spxmin, &spxmax, &spymin, &spymax); xsize = spxmax - spxmin; ysize = spymax - spymin; size = MIN(xsize-lb-rb, ysize-tb-bb); dx = (xsize-size-lb-rb)/2; vpxmin = lb + dx; vpxmax = vpxmin + size; dy = (ysize-size-bb-tb)/2; vpymin = bb + dy; vpymax = vpymin + size; plsvpa(vpxmin, vpxmax, vpymin, vpymax); } plwind(xmin, xmax, ymin, ymax); switch (axis) { case -2: break; case -1: plbox("bc", (PLFLT) 0.0, 0, "bc", (PLFLT) 0.0, 0); break; case 0: plbox("bcnst", (PLFLT) 0.0, 0, "bcnstv", (PLFLT) 0.0, 0); break; case 1: plbox("abcnst", (PLFLT) 0.0, 0, "abcnstv", (PLFLT) 0.0, 0); break; case 2: plbox("abcgnst", (PLFLT) 0.0, 0, "abcgnstv", (PLFLT) 0.0, 0); break; case 3: plbox("abcgnsth", (PLFLT) 0.0, 0, "abcgnstvh", (PLFLT) 0.0, 0); break; case 10: plbox("bclnst", (PLFLT) 0.0, 0, "bcnstv", (PLFLT) 0.0, 0); break; case 11: plbox("abclnst", (PLFLT) 0.0, 0, "abcnstv", (PLFLT) 0.0, 0); break; case 12: plbox("abcglnst", (PLFLT) 0.0, 0, "abcgnstv", (PLFLT) 0.0, 0); break; case 13: plbox("abcglnsth", (PLFLT) 0.0, 0, "abcgnstvh", (PLFLT) 0.0, 0); break; case 20: plbox("bcnst", (PLFLT) 0.0, 0, "bclnstv", (PLFLT) 0.0, 0); break; case 21: plbox("abcnst", (PLFLT) 0.0, 0, "abclnstv", (PLFLT) 0.0, 0); break; case 22: plbox("abcgnst", (PLFLT) 0.0, 0, "abcglnstv", (PLFLT) 0.0, 0); break; case 23: plbox("abcgnsth", (PLFLT) 0.0, 0, "abcglnstvh", (PLFLT) 0.0, 0); break; case 30: plbox("bclnst", (PLFLT) 0.0, 0, "bclnstv", (PLFLT) 0.0, 0); break; case 31: plbox("abclnst", (PLFLT) 0.0, 0, "abclnstv", (PLFLT) 0.0, 0); break; case 32: plbox("abcglnst", (PLFLT) 0.0, 0, "abcglnstv", (PLFLT) 0.0, 0); break; case 33: plbox("abcglnsth", (PLFLT) 0.0, 0, "abcglnstvh", (PLFLT) 0.0, 0); break; default: plwarn("plenv: Invalid axis argument"); } }