Changeset 155 in Sophya


Ignore:
Timestamp:
Oct 16, 1998, 6:29:52 PM (27 years ago)
Author:
ercodmgr
Message:

Correction symetrie mirroir PIGraph3D et possibilite de bouger l'objet ds PI3DDrawWdg Reza 16/10/98

Location:
trunk/SophyaPI/PI
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/SophyaPI/PI/pi3ddrw.cc

    r120 r155  
    239239{
    240240  mGr3d->SetBaseGraphic(mWGrC, 0, 0, XSize(), YSize());
    241   float xc, yc, zc, xo, yo, zo;
     241  float xo, yo, zo;
    242242  float teta, phi, psi;
    243243  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);
    245245//   puts("\n PIDraw3DWdg::But2Press() ");
    246246//   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
    248259  cUlen = 0.5*(dax+day)*co*0.3;    cDax = dax;   cDay = day;  clCO = co;
    249260  cTeta = teta;   cPhi = phi;
     
    260271*/
    261272  DrawXYZAxes();
     273  if (rOfg)  { czx /= 2;   czy /= 2;  mWGrC->DrawBox(XSize()/2-czx, YSize()/2-czy, czx*2, czy*2); }
     274 
    262275  Send(Msg(), PIMsg_Active);
    263276  PIDrwTools::SetCurrentBaseWdg(this);
     
    268281{
    269282  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    }
    275295/*  {
    276296  char buff[256];
     
    287307{
    288308  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
    289315//  puts("\n PIDraw3DWdg::But2Release()");
    290316//  mGr3d->PrintCS();
     
    299325void PIDraw3DWdg::But3Press(int x, int y)
    300326{
    301   float xc, yc, zc, xo, yo, zo;
     327  float xo, yo, zo;
    302328  float teta, phi, psi;
    303329  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);
    305331  mGr3d->SetBaseGraphic(mWGrC, 0, 0, XSize(), YSize());
    306332  lPx = x;  lPy = y; 
     
    364390  mWGrC->SelGOMode(PI_GOXOR);
    365391  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;
    371394  mGr3d->DrawLine3D(x1, y1, z1, x2, y2, z2);
    372   x2 = xc+len*1.1;
     395  x2 = cXc+cUlen*1.1;
    373396  mGr3d->DrawString3D(x2, y2, z2, "X");
    374   x2 = xc;   y2 = yc+len;   z2 = zc;
     397  x2 = cXc;   y2 = cYc+cUlen;   z2 = cZc;
    375398  mGr3d->DrawLine3D(x1, y1, z1, x2, y2, z2);
    376   y2 = yc+len*1.1;
     399  y2 = cYc+cUlen*1.1;
    377400  mGr3d->DrawString3D(x2, y2, z2, "Y");   
    378   x2 = xc;   y2 = yc;   z2 = zc+len;
     401  x2 = cXc;   y2 = cYc;   z2 = cZc+cUlen;
    379402  mGr3d->DrawLine3D(x1, y1, z1, x2, y2, z2);
    380   z2 = zc+len*1.1;
     403  z2 = cZc+cUlen*1.1;
    381404  mGr3d->DrawString3D(x2, y2, z2, "Z");   
    382405//   mGr3d->DrawCircle(0., 0., daxO*0.30);
    383406  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);
    384409  sprintf(buff, " C: %g %g %g -> O: %g %g %g  (T/P0= %g %g)     ", xc,yc,zc, xo, yo, zo, cTeta, cPhi);
    385410  mWGrC->DrawString(0,20,buff);
  • trunk/SophyaPI/PI/pi3ddrw.h

    r120 r155  
    8585  int lPx, lPy;         // dernier position pointeur
    8686  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
    8889  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
    8991};
    9092
  • trunk/SophyaPI/PI/pigraph3d.cc

    r154 r155  
    4343  sO = true;
    4444  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;
    4950  tO = teta;  fO = phi;  pO = psi;
    5051  if (dax < 0.) dax = -dax;
     
    5253  daxO = dax;  dayO = day;
    5354  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);
    5557  double ct = cos((double)tO);
    5658  double st = sin((double)tO);
     
    8789  if (day < 0.) day = -day;
    8890  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);
    9093  lCO = sqrt(dx*dx+dy*dy+dz*dz);
    9194  if (lCO < 1.e-6) {
     
    164167/* --Methode-- */
    165168void 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 
    166172{
    167173  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;
    171177    }
    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; }
    174181  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;
    178185  Set3DCS(xC,yC,zC, xo,yo,zo, daxO, dayO, dlCO, psi);
     186}
     187
     188/* --Methode-- */
     189void 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);
    179206}
    180207
     
    207234  xc = x-xO;   yc = y-yO;    zc = z-zO;
    208235  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; 
    210237  zp = RE[2][0]*xc+RE[2][1]*yc+RE[2][2]*zc;
    211238}
  • trunk/SophyaPI/PI/pigraph3d.h

    r113 r155  
    2828  virtual void       PrintCS();  // Pour debugger
    2929  virtual void       RotateObserver(float teta, float phi, float psi=0., bool rel=true);
     30  virtual void       RotateObject(float teta, float phi, bool rel=true);
    3031  virtual void       ZoomInOut(float fco, float fdax, float fday, bool rel=true);
    3132
Note: See TracChangeset for help on using the changeset viewer.