Changeset 155 in Sophya
- Timestamp:
- Oct 16, 1998, 6:29:52 PM (27 years ago)
- Location:
- trunk/SophyaPI/PI
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/SophyaPI/PI/pi3ddrw.cc
r120 r155 239 239 { 240 240 mGr3d->SetBaseGraphic(mWGrC, 0, 0, XSize(), YSize()); 241 float x c, yc, zc, xo, yo, zo;241 float xo, yo, zo; 242 242 float teta, phi, psi; 243 243 float dax, day, co, dco; 244 mGr3d->Get3DCS( xc, yc, zc, xo, yo, zo, teta, phi, psi, dax, day, co, dco);244 mGr3d->Get3DCS(cXc, cYc, cZc, xo, yo, zo, teta, phi, psi, dax, day, co, dco); 245 245 // puts("\n PIDraw3DWdg::But2Press() "); 246 246 // mGr3d->PrintCS(); 247 lPx = x; lPy = y; 247 lPx = x; lPy = y; 248 249 // Pour savoir si on se trouve ds la zone centrale 250 int czx = XSize()/10; 251 int czy = YSize()/10; 252 int dmix = x-XSize()/2; 253 int dmiy = y-YSize()/2; 254 if (dmix < 0) dmix = -dmix; 255 if (dmiy < 0) dmiy = -dmiy; 256 if ((dmix < czx) && (dmiy < czy)) rOfg = true; 257 else rOfg = false; 258 248 259 cUlen = 0.5*(dax+day)*co*0.3; cDax = dax; cDay = day; clCO = co; 249 260 cTeta = teta; cPhi = phi; … … 260 271 */ 261 272 DrawXYZAxes(); 273 if (rOfg) { czx /= 2; czy /= 2; mWGrC->DrawBox(XSize()/2-czx, YSize()/2-czy, czx*2, czy*2); } 274 262 275 Send(Msg(), PIMsg_Active); 263 276 PIDrwTools::SetCurrentBaseWdg(this); … … 268 281 { 269 282 DrawXYZAxes(); 270 float phi = M_PI+cPhi; 271 float teta = M_PI-cTeta; 272 phi += (M_PI*0.4*(float)(x-lPx)/XSize()); 273 teta -= (M_PI*0.4*(float)(y-lPy)/YSize()); 274 mGr3d->RotateObserver(teta, phi, 0., false); 283 float teta, phi; 284 285 if (rOfg) { 286 phi = cPhi + (M_PI*0.25*(float)(x-lPx)/XSize()); 287 teta = cTeta - (M_PI*0.25*(float)(y-lPy)/YSize()); 288 mGr3d->RotateObject(teta, phi, false); 289 } 290 else { 291 phi = cPhi - (M_PI*0.5*(float)(x-lPx)/XSize()); 292 teta = cTeta + (M_PI*0.5*(float)(y-lPy)/YSize()); 293 mGr3d->RotateObserver(teta, phi, 0., false); 294 } 275 295 /* { 276 296 char buff[256]; … … 287 307 { 288 308 DrawXYZAxes(); 309 if (rOfg) { 310 int czx = XSize()/20; 311 int czy = YSize()/20; 312 mWGrC->DrawBox(XSize()/2-czx, YSize()/2-czy, czx*2, czy*2); 313 } 314 289 315 // puts("\n PIDraw3DWdg::But2Release()"); 290 316 // mGr3d->PrintCS(); … … 299 325 void PIDraw3DWdg::But3Press(int x, int y) 300 326 { 301 float x c, yc, zc, xo, yo, zo;327 float xo, yo, zo; 302 328 float teta, phi, psi; 303 329 float dax, day, co, dco; 304 mGr3d->Get3DCS( xc, yc, zc, xo, yo, zo, teta, phi, psi, dax, day, co, dco);330 mGr3d->Get3DCS(cXc, cYc, cZc, xo, yo, zo, teta, phi, psi, dax, day, co, dco); 305 331 mGr3d->SetBaseGraphic(mWGrC, 0, 0, XSize(), YSize()); 306 332 lPx = x; lPy = y; … … 364 390 mWGrC->SelGOMode(PI_GOXOR); 365 391 PIGrCoord x1,y1,z1,x2,y2,z2; 366 float xc,yc,zc,xo,yo,zo,teta,phi,psi,dax,day,co,dco; 367 mGr3d->Get3DCS(xc,yc,zc,xo,yo,zo,teta,phi,psi,dax,day,co,dco); 368 float len = cUlen; 369 x1 = xc; y1 = yc; z1 = zc; 370 x2 = xc+len; y2 = yc; z2 = zc; 392 x1 = cXc; y1 = cYc; z1 = cZc; 393 x2 = cXc+cUlen; y2 = cYc; z2 = cZc; 371 394 mGr3d->DrawLine3D(x1, y1, z1, x2, y2, z2); 372 x2 = xc+len*1.1;395 x2 = cXc+cUlen*1.1; 373 396 mGr3d->DrawString3D(x2, y2, z2, "X"); 374 x2 = xc; y2 = yc+len; z2 = zc;397 x2 = cXc; y2 = cYc+cUlen; z2 = cZc; 375 398 mGr3d->DrawLine3D(x1, y1, z1, x2, y2, z2); 376 y2 = yc+len*1.1;399 y2 = cYc+cUlen*1.1; 377 400 mGr3d->DrawString3D(x2, y2, z2, "Y"); 378 x2 = xc; y2 = yc; z2 = zc+len;401 x2 = cXc; y2 = cYc; z2 = cZc+cUlen; 379 402 mGr3d->DrawLine3D(x1, y1, z1, x2, y2, z2); 380 z2 = zc+len*1.1;403 z2 = cZc+cUlen*1.1; 381 404 mGr3d->DrawString3D(x2, y2, z2, "Z"); 382 405 // mGr3d->DrawCircle(0., 0., daxO*0.30); 383 406 char buff[256]; 407 float xc,yc,zc,xo,yo,zo,teta,phi,psi,dax,day,co,dco; 408 mGr3d->Get3DCS(xc,yc,zc,xo,yo,zo,teta,phi,psi,dax,day,co,dco); 384 409 sprintf(buff, " C: %g %g %g -> O: %g %g %g (T/P0= %g %g) ", xc,yc,zc, xo, yo, zo, cTeta, cPhi); 385 410 mWGrC->DrawString(0,20,buff); -
trunk/SophyaPI/PI/pi3ddrw.h
r120 r155 85 85 int lPx, lPy; // dernier position pointeur 86 86 PIColors lCol; // Couleur 87 float cTeta, cPhi, cUlen; // Pour garder valeurs avant rotation, Unite de longeur 87 float cTeta, cPhi, cUlen; // Pour garder valeurs avant rotation, Unite de longeur 88 float cXc, cYc, cZc; // Pour garder position du centre de champ 88 89 float clCO, cDax, cDay; // Pour garder les valeurs avant Zoom In/Out 90 bool rOfg; // Vrai si on fait tourner l'objet et pas la camera 89 91 }; 90 92 -
trunk/SophyaPI/PI/pigraph3d.cc
r154 r155 43 43 sO = true; 44 44 xO = xo; yO = yo; zO = zo; 45 if (teta > M_PI) teta = M_PI; 46 if (teta < 0.) teta = 0.; 47 if (phi < 0.) phi = 0.; 48 if (phi > deuxpi) phi = deuxpi; 45 while (teta < 0.) teta += deuxpi; 46 while (teta > deuxpi) teta -= deuxpi; 47 if (teta > M_PI) { teta = M_PI-teta; phi = phi+M_PI; } 48 while (phi < 0.) phi += deuxpi; 49 while (phi > deuxpi) phi -= deuxpi; 49 50 tO = teta; fO = phi; pO = psi; 50 51 if (dax < 0.) dax = -dax; … … 52 53 daxO = dax; dayO = day; 53 54 lCO = co; dlCO = dco; 54 SetUCS(-dax, dax, -day, day, kAxeDirLtoR, kAxeDirDownUp); 55 // Si on ne met kAxeDirLtoR, le repere semble etre ds le sens inverse -> kAxeDirRtoL , Reza 16/10/98 56 SetUCS(-dax, dax, -day, day, kAxeDirRtoL, kAxeDirDownUp); 55 57 double ct = cos((double)tO); 56 58 double st = sin((double)tO); … … 87 89 if (day < 0.) day = -day; 88 90 daxO = dax; dayO = day; 89 SetUCS(-dax, dax, -day, day, kAxeDirLtoR, kAxeDirDownUp); 91 // Si on ne met kAxeDirLtoR, le repere semble etre ds le sens inverse -> kAxeDirRtoL , Reza 16/10/98 92 SetUCS(-dax, dax, -day, day, kAxeDirRtoL, kAxeDirDownUp); 90 93 lCO = sqrt(dx*dx+dy*dy+dz*dz); 91 94 if (lCO < 1.e-6) { … … 164 167 /* --Methode-- */ 165 168 void PIGraphic3D::RotateObserver(float teta, float phi, float psi, bool rel) 169 // Positionne l'observateur (la camera) de maniere a ce que la direction de 170 // visee soit tO=teta, pO=phi (rel=false) / tO+=teta pO+=phi (rel=true) 171 // en conservant le centre de champ fixe 166 172 { 167 173 if (rel) { 168 teta = M_PI-tO-teta;169 phi = M_PI+fO+phi;170 psi = pO+psi;174 teta += tO; 175 phi += fO; 176 psi += pO; 171 177 } 172 if (teta < 0.) teta = 0.; 173 if (teta > M_PI) teta = M_PI; 178 while (teta < 0.) teta += deuxpi; 179 while (teta > deuxpi) teta -= deuxpi; 180 if (teta > M_PI) { teta = M_PI-teta; phi = phi+M_PI; } 174 181 float xo,yo,zo; 175 zo = cos((double)teta)*lCO+zC;176 xo = sin((double)teta)*cos((double)phi)*lCO+xC;177 yo = sin((double)teta)*sin((double)phi)*lCO+yC;182 zo = -cos((double)teta)*lCO+zC; 183 xo = -sin((double)teta)*cos((double)phi)*lCO+xC; 184 yo = -sin((double)teta)*sin((double)phi)*lCO+yC; 178 185 Set3DCS(xC,yC,zC, xo,yo,zo, daxO, dayO, dlCO, psi); 186 } 187 188 /* --Methode-- */ 189 void PIGraphic3D::RotateObject(float teta, float phi, bool rel) 190 // Positionne l'objet (centre du champ) de maniere a ce que la direction de 191 // visee soit tO=teta, pO=phi (rel=false) / tO+=teta pO+=phi (rel=true) 192 // en conservant la position de l'observateur fixe. 193 { 194 if (rel) { 195 teta += tO; 196 phi += fO; 197 } 198 while (teta < 0.) teta += deuxpi; 199 while (teta > deuxpi) teta -= deuxpi; 200 if (teta > M_PI) { teta = M_PI-teta; phi = phi+M_PI; } 201 float xc,yc,zc; 202 zc = cos((double)teta)*lCO+zO; 203 xc = sin((double)teta)*cos((double)phi)*lCO+xO; 204 yc = sin((double)teta)*sin((double)phi)*lCO+yO; 205 Set3DCS(xc,yc,zc, xO,yO,zO, daxO, dayO, dlCO, pO); 179 206 } 180 207 … … 207 234 xc = x-xO; yc = y-yO; zc = z-zO; 208 235 xp = RE[0][0]*xc+RE[0][1]*yc+RE[0][2]*zc; 209 yp = RE[1][0]*xc+RE[1][1]*yc+RE[1][2]*zc;236 yp = -RE[1][0]*xc+RE[1][1]*yc+RE[1][2]*zc; 210 237 zp = RE[2][0]*xc+RE[2][1]*yc+RE[2][2]*zc; 211 238 } -
trunk/SophyaPI/PI/pigraph3d.h
r113 r155 28 28 virtual void PrintCS(); // Pour debugger 29 29 virtual void RotateObserver(float teta, float phi, float psi=0., bool rel=true); 30 virtual void RotateObject(float teta, float phi, bool rel=true); 30 31 virtual void ZoomInOut(float fco, float fdax, float fday, bool rel=true); 31 32
Note:
See TracChangeset
for help on using the changeset viewer.