void c_plvsta(void) { PLFLT xmin, xmax, ymin, ymax; PLFLT lb, rb, tb, bb; if (plsc->level < 1) { plabort("plvsta: Please call plinit first"); return; } /* Find out position of subpage boundaries in millimetres, reduce by */ /* the desired border, and convert back into normalized subpage */ /* coordinates */ lb = 8.0 * plsc->chrht; rb = 5.0 * plsc->chrht; tb = 5.0 * plsc->chrht; bb = 5.0 * plsc->chrht; xmin = plP_dcscx(plP_mmdcx((PLFLT) (plP_dcmmx(plsc->spdxmi) + lb))); xmax = plP_dcscx(plP_mmdcx((PLFLT) (plP_dcmmx(plsc->spdxma) - rb))); ymin = plP_dcscy(plP_mmdcy((PLFLT) (plP_dcmmy(plsc->spdymi) + tb))); ymax = plP_dcscy(plP_mmdcy((PLFLT) (plP_dcmmy(plsc->spdyma) - bb))); plvpor(xmin, xmax, ymin, ymax); }
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_plgspa(PLFLT *xmin, PLFLT *xmax, PLFLT *ymin, PLFLT *ymax) { if (plsc->level < 1) { plabort("plgspa: Please call plinit first"); return; } *xmin = plP_dcmmx(plsc->spdxmi); *xmax = plP_dcmmx(plsc->spdxma); *ymin = plP_dcmmy(plsc->spdymi); *ymax = plP_dcmmy(plsc->spdyma); }
static void plztx(const char *opt, PLFLT dx, PLFLT dy, PLFLT wx, PLFLT wy1, PLFLT wy2, PLFLT disp, PLFLT pos, PLFLT just, const char *text) { PLINT refx = 0, refy = 0, x = 0, y = 0, vert = 0; PLFLT shift, cc, ss, wy; PLFLT xdv, ydv, xmm, ymm, refxmm, refymm, xform[4], diag; PLFLT dispx, dispy; PLFLT chrdef, chrht; cc = plsc->wmxscl * dx; ss = plsc->wmyscl * dy; diag = sqrt(cc * cc + ss * ss); cc /= diag; ss /= diag; wy = wy1 + pos * (wy2 - wy1); if (plP_stsearch(opt, 'v')) vert = 0; else if (plP_stsearch(opt, 'h')) vert = 1; if (vert) { xform[0] = 0.0; xform[1] = -cc; xform[2] = 1.0; xform[3] = -ss; } else { xform[0] = cc; xform[1] = 0.0; xform[2] = ss; xform[3] = 1.0; } xdv = plP_wcdcx(wx); ydv = plP_wcdcy(wy); dispx = -disp * cc; dispy = -disp * ss; plgchr(&chrdef, &chrht); shift = (just == 0.0) ? 0.0 : plstrl(text) * just; xmm = plP_dcmmx(xdv) + dispx * chrht; ymm = plP_dcmmy(ydv) + dispy * chrht; refxmm = xmm - shift * xform[0]; refymm = ymm - shift * xform[2]; x = plP_mmpcx(xmm); y = plP_mmpcy(ymm); refx = plP_mmpcx(refxmm); refy = plP_mmpcy(refymm); plP_text(0, just, xform, x, y, refx, refy, text); }
void c_plptex(PLFLT wx, PLFLT wy, PLFLT dx, PLFLT dy, PLFLT just, const char *text) { PLINT x, y, refx, refy; PLFLT xdv, ydv, xmm, ymm, refxmm, refymm, shift, cc, ss; PLFLT xform[4], diag; PLFLT chrdef, chrht; PLFLT dispx, dispy; if (plsc->level < 3) { plabort("plptex: Please set up window first"); return; } if (dx == 0.0 && dy == 0.0) { dx = 1.0; dy = 0.0; } cc = plsc->wmxscl * dx; ss = plsc->wmyscl * dy; diag = sqrt(cc * cc + ss * ss); cc /= diag; ss /= diag; xform[0] = cc; xform[1] = -ss; xform[2] = ss; xform[3] = cc; xdv = plP_wcdcx(wx); ydv = plP_wcdcy(wy); dispx = 0.; dispy = 0.; /* Convert to physical units (mm) and compute shifts */ plgchr(&chrdef, &chrht); shift = (just == 0.0) ? 0.0 : plstrl(text) * just; xmm = plP_dcmmx(xdv) + dispx * chrht; ymm = plP_dcmmy(ydv) + dispy * chrht; refxmm = xmm - shift * xform[0]; refymm = ymm - shift * xform[2]; x = plP_mmpcx(xmm); y = plP_mmpcy(ymm); refx = plP_mmpcx(refxmm); refy = plP_mmpcy(refymm); plP_text(0, just, xform, x, y, refx, refy, text); }
static void plxytx(PLFLT wx1, PLFLT wy1, PLFLT wx2, PLFLT wy2, PLFLT disp, PLFLT pos, PLFLT just, const char *text) { PLINT x, y, refx, refy; PLFLT shift, cc, ss, wx, wy; PLFLT xdv, ydv, xmm, ymm, refxmm, refymm, xform[4], diag; PLFLT dispx, dispy; PLFLT chrdef, chrht; cc = plsc->wmxscl * (wx2 - wx1); ss = plsc->wmyscl * (wy2 - wy1); diag = sqrt(cc * cc + ss * ss); cc /= diag; ss /= diag; wx = wx1 + pos * (wx2 - wx1); wy = wy1 + pos * (wy2 - wy1); xform[0] = cc; xform[1] = 0.0; xform[2] = ss; xform[3] = 1.0; xdv = plP_wcdcx(wx); ydv = plP_wcdcy(wy); dispx = 0.; dispy = -disp; plgchr(&chrdef, &chrht); shift = (just == 0.0) ? 0.0 : plstrl(text) * just; xmm = plP_dcmmx(xdv) + dispx * chrht; ymm = plP_dcmmy(ydv) + dispy * chrht; refxmm = xmm - shift * xform[0]; refymm = ymm - shift * xform[2]; x = plP_mmpcx(xmm); y = plP_mmpcy(ymm); refx = plP_mmpcx(refxmm); refy = plP_mmpcy(refymm); plP_text(0, just, xform, x, y, refx, refy, text); }
void c_plsvpa(PLFLT xmin, PLFLT xmax, PLFLT ymin, PLFLT ymax) { PLFLT sxmin, symin; if (plsc->level < 1) { plabort("plsvpa: Please call plinit first"); return; } if ((xmin >= xmax) || (ymin >= ymax)) { plabort("plsvpa: Invalid limits"); return; } if ((plsc->cursub <= 0) || (plsc->cursub > (plsc->nsubx * plsc->nsuby))) { plabort("plsvpa: Please call pladv or plenv to go to a subpage"); return; } sxmin = plP_dcmmx(plsc->spdxmi); symin = plP_dcmmy(plsc->spdymi); plsc->vpdxmi = plP_mmdcx((PLFLT) (sxmin + xmin)); plsc->vpdxma = plP_mmdcx((PLFLT) (sxmin + xmax)); plsc->vpdymi = plP_mmdcy((PLFLT) (symin + ymin)); plsc->vpdyma = plP_mmdcy((PLFLT) (symin + ymax)); plsc->vppxmi = plP_dcpcx(plsc->vpdxmi); plsc->vppxma = plP_dcpcx(plsc->vpdxma); plsc->vppymi = plP_dcpcy(plsc->vpdymi); plsc->vppyma = plP_dcpcy(plsc->vpdyma); plsc->clpxmi = plP_dcpcx(plsc->vpdxmi); plsc->clpxma = plP_dcpcx(plsc->vpdxma); plsc->clpymi = plP_dcpcy(plsc->vpdymi); plsc->clpyma = plP_dcpcy(plsc->vpdyma); plsc->level = 2; }
void c_plwind(PLFLT xmin, PLFLT xmax, PLFLT ymin, PLFLT ymax) { PLFLT dx, dy, mmxmi, mmxma, mmymi, mmyma; PLWindow w; if (plsc->level < 2) { plabort("plwind: Please set up viewport first"); return; } /* Best to just warn and recover on bounds errors */ if (xmin == xmax) { plwarn("plwind: Invalid window limits in x."); xmin--; xmax++; } if (ymin == ymax) { plwarn("plwind: Invalid window limits in y."); ymin--; ymax++; } dx = (xmax - xmin) * 1.0e-5; dy = (ymax - ymin) * 1.0e-5; /* The true plot window is made slightly larger than requested so that */ /* the end limits will be on the graph */ plsc->vpwxmi = xmin - dx; plsc->vpwxma = xmax + dx; plsc->vpwymi = ymin - dy; plsc->vpwyma = ymax + dy; /* Compute the scaling between coordinate systems */ dx = plsc->vpwxma - plsc->vpwxmi; dy = plsc->vpwyma - plsc->vpwymi; plsc->wpxscl = (plsc->vppxma - plsc->vppxmi) / dx; plsc->wpxoff = (xmax * plsc->vppxmi - xmin * plsc->vppxma) / dx; plsc->wpyscl = (plsc->vppyma - plsc->vppymi) / dy; plsc->wpyoff = (ymax * plsc->vppymi - ymin * plsc->vppyma) / dy; mmxmi = plP_dcmmx(plsc->vpdxmi); mmxma = plP_dcmmx(plsc->vpdxma); mmymi = plP_dcmmy(plsc->vpdymi); mmyma = plP_dcmmy(plsc->vpdyma); /* Set transformation variables for world coordinates to mm */ plsc->wmxscl = (mmxma - mmxmi) / dx; plsc->wmxoff = (xmax * mmxmi - xmin * mmxma) / dx; plsc->wmyscl = (mmyma - mmymi) / dy; plsc->wmyoff = (ymax * mmymi - ymin * mmyma) / dy; /* Set transformation variables for world coordinates to device coords */ plsc->wdxscl = plsc->wmxscl * plsc->xpmm / (plsc->phyxma - plsc->phyxmi); plsc->wdxoff = plsc->wmxoff * plsc->xpmm / (plsc->phyxma - plsc->phyxmi); plsc->wdyscl = plsc->wmyscl * plsc->ypmm / (plsc->phyyma - plsc->phyymi); plsc->wdyoff = plsc->wmyoff * plsc->ypmm / (plsc->phyyma - plsc->phyymi); /* Register plot window attributes */ w.dxmi = plsc->vpdxmi; w.dxma = plsc->vpdxma; w.dymi = plsc->vpdymi; w.dyma = plsc->vpdyma; w.wxmi = plsc->vpwxmi; w.wxma = plsc->vpwxma; w.wymi = plsc->vpwymi; w.wyma = plsc->vpwyma; plP_swin(&w); /* Go to level 3 */ plsc->level = 3; }
void c_plmtex(const char *side, PLFLT disp, PLFLT pos, PLFLT just, const char *text) { PLINT clpxmi, clpxma, clpymi, clpyma; PLINT vert, refx, refy, x, y; PLFLT xdv, ydv, xmm, ymm, refxmm, refymm, shift, xform[4]; PLFLT chrdef, chrht; PLFLT dispx, dispy; if (plsc->level < 2) { plabort("plmtex: Please set up viewport first"); return; } /* Open clip limits to subpage limits */ plP_gclp(&clpxmi, &clpxma, &clpymi, &clpyma); /* get and store current clip limits */ plP_sclp(plsc->sppxmi, plsc->sppxma, plsc->sppymi, plsc->sppyma); if (plP_stindex(side, "BV") != -1 || plP_stindex(side, "bv") != -1) { vert = 1; xdv = plsc->vpdxmi + (plsc->vpdxma - plsc->vpdxmi) * pos; ydv = plsc->vpdymi; dispx = 0; dispy = -disp; } else if (plP_stindex(side, "TV") != -1 || plP_stindex(side, "tv") != -1) { vert = 1; xdv = plsc->vpdxmi + (plsc->vpdxma - plsc->vpdxmi) * pos; ydv = plsc->vpdyma; dispx = 0; dispy = disp; } else if (plP_stsearch(side, 'b')) { vert = 0; xdv = plsc->vpdxmi + (plsc->vpdxma - plsc->vpdxmi) * pos; ydv = plsc->vpdymi; dispx = 0; dispy = -disp; } else if (plP_stsearch(side, 't')) { vert = 0; xdv = plsc->vpdxmi + (plsc->vpdxma - plsc->vpdxmi) * pos; ydv = plsc->vpdyma; dispx = 0; dispy = disp; } else if (plP_stindex(side, "LV") != -1 || plP_stindex(side, "lv") != -1) { vert = 0; xdv = plsc->vpdxmi; ydv = plsc->vpdymi + (plsc->vpdyma - plsc->vpdymi) * pos; dispx = -disp; dispy = 0; } else if (plP_stindex(side, "RV") != -1 || plP_stindex(side, "rv") != -1) { vert = 0; xdv = plsc->vpdxma; ydv = plsc->vpdymi + (plsc->vpdyma - plsc->vpdymi) * pos; dispx = disp; dispy = 0; } else if (plP_stsearch(side, 'l')) { vert = 1; xdv = plsc->vpdxmi; ydv = plsc->vpdymi + (plsc->vpdyma - plsc->vpdymi) * pos; dispx = -disp; dispy = 0; } else if (plP_stsearch(side, 'r')) { vert = 1; xdv = plsc->vpdxma; ydv = plsc->vpdymi + (plsc->vpdyma - plsc->vpdymi) * pos; dispx = disp; dispy = 0; } else { plP_sclp(clpxmi, clpxma, clpymi, clpyma); /* restore initial clip limits */ return; } /* Transformation matrix */ if (vert != 0) { xform[0] = 0.0; xform[1] = -1.0; xform[2] = 1.0; xform[3] = 0.0; } else { xform[0] = 1.0; xform[1] = 0.0; xform[2] = 0.0; xform[3] = 1.0; } /* Convert to physical units (mm) and compute shifts */ plgchr(&chrdef, &chrht); shift = (just == 0.0) ? 0.0 : plstrl(text) * just; xmm = plP_dcmmx(xdv) + dispx * chrht; ymm = plP_dcmmy(ydv) + dispy * chrht; refxmm = xmm - shift * xform[0]; refymm = ymm - shift * xform[2]; /* Convert to device units (pixels) and call text plotter */ x = plP_mmpcx(xmm); y = plP_mmpcy(ymm); refx = plP_mmpcx(refxmm); refy = plP_mmpcy(refymm); plP_text(0, just, xform, x, y, refx, refy, text); plP_sclp(clpxmi, clpxma, clpymi, clpyma); /* restore clip limits */ }