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 #define dtr 0.01745329252
00027
00028
00029
00030
00031
00032
00033
00034 void
00035 c_plwind(PLFLT xmin, PLFLT xmax, PLFLT ymin, PLFLT ymax)
00036 {
00037 PLFLT dx, dy, mmxmi, mmxma, mmymi, mmyma;
00038 PLFLT xvpwxmin, xvpwxmax, xvpwymin, xvpwymax;
00039 PLWindow w;
00040
00041 if (plsc->level < 2) {
00042 plabort("plwind: Please set up viewport first");
00043 return;
00044 }
00045
00046
00047
00048 if (xmin == xmax) {
00049 plwarn("plwind: Invalid window limits in x.");
00050 xmin--; xmax++;
00051 }
00052 if (ymin == ymax) {
00053 plwarn("plwind: Invalid window limits in y.");
00054 ymin--; ymax++;
00055 }
00056
00057 plsc->vpwxmi = xmin;
00058 plsc->vpwxma = xmax;
00059 plsc->vpwymi = ymin;
00060 plsc->vpwyma = ymax;
00061
00062
00063
00064
00065 plP_xgvpw(&xvpwxmin, &xvpwxmax, &xvpwymin, &xvpwymax);
00066
00067
00068
00069 dx = xvpwxmax - xvpwxmin;
00070 dy = xvpwymax - xvpwymin;
00071
00072 plsc->wpxscl = (plsc->vppxma - plsc->vppxmi) / dx;
00073 plsc->wpxoff = (xmax * plsc->vppxmi - xmin * plsc->vppxma) / dx;
00074 plsc->wpyscl = (plsc->vppyma - plsc->vppymi) / dy;
00075 plsc->wpyoff = (ymax * plsc->vppymi - ymin * plsc->vppyma) / dy;
00076
00077 mmxmi = plP_dcmmx(plsc->vpdxmi);
00078 mmxma = plP_dcmmx(plsc->vpdxma);
00079 mmymi = plP_dcmmy(plsc->vpdymi);
00080 mmyma = plP_dcmmy(plsc->vpdyma);
00081
00082
00083
00084 plsc->wmxscl = (mmxma - mmxmi) / dx;
00085 plsc->wmxoff = (xmax * mmxmi - xmin * mmxma) / dx;
00086 plsc->wmyscl = (mmyma - mmymi) / dy;
00087 plsc->wmyoff = (ymax * mmymi - ymin * mmyma) / dy;
00088
00089
00090
00091 plsc->wdxscl = plsc->wmxscl * plsc->xpmm / (plsc->phyxma - plsc->phyxmi);
00092 plsc->wdxoff = plsc->wmxoff * plsc->xpmm / (plsc->phyxma - plsc->phyxmi);
00093 plsc->wdyscl = plsc->wmyscl * plsc->ypmm / (plsc->phyyma - plsc->phyymi);
00094 plsc->wdyoff = plsc->wmyoff * plsc->ypmm / (plsc->phyyma - plsc->phyymi);
00095
00096
00097
00098 w.dxmi = plsc->vpdxmi;
00099 w.dxma = plsc->vpdxma;
00100 w.dymi = plsc->vpdymi;
00101 w.dyma = plsc->vpdyma;
00102
00103 w.wxmi = xvpwxmin;
00104 w.wxma = xvpwxmax;
00105 w.wymi = xvpwymin;
00106 w.wyma = xvpwymax;
00107
00108 plP_swin(&w);
00109
00110
00111
00112 plsc->level = 3;
00113 }
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135 void
00136 c_plw3d(PLFLT basex, PLFLT basey, PLFLT height, PLFLT xmin0,
00137 PLFLT xmax0, PLFLT ymin0, PLFLT ymax0, PLFLT zmin0,
00138 PLFLT zmax0, PLFLT alt, PLFLT az)
00139 {
00140 PLFLT xmin, xmax, ymin, ymax, zmin, zmax, d;
00141 PLFLT cx, cy, saz, caz, salt, calt, zscale;
00142
00143 if (plsc->level < 3) {
00144 plabort("plw3d: Please set up 2-d window first");
00145 return;
00146 }
00147 if (basex <= 0.0 || basey <= 0.0 || height <= 0.0) {
00148 plabort("plw3d: Invalid world coordinate boxsize");
00149 return;
00150 }
00151 if (xmin0 == xmax0 || ymin0 == ymax0 || zmin0 == zmax0) {
00152 plabort("plw3d: Invalid axis range");
00153 return;
00154 }
00155 if (alt < 0.0 || alt > 90.0) {
00156 plabort("plw3d: Altitude must be between 0 and 90 degrees");
00157 return;
00158 }
00159
00160 d = 1.0e-5 * (xmax0 - xmin0);
00161 xmax = xmax0 + d;
00162 xmin = xmin0 - d;
00163 d = 1.0e-5 * (ymax0 - ymin0);
00164 ymax = ymax0 + d;
00165 ymin = ymin0 - d;
00166 d = 1.0e-5 * (zmax0 - zmin0);
00167 zmax = zmax0 + d;
00168 zmin = zmin0 - d;
00169 cx = basex / (xmax - xmin);
00170 cy = basey / (ymax - ymin);
00171 zscale = height / (zmax - zmin);
00172 saz = sin(dtr * az);
00173 caz = cos(dtr * az);
00174 salt = sin(dtr * alt);
00175 calt = cos(dtr * alt);
00176
00177 plsc->domxmi = xmin;
00178 plsc->domxma = xmax;
00179 plsc->domymi = ymin;
00180 plsc->domyma = ymax;
00181 plsc->zzscl = zscale;
00182 plsc->ranmi = zmin;
00183 plsc->ranma = zmax;
00184
00185 plsc->base3x = basex;
00186 plsc->base3y = basey;
00187 plsc->basecx = 0.5 * (xmin + xmax);
00188 plsc->basecy = 0.5 * (ymin + ymax);
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227 plsc->cxx = cx * caz;
00228 plsc->cxy = -cy * saz;
00229 plsc->cyx = cx * saz * salt;
00230 plsc->cyy = cy * caz * salt;
00231 plsc->cyz = zscale * calt;
00232 plsc->czx = -cx * calt * saz;
00233 plsc->czy = -cy * calt * caz;
00234 plsc->czz = zscale * salt;
00235 }