12 #include "RConfigure.h" 
   32 const Int_t    kCARTESIAN = 1;
 
   33 const Int_t    kPOLAR     = 2;
 
   34 const Double_t kRad       = 3.14159265358979323846/180.0;
 
  108 TView3D::TView3D() :TView()
 
  112    fDefaultOutline = kFALSE;
 
  118    for (i = 0; i < 3; i++) {
 
  121       fX1[i] = fX2[i] = fY1[i] = fY2[i] = fZ1[i] = fZ2[i] = 0;
 
  125       fLongitude = -90 - gPad->GetPhi();
 
  126       fLatitude  =  90 - gPad->GetTheta();
 
  132    ResetView(fLongitude, fLatitude, fPsi, irep);
 
  152 TView3D::TView3D(Int_t system, 
const Double_t *rmin, 
const Double_t *rmax) : TView()
 
  156    SetBit(kMustCleanup);
 
  160    fDefaultOutline = kFALSE;
 
  164    if (system == kCARTESIAN || system == kPOLAR || system == 11) fPsi = 0;
 
  168    if (gPad) gPad->Range(-1, -1, 1, 1);
 
  172    for (i = 0; i < 3; i++) {
 
  173       if (rmin) fRmin[i] = rmin[i];
 
  175       if (rmax) fRmax[i] = rmax[i];
 
  177       fX1[i] = fX2[i] = fY1[i] = fY2[i] = fZ1[i] = fZ2[i] = 0;
 
  181       fLongitude = -90 - gPad->GetPhi();
 
  182       fLatitude  =  90 - gPad->GetTheta();
 
  187    ResetView(fLongitude, fLatitude, fPsi, irep);
 
  189    if (gPad) gPad->SetView(
this);
 
  190    if (system == 11) SetPerspective();
 
  196 TView3D::TView3D(
const TView3D& tv)
 
  198    fLatitude(tv.fLatitude),
 
  199    fLongitude(tv.fLongitude),
 
  206    fOutline(tv.fOutline),
 
  207    fDefaultOutline(tv.fDefaultOutline),
 
  208    fAutoRange(tv.fAutoRange),
 
  209    fChanged(tv.fChanged)
 
  211    for (Int_t i=0; i<16; i++) {
 
  214       fTnorm[i]=tv.fTnorm[i];
 
  215       fTback[i]=tv.fTback[i];
 
  217    for(Int_t i=0; i<3; i++) {
 
  218       fRmax[i]=tv.fRmax[i];
 
  219       fRmin[i]=tv.fRmin[i];
 
  227    for(Int_t i=0; i<4; i++)
 
  228       fUVcoord[i]=tv.fUVcoord[i];
 
  234 TView3D& TView3D::operator=(
const TView3D& tv)
 
  237       TView::operator=(tv);
 
  238       fLatitude=tv.fLatitude;
 
  239       fLongitude=tv.fLongitude;
 
  246       fOutline=tv.fOutline;
 
  247       fDefaultOutline=tv.fDefaultOutline;
 
  248       fAutoRange=tv.fAutoRange;
 
  249       fChanged=tv.fChanged;
 
  250       for(Int_t i=0; i<16; i++) {
 
  253          fTnorm[i]=tv.fTnorm[i];
 
  254          fTback[i]=tv.fTback[i];
 
  256       for(Int_t i=0; i<3; i++) {
 
  257          fRmax[i]=tv.fRmax[i];
 
  258          fRmin[i]=tv.fRmin[i];
 
  266       for(Int_t i=0; i<4; i++)
 
  267          fUVcoord[i]=tv.fUVcoord[i];
 
  277    if (fOutline) fOutline->Delete();
 
  297 void TView3D::AxisVertex(Double_t, Double_t *av, Int_t &ix1, Int_t &ix2, Int_t &iy1, Int_t &iy2, Int_t &iz1, Int_t &iz2)
 
  300       { fRmin[0], fRmin[1], fRmin[2] },
 
  301       { fRmax[0], fRmin[1], fRmin[2] },
 
  302       { fRmax[0], fRmax[1], fRmin[2] },
 
  303       { fRmin[0], fRmax[1], fRmin[2] },
 
  304       { fRmin[0], fRmin[1], fRmax[2] },
 
  305       { fRmax[0], fRmin[1], fRmax[2] },
 
  306       { fRmax[0], fRmax[1], fRmax[2] },
 
  307       { fRmin[0], fRmax[1], fRmax[2] }
 
  309    Int_t inodes[4][8] = {
 
  310       { 2,3,4,1, 6,7,8,5 }, 
 
  311       { 3,4,1,2, 7,8,5,6 }, 
 
  312       { 1,2,3,4, 5,6,7,8 }, 
 
  315    Int_t ixyminmax[16][4] = { 
 
  339    if (fTnorm[ 8] <= 0) icase += 1; 
 
  340    if (fTnorm[ 9] <= 0) icase += 2; 
 
  341    for (Int_t i=0; i<8; ++i) {
 
  342       Int_t k = inodes[icase][i] - 1;
 
  349    if (fTnorm[10] < 0) icase += 4; 
 
  350    if (fTnorm[ 6] < 0) icase += 8; 
 
  351    ix1 = ixyminmax[icase][0];
 
  352    ix2 = ixyminmax[icase][1];
 
  353    iy1 = ixyminmax[icase][2];
 
  354    iy2 = ixyminmax[icase][3];
 
  355    iz1 = (icase < 8) ? 1 : 3;
 
  356    iz2 = (icase < 8) ? 5 : 7;
 
  399 void TView3D::DefinePerspectiveView()
 
  404    for (i=0; i<3; i++) cov[i] = 0.5*(fRmax[i]+fRmin[i]);
 
  406    Double_t c1 = TMath::Cos(fPsi*kRad);
 
  407    Double_t s1 = TMath::Sin(fPsi*kRad);
 
  408    Double_t c2 = TMath::Cos(fLatitude*kRad);
 
  409    Double_t s2 = TMath::Sin(fLatitude*kRad);
 
  410    Double_t s3 = TMath::Cos(fLongitude*kRad);
 
  411    Double_t c3 = -TMath::Sin(fLongitude*kRad);
 
  413    t12[0] =  c1*c3 - s1*c2*s3;
 
  414    t12[4] =  c1*s3 + s1*c2*c3;
 
  418    t12[1] =  -s1*c3 - c1*c2*s3;
 
  419    t12[5] = -s1*s3 + c1*c2*c3;
 
  429    t12[12] = -(cov[0]*t12[0]+cov[1]*t12[4]+cov[2]*t12[8]);
 
  430    t12[13] = -(cov[0]*t12[1]+cov[1]*t12[5]+cov[2]*t12[9]);
 
  431    t12[14] = -(cov[0]*t12[2]+cov[1]*t12[6]+cov[2]*t12[10]);
 
  447    Double_t a2 = -fUVcoord[0]/fDproj;   
 
  448    Double_t b2 = -fUVcoord[1]/fDproj;   
 
  455    fTnorm[0] = t12[0] + a2*t12[2];
 
  456    fTnorm[1] = t12[1] + b2*t12[2];
 
  460    fTnorm[4] = t12[4] + a2*t12[6];
 
  461    fTnorm[5] = t12[5] + b2*t12[6];
 
  465    fTnorm[8]  = t12[8] + a2*t12[10];
 
  466    fTnorm[9]  = t12[9] + b2*t12[10];
 
  467    fTnorm[10] = t12[10];
 
  470    fTnorm[12] = t12[12] + a2*t12[14];
 
  471    fTnorm[13] = t12[13] + b2*t12[14];
 
  472    fTnorm[14] = t12[14];
 
  479    Double_t sz = 1./fDproj;
 
  480    Double_t sx = 1./fUVcoord[2];
 
  481    Double_t sy = 1./fUVcoord[3];
 
  513 void TView3D::DefineViewDirection(
const Double_t *s, 
const Double_t *c,
 
  514                                 Double_t cosphi, Double_t sinphi,
 
  515                                 Double_t costhe, Double_t sinthe,
 
  516                                 Double_t cospsi, Double_t sinpsi,
 
  517                                 Double_t *tnorm, Double_t *tback)
 
  519    if (IsPerspective()) {
 
  520       DefinePerspectiveView();
 
  524    Double_t tran[16]   , rota[16]      ;
 
  525    Double_t c1, c2, c3, s1, s2, s3, scalex, scaley, scalez;
 
  536    tran[0] = 1 / scalex;
 
  539    tran[3] = -c[0] / scalex;
 
  542    tran[5] = 1 / scaley;
 
  544    tran[7] = -c[1] / scaley;
 
  548    tran[10] = 1 / scalez;
 
  549    tran[11] = -c[2] / scalez;
 
  567    rota[0] = c1*c3 - s1*c2*s3;
 
  568    rota[1] = c1*s3 + s1*c2*c3;
 
  572    rota[4] = -s1*c3 - c1* c2*s3;
 
  573    rota[5] = -s1*s3 + c1* c2*c3;
 
  588    for (i = 1; i <= 3; ++i) {
 
  589       for (k = 1; k <= 4; ++k) {
 
  590          tnorm[k + (i << 2)] = rota[(i << 2) - 4]*tran[k - 1] + rota[(i
 
  591                  << 2) - 3]*tran[k + 3] + rota[(i << 2) - 2]*tran[k +7]
 
  592                  + rota[(i << 2) - 1]*tran[k + 11];
 
  607    for (i = 1; i <= 3; ++i) {
 
  608       for (k = 1; k <= 4; ++k) {
 
  609          tback[k + (i << 2)] = tran[(i << 2) - 4]*rota[(k << 2) - 4] +
 
  610             tran[(i << 2) - 3]*rota[(k << 2) - 3] + tran[(i << 2) -2]
 
  611             *rota[(k << 2) - 2] + tran[(i << 2) - 1]*rota[(k <<2) - 1];
 
  619 void TView3D::DrawOutlineCube(TList *outline, Double_t *rmin, Double_t *rmax)
 
  621    TPolyLine3D::DrawOutlineCube(outline,rmin,rmax);
 
  627 void TView3D::ExecuteEvent(Int_t event, Int_t px, Int_t py)
 
  629    ExecuteRotateView(event,px,py);
 
  641 void TView3D::ExecuteRotateView(Int_t event, Int_t px, Int_t py)
 
  643    static Int_t system, framewasdrawn;
 
  644    static Double_t xrange, yrange, xmin, ymin, longitude1, latitude1, longitude2, latitude2;
 
  645    static Double_t newlatitude, newlongitude, oldlatitude, oldlongitude;
 
  646    Double_t dlatitude, dlongitude, x, y;
 
  649    Bool_t opaque  = gPad->OpaqueMoving();
 
  652    if (!gPad->IsEditable()) 
return;
 
  653    gPad->AbsCoordinates(kTRUE);
 
  659       MoveViewCommand(Char_t(px), py);
 
  663       gPad->SetCursor(kRotate);
 
  669       xmin   = gPad->GetX1();
 
  670       ymin   = gPad->GetY1();
 
  671       xrange = gPad->GetX2() - xmin;
 
  672       yrange = gPad->GetY2() - ymin;
 
  673       x      = gPad->PixeltoX(px);
 
  674       y      = gPad->PixeltoY(py);
 
  675       system = GetSystem();
 
  677       if (system == kCARTESIAN || system == kPOLAR || system == 11 || IsPerspective()) {
 
  678          longitude1 = 180*(x-xmin)/xrange;
 
  679          latitude1  =  90*(y-ymin)/yrange;
 
  681          latitude1  =  90*(x-xmin)/xrange;
 
  682          longitude1 = 180*(y-ymin)/yrange;
 
  684       newlongitude = oldlongitude = -90 - gPad->GetPhi();
 
  685       newlatitude  = oldlatitude  =  90 - gPad->GetTheta();
 
  698       if (framewasdrawn && !opaque) fOutline->Paint();
 
  700       x = gPad->PixeltoX(px);
 
  701       y = gPad->PixeltoY(py);
 
  702       if (system == kCARTESIAN || system == kPOLAR || system == 11 || IsPerspective()) {
 
  703          longitude2 = 180*(x-xmin)/xrange;
 
  704          latitude2  =  90*(y-ymin)/yrange;
 
  706          latitude2  =  90*(x-xmin)/xrange;
 
  707          longitude2 = 180*(y-ymin)/yrange;
 
  709       dlongitude   = longitude2   - longitude1;
 
  710       dlatitude    = latitude2    - latitude1;
 
  711       newlatitude  = oldlatitude  + dlatitude;
 
  712       newlongitude = oldlongitude - dlongitude;
 
  714       ResetView(newlongitude, newlatitude, psideg, irep);
 
  719          SetView(newlongitude, newlatitude, psideg, irep);
 
  720          gPad->SetPhi(-90-newlongitude);
 
  721          gPad->SetTheta(90-newlatitude);
 
  722          gPad->Modified(kTRUE);
 
  728       if (gROOT->IsEscaped()) {
 
  729          gROOT->SetEscape(kFALSE);
 
  732             SetView(oldlongitude, oldlatitude, psideg, irep);
 
  733             gPad->SetPhi(-90-oldlongitude);
 
  734             gPad->SetTheta(90-oldlatitude);
 
  735             gPad->Modified(kTRUE);
 
  748          TVirtualViewer3D *viewer = gPad->GetViewer3D();
 
  749          if (viewer && !strcmp(viewer->IsA()->GetName(),
"TView3Der3DPad")) {
 
  750             gPad->ReleaseViewer3D();
 
  758       SetView(newlongitude, newlatitude, psideg, irep);
 
  759       gPad->SetPhi(-90-newlongitude);
 
  760       gPad->SetTheta(90-newlatitude);
 
  761       gPad->Modified(kTRUE);
 
  764       gVirtualX->SetLineColor(-1);
 
  765       gVirtualX->SetLineStyle(-1);
 
  766       gVirtualX->SetLineWidth(-1);
 
  771    gPad->AbsCoordinates(kFALSE);
 
  785 void TView3D::FindNormal(Double_t x, Double_t  y, Double_t z, Double_t &zn)
 
  787    zn = x*(fTN[1] * fTN[6] - fTN[2] * fTN[5]) + y*(fTN[2] * fTN[4] -
 
  788            fTN[0] * fTN[6]) + z*(fTN[0] * fTN[5] - fTN[1] * fTN[4]);
 
  805 void TView3D::FindPhiSectors(Int_t iopt, Int_t &kphi, Double_t *aphi, Int_t &iphi1, Int_t &iphi2)
 
  809    Double_t x1, x2, z1, z2, phi1, phi2;
 
  814    if (aphi[kphi + 1] == aphi[1]) aphi[kphi + 1] += 360;
 
  815    dphi = TMath::Abs(aphi[kphi + 1] - aphi[1]);
 
  817       aphi[kphi + 2] = (aphi[1] + aphi[kphi + 1]) / (
float)2. + 180;
 
  818       aphi[kphi + 3] = aphi[1] + 360;
 
  824    for (i = 1; i <= kphi; ++i) {
 
  826       phi2 = kRad*aphi[i + 1];
 
  827       x1 = fTN[0]*TMath::Cos(phi1) + fTN[1]*TMath::Sin(phi1);
 
  828       x2 = fTN[0]*TMath::Cos(phi2) + fTN[1]*TMath::Sin(phi2);
 
  829       if (x1 >= 0 && x2 > 0) 
continue;
 
  830       if (x1 <= 0 && x2 < 0) 
continue;
 
  836       Error(
"FindPhiSectors", 
"something strange: num. of critical sector not equal 2");
 
  843    phi1 = kRad*(aphi[iphi[0]] + aphi[iphi[0] + 1]) / (
float)2.;
 
  844    phi2 = kRad*(aphi[iphi[1]] + aphi[iphi[1] + 1]) / (
float)2.;
 
  845    z1 = fTN[8]*TMath::Cos(phi1) + fTN[9]*TMath::Sin(phi1);
 
  846    z2 = fTN[8]*TMath::Cos(phi2) + fTN[9]*TMath::Sin(phi2);
 
  847    if ((z1 <= z2 && iopt == 1) || (z1 > z2 && iopt == 2)) {
 
  871 void TView3D::FindThetaSectors(Int_t iopt, Double_t phi, Int_t &kth, Double_t *ath, Int_t &ith1, Int_t &ith2)
 
  874    Double_t z1, z2, cosphi, sinphi, tncons, th1, th2, dth;
 
  880    dth = TMath::Abs(ath[kth + 1] - ath[1]);
 
  882       ath[kth + 2] = 0.5*(ath[1] + ath[kth + 1]) + 180;
 
  883       ath[kth + 3] = ath[1] + 360;
 
  888    cosphi = TMath::Cos(phi*kRad);
 
  889    sinphi = TMath::Sin(phi*kRad);
 
  891    for (i = 1; i <= kth; ++i) {
 
  893       th2 = kRad*ath[i + 1];
 
  894       FindNormal(TMath::Cos(th1)*cosphi, TMath::Cos(th1)*sinphi, -TMath::Sin(th1), z1);
 
  895       FindNormal(TMath::Cos(th2)*cosphi, TMath::Cos(th2)*sinphi, -TMath::Sin(th2), z2);
 
  896       if (z1 >= 0 && z2 > 0) 
continue;
 
  897       if (z1 <= 0 && z2 < 0) 
continue;
 
  903       Error(
"FindThetaSectors", 
"Something strange: num. of critical sectors not equal 2");
 
  910    tncons = fTN[8]*TMath::Cos(phi*kRad) + fTN[9]*TMath::Sin(phi*kRad);
 
  911    th1    = kRad*(ath[ith[0]] + ath[ith[0] + 1]) / (
float)2.;
 
  912    th2    = kRad*(ath[ith[1]] + ath[ith[1] + 1]) / (
float)2.;
 
  913    z1     = tncons*TMath::Sin(th1) + fTN[10]*TMath::Cos(th1);
 
  914    z2     = tncons*TMath::Sin(th2) + fTN[10]*TMath::Cos(th2);
 
  915    if ((z1 <= z2 && iopt == 1) || (z1 > z2 && iopt == 2)) {
 
  932 void TView3D::FindScope(Double_t *scale, Double_t *center, Int_t &irep)
 
  935    Double_t sqrt3 = 0.5*TMath::Sqrt(3.0);
 
  937    for (Int_t i = 0; i < 3; i++) {
 
  938       if (fRmin[i] >= fRmax[i]) { irep = -1; 
return;}
 
  939       scale[i]  = sqrt3*(fRmax[i] - fRmin[i]);
 
  940       center[i] = 0.5*(fRmax[i] + fRmin[i]);
 
  970 Int_t TView3D::GetDistancetoAxis(Int_t axis, Int_t px, Int_t py, Double_t &ratio)
 
  972    Double_t x1,y1,x2,y2;
 
  977    if (fSystem != kCARTESIAN) 
return 9998; 
 
  979       x1 = gPad->XtoAbsPixel(fX1[0]);
 
  980       y1 = gPad->YtoAbsPixel(fX1[1]);
 
  981       x2 = gPad->XtoAbsPixel(fX2[0]);
 
  982       y2 = gPad->YtoAbsPixel(fX2[1]);
 
  983    } 
else if (axis == 2) {
 
  984       x1 = gPad->XtoAbsPixel(fY1[0]);
 
  985       y1 = gPad->YtoAbsPixel(fY1[1]);
 
  986       x2 = gPad->XtoAbsPixel(fY2[0]);
 
  987       y2 = gPad->YtoAbsPixel(fY2[1]);
 
  989       x1 = gPad->XtoAbsPixel(fZ1[0]);
 
  990       y1 = gPad->YtoAbsPixel(fZ1[1]);
 
  991       x2 = gPad->XtoAbsPixel(fZ2[0]);
 
  992       y2 = gPad->YtoAbsPixel(fZ2[1]);
 
  994    Double_t xx1   = x  - x1;
 
  995    Double_t xx2   = x  - x2;
 
  996    Double_t x1x2  = x1 - x2;
 
  997    Double_t yy1   = y  - y1;
 
  998    Double_t yy2   = y  - y2;
 
  999    Double_t y1y2  = y1 - y2;
 
 1000    Double_t a     = xx1*xx1   + yy1*yy1;
 
 1001    Double_t b     = xx2*xx2   + yy2*yy2;
 
 1002    Double_t c     = x1x2*x1x2 + y1y2*y1y2;
 
 1003    if (c <= 0) 
return 9999;
 
 1004    Double_t v     = TMath::Sqrt(c);
 
 1005    Double_t u     = (a - b + c)/(2*v);
 
 1006    Double_t d     = TMath::Abs(a - u*u);
 
 1008    Int_t dist = Int_t(TMath::Sqrt(d) - 0.5);
 
 1016 Double_t TView3D::GetExtent()
 const 
 1018    Double_t dx = 0.5*(fRmax[0]-fRmin[0]);
 
 1019    Double_t dy = 0.5*(fRmax[1]-fRmin[1]);
 
 1020    Double_t dz = 0.5*(fRmax[2]-fRmin[2]);
 
 1021    Double_t extent = TMath::Sqrt(dx*dx+dy*dy+dz*dz);
 
 1028 void TView3D::GetRange(Float_t *min, Float_t *max)
 
 1030    for (Int_t i = 0; i < 3; max[i] = fRmax[i], min[i] = fRmin[i], i++) { }
 
 1036 void TView3D::GetRange(Double_t *min, Double_t *max)
 
 1038    for (Int_t i = 0; i < 3; max[i] = fRmax[i], min[i] = fRmin[i], i++) { }
 
 1044 void TView3D::GetWindow(Double_t &u0, Double_t &v0, Double_t &du, Double_t &dv)
 const 
 1055 Bool_t TView3D::IsClippedNDC(Double_t *p)
 const 
 1057    if (TMath::Abs(p[0])>p[2]) 
return kTRUE;
 
 1058    if (TMath::Abs(p[1])>p[2]) 
return kTRUE;
 
 1069 void TView3D::NDCtoWC(
const Float_t* pn, Float_t* pw)
 
 1071    Float_t x = pn[0], y = pn[1], z = pn[2];
 
 1072    pw[0] = fTback[0]*x + fTback[1]*y + fTback[2]*z  + fTback[3];
 
 1073    pw[1] = fTback[4]*x + fTback[5]*y + fTback[6]*z  + fTback[7];
 
 1074    pw[2] = fTback[8]*x + fTback[9]*y + fTback[10]*z + fTback[11];
 
 1084 void TView3D::NDCtoWC(
const Double_t* pn, Double_t* pw)
 
 1086    Double_t x = pn[0], y = pn[1], z = pn[2];
 
 1087    pw[0] = fTback[0]*x + fTback[1]*y + fTback[2]*z  + fTback[3];
 
 1088    pw[1] = fTback[4]*x + fTback[5]*y + fTback[6]*z  + fTback[7];
 
 1089    pw[2] = fTback[8]*x + fTback[9]*y + fTback[10]*z + fTback[11];
 
 1099 void TView3D::NormalWCtoNDC(
const Float_t *pw, Float_t *pn)
 
 1101    Double_t x, y, z, a1, a2, a3, b1, b2, b3, c1, c2, c3;
 
 1115    pn[0] = x*(b2*c3 - b3*c2) + y*(b3*c1 - b1*c3) + z*(b1*c2 - b2*c1);
 
 1116    pn[1] = x*(c2*a3 - c3*a2) + y*(c3*a1 - c1*a3) + z*(c1*a2 - c2*a1);
 
 1117    pn[2] = x*(a2*b3 - a3*b2) + y*(a3*b1 - a1*b3) + z*(a1*b2 - a2*b1);
 
 1127 void TView3D::NormalWCtoNDC(
const Double_t *pw, Double_t *pn)
 
 1129    Double_t x, y, z, a1, a2, a3, b1, b2, b3, c1, c2, c3;
 
 1143    pn[0] = x*(b2*c3 - b3*c2) + y*(b3*c1 - b1*c3) + z*(b1*c2 - b2*c1);
 
 1144    pn[1] = x*(c2*a3 - c3*a2) + y*(c3*a1 - c1*a3) + z*(c1*a2 - c2*a1);
 
 1145    pn[2] = x*(a2*b3 - a3*b2) + y*(a3*b1 - a1*b3) + z*(a1*b2 - a2*b1);
 
 1157 void TView3D::PadRange(Int_t rback)
 
 1160    Double_t x, y, z, r1, r2, r3, xx, yy, smax[2];
 
 1161    Double_t xgraf[6], ygraf[6];
 
 1163    for (i = 1; i <= 2; ++i) {
 
 1164       smax[i - 1] = fTnorm[(i << 2) - 1];
 
 1165       for (k = 1; k <= 3; ++k) {
 
 1166          if (fTnorm[k + (i << 2) - 5] < 0) {
 
 1167             smax[i - 1] += fTnorm[k + (i << 2) - 5]*fRmin[k-1];
 
 1169             smax[i - 1] += fTnorm[k + (i << 2) - 5]*fRmax[k-1];
 
 1175    Double_t xmin = -smax[0];
 
 1176    Double_t xmax = smax[0];
 
 1177    Double_t ymin = -smax[1];
 
 1178    Double_t ymax = smax[1];
 
 1179    Double_t dx   = xmax-xmin;
 
 1180    Double_t dy   = ymax-ymin;
 
 1181    Double_t dxr  = dx/(1 - gPad->GetLeftMargin() - gPad->GetRightMargin());
 
 1182    Double_t dyr  = dy/(1 - gPad->GetBottomMargin() - gPad->GetTopMargin());
 
 1186    gPad->Range(xmin - dxr*gPad->GetLeftMargin(),
 
 1187       ymin - dyr*gPad->GetBottomMargin(),
 
 1188       xmax + dxr*gPad->GetRightMargin(),
 
 1189       ymax + dyr*gPad->GetTopMargin());
 
 1190    gPad->RangeAxis(xmin, ymin, xmax, ymax);
 
 1197       xgraf[0] = -smax[0];
 
 1198       xgraf[1] = -smax[0];
 
 1199       xgraf[2] = -smax[0];
 
 1200       xgraf[3] = -smax[0];
 
 1203       ygraf[0] = -smax[1];
 
 1205       ygraf[2] = -smax[1];
 
 1208       ygraf[4] = -smax[1];
 
 1209       for (i = 1; i <= 8; ++i) {
 
 1210          x = 0.5*((1 - r1)*fRmin[0] + (r1 + 1)*fRmax[0]);
 
 1211          y = 0.5*((1 - r2)*fRmin[1] + (r2 + 1)*fRmax[1]);
 
 1212          z = 0.5*((1 - r3)*fRmin[2] + (r3 + 1)*fRmax[2]);
 
 1213          xx = fTnorm[0]*x + fTnorm[1]*y + fTnorm[2]*z + fTnorm[3];
 
 1214          yy = fTnorm[4]*x + fTnorm[5]*y + fTnorm[6]*z + fTnorm[7];
 
 1215          if (TMath::Abs(xx - xgraf[1]) <= 1e-4) {
 
 1216             if (ygraf[1] >= yy) ygraf[1] = yy;
 
 1217             if (ygraf[2] <= yy) ygraf[2] = yy;
 
 1219          if (TMath::Abs(xx - xgraf[5]) <= 1e-4) {
 
 1220             if (ygraf[5] >= yy) ygraf[5] = yy;
 
 1221             if (ygraf[4] <= yy) ygraf[4] = yy;
 
 1223          if (TMath::Abs(yy - ygraf[0]) <= 1e-4) xgraf[0] = xx;
 
 1224          if (TMath::Abs(yy - ygraf[3]) <= 1e-4) xgraf[3] = xx;
 
 1226          if (i % 2 == 0) r2 = -r2;
 
 1229       gPad->PaintFillArea(6, xgraf, ygraf);
 
 1236 void  TView3D::SetAxisNDC(
const Double_t *x1, 
const Double_t *x2, 
const Double_t *y1, 
const Double_t *y2, 
const Double_t *z1, 
const Double_t *z2)
 
 1238    for (Int_t i=0;i<3;i++) {
 
 1251 void TView3D::SetDefaultWindow()
 
 1254    Double_t screen_factor = 1.;
 
 1256    Double_t extent = GetExtent();
 
 1258    fDproj = 0.5*extent;
 
 1261    fUpix = gPad->GetWw()*gPad->GetAbsWNDC();
 
 1264    fVpix = gPad->GetWh()*gPad->GetAbsHNDC();
 
 1265    du = 0.5*screen_factor*fDproj;
 
 1266    dv = du*fVpix/fUpix;   
 
 1267    SetWindow(0, 0, du, dv);
 
 1291 void TView3D::SetOutlineToCube()
 
 1294       fDefaultOutline = kTRUE;
 
 1295       fOutline = 
new TList();
 
 1297    DrawOutlineCube((TList*)fOutline,fRmin,fRmax);
 
 1303 void TView3D::SetParallel()
 
 1305    if (!IsPerspective()) 
return;
 
 1306    SetBit(kPerspective, kFALSE);
 
 1308    ResetView(fLongitude, fLatitude, fPsi, irep);
 
 1314 void TView3D::SetPerspective()
 
 1316    if (IsPerspective()) 
return;
 
 1317    SetBit(kPerspective, kTRUE);
 
 1320    ResetView(fLongitude, fLatitude, fPsi, irep);
 
 1326 void TView3D::SetRange(
const Double_t *min, 
const Double_t *max)
 
 1329    for (Int_t i = 0; i < 3; fRmax[i] = max[i], fRmin[i] = min[i], i++) { }
 
 1330    if (IsPerspective()) SetDefaultWindow();
 
 1331    ResetView(fLongitude, fLatitude, fPsi, irep);
 
 1333       Error(
"SetRange", 
"problem setting view");
 
 1334    if(fDefaultOutline) SetOutlineToCube();
 
 1349 void TView3D::SetRange(Double_t x0, Double_t y0, Double_t z0, Double_t x1, Double_t y1, Double_t z1, Int_t flag)
 
 1351    Double_t rmax[3], rmin[3];
 
 1355          GetRange(rmin, rmax);
 
 1356          rmin[0] = x0 < rmin[0] ? x0 : rmin[0];
 
 1357          rmin[1] = y0 < rmin[1] ? y0 : rmin[1];
 
 1358          rmin[2] = z0 < rmin[2] ? z0 : rmin[2];
 
 1359          rmax[0] = x1 > rmax[0] ? x1 : rmax[0];
 
 1360          rmax[1] = y1 > rmax[1] ? y1 : rmax[1];
 
 1361          rmax[2] = z1 > rmax[2] ? z1 : rmax[2];
 
 1365          GetRange(rmin, rmax);
 
 1366          rmin[0] = x0 > rmin[0] ? x0 : rmin[0];
 
 1367          rmin[1] = y0 > rmin[1] ? y0 : rmin[1];
 
 1368          rmin[2] = z0 > rmin[2] ? z0 : rmin[2];
 
 1369          rmax[0] = x1 < rmax[0] ? x1 : rmax[0];
 
 1370          rmax[1] = y1 < rmax[1] ? y1 : rmax[1];
 
 1371          rmax[2] = z1 < rmax[2] ? z1 : rmax[2];
 
 1375          rmin[0] = x0; rmax[0] = x1;
 
 1376          rmin[1] = y0; rmax[1] = y1;
 
 1377          rmin[2] = z0; rmax[2] = z1;
 
 1379    SetRange(rmin, rmax);
 
 1385 void TView3D::SetWindow(Double_t u0, Double_t v0, Double_t du, Double_t dv)
 
 1396 void TView3D::SetView(Double_t longitude, Double_t latitude, Double_t psi, Int_t &irep)
 
 1398    ResetView(longitude, latitude, psi, irep);
 
 1404 void TView3D::ResizePad()
 
 1406    if (!IsPerspective()) 
return;
 
 1407    Double_t upix = fUpix;
 
 1408    Double_t vpix = fVpix;
 
 1411    fUpix = gPad->GetWw()*gPad->GetAbsWNDC();
 
 1414    fVpix = gPad->GetWh()*gPad->GetAbsHNDC();
 
 1415    Double_t u0 = fUVcoord[0]*fUpix/upix;
 
 1416    Double_t v0 = fUVcoord[1]*fVpix/vpix;
 
 1417    Double_t du = fUVcoord[2]*fUpix/upix;
 
 1418    Double_t dv = fUVcoord[3]*fVpix/vpix;
 
 1419    SetWindow(u0, v0, du, dv);
 
 1420    DefinePerspectiveView();
 
 1436 void TView3D::ResetView(Double_t longitude, Double_t latitude, Double_t psi, Int_t &irep)
 
 1438    Double_t scale[3],  centre[3];
 
 1439    Double_t c1, c2, c3, s1, s2, s3;
 
 1443    FindScope(scale, centre, irep);
 
 1445       Error(
"ResetView", 
"Error in min-max scope");
 
 1450    fLongitude = longitude;
 
 1452    fLatitude  = latitude;
 
 1454    if (IsPerspective()) {
 
 1455       DefinePerspectiveView();
 
 1459    c1 = TMath::Cos(longitude*kRad);
 
 1460    s1 = TMath::Sin(longitude*kRad);
 
 1461    c2 = TMath::Cos(latitude*kRad);
 
 1462    s2 = TMath::Sin(latitude*kRad);
 
 1463    c3 = TMath::Cos(psi*kRad);
 
 1464    s3 = TMath::Sin(psi*kRad);
 
 1465    DefineViewDirection(scale, centre, c1, s1, c2, s2, c3, s3, fTnorm, fTback);
 
 1468    DefineViewDirection(scale, centre, c1, s1, c2, s2, c3, s3, fTN, fTB);
 
 1478 void TView3D::WCtoNDC(
const Float_t *pw, Float_t *pn)
 
 1480    Float_t x = pw[0], y = pw[1], z = pw[2];
 
 1483    if (IsPerspective()) {
 
 1484       for (Int_t i=0; i<3; i++) {
 
 1485          pn[i] = fTnorm[i]*x + fTnorm[i+4]*y + fTnorm[i+8]*z + fTnorm[i+12];
 
 1498    pn[0] = fTnorm[0]*x + fTnorm[1]*y + fTnorm[2]*z  + fTnorm[3];
 
 1499    pn[1] = fTnorm[4]*x + fTnorm[5]*y + fTnorm[6]*z  + fTnorm[7];
 
 1500    pn[2] = fTnorm[8]*x + fTnorm[9]*y + fTnorm[10]*z + fTnorm[11];
 
 1510 void TView3D::WCtoNDC(
const Double_t *pw, Double_t *pn)
 
 1512    Double_t x = pw[0], y = pw[1], z = pw[2];
 
 1515    if (IsPerspective()) {
 
 1516       for (Int_t i=0; i<3; i++) {
 
 1517          pn[i] = fTnorm[i]*x + fTnorm[i+4]*y + fTnorm[i+8]*z + fTnorm[i+12];
 
 1530    pn[0] = fTnorm[0]*x + fTnorm[1]*y + fTnorm[2]*z  + fTnorm[3];
 
 1531    pn[1] = fTnorm[4]*x + fTnorm[5]*y + fTnorm[6]*z  + fTnorm[7];
 
 1532    pn[2] = fTnorm[8]*x + fTnorm[9]*y + fTnorm[10]*z + fTnorm[11];
 
 1538 void TView3D::AdjustPad(TVirtualPad *pad)
 
 1540    TVirtualPad *thisPad = pad;
 
 1541    if (!thisPad) thisPad = gPad;
 
 1544       thisPad->AbsCoordinates(kFALSE);
 
 1546       thisPad->Modified();
 
 1554 void TView3D::RotateView(Double_t phi, Double_t theta, TVirtualPad *pad)
 
 1559    SetView(p, t, 0, iret);
 
 1562    TVirtualPad *thisPad = pad;
 
 1563    if (!thisPad) thisPad = gPad;
 
 1565       thisPad->SetPhi(-90-p);
 
 1566       thisPad->SetTheta(90-t);
 
 1567       thisPad->Modified();
 
 1575 void TView3D::SideView(TVirtualPad *pad)
 
 1577    RotateView(0,90.0,pad);
 
 1583 void TView3D::FrontView(TVirtualPad *pad)
 
 1585    RotateView(270.0,90.0,pad);
 
 1591 void TView3D::TopView(TVirtualPad *pad)
 
 1593    RotateView(270.0,0.0,pad);
 
 1599 void TView3D::ToggleRulers(TVirtualPad *pad)
 
 1601    TAxis3D::ToggleRulers(pad);
 
 1608 void TView3D::ToggleZoom(TVirtualPad *pad)
 
 1610    TAxis3D::ToggleZoom(pad);
 
 1616 void TView3D::AdjustScales(TVirtualPad *pad)
 
 1618    Double_t min[3],max[3];
 
 1621    Double_t maxSide = 0;
 
 1623    for (i=0;i<3; i++) maxSide = TMath::Max(maxSide,max[i]-min[i]);
 
 1625    for (i=0;i<3; i++) max[i] += maxSide - (max[i]-min[i]);
 
 1634 void TView3D::Centered3DImages(TVirtualPad *pad)
 
 1636    Double_t min[3],max[3];
 
 1639    for (i=0;i<3; i++) {
 
 1640       if (max[i] > 0) min[i] = -max[i];
 
 1641       else            max[i] = -min[i];
 
 1650 void TView3D::UnzoomView(TVirtualPad *pad,Double_t unZoomFactor )
 
 1652    if (TMath::Abs(unZoomFactor) < 0.001) 
return;
 
 1653    ZoomView(pad,1./unZoomFactor);
 
 1659 void TView3D::ZoomView(TVirtualPad *pad,Double_t zoomFactor)
 
 1661    if (TMath::Abs(zoomFactor) < 0.001) 
return;
 
 1662    Double_t min[3],max[3];
 
 1665    for (i=0;i<3; i++) {
 
 1667       Double_t c = (max[i]+min[i])/2;
 
 1669       Double_t s = (max[i]-min[i])/(2*zoomFactor);
 
 1682 void TView3D::MoveFocus(Double_t *cov, Double_t dx, Double_t dy, Double_t dz, Int_t nsteps,
 
 1683                       Double_t dlong, Double_t dlat, Double_t dpsi)
 
 1685    if (!IsPerspective()) 
return;
 
 1686    if (nsteps<1) 
return;
 
 1687    Double_t fc = 1./Double_t(nsteps);
 
 1688    Double_t oc[3], od[3], dir[3];
 
 1693    for (i=0; i<3; i++) {
 
 1694       oc[i] = 0.5*(fRmin[i]+fRmax[i]);
 
 1695       od[i] = 0.5*(fRmax[i]-fRmin[i]);
 
 1697    Double_t dox = cov[0]-oc[0];
 
 1698    Double_t doy = cov[1]-oc[1];
 
 1699    Double_t doz = cov[2]-oc[2];
 
 1701    Double_t dd = TMath::Sqrt(dox*dox+doy*doy+doz*doz);
 
 1708    dox = fc*(dx-od[0]);
 
 1709    doy = fc*(dy-od[1]);
 
 1710    doz = fc*(dz-od[2]);
 
 1711    for (i=0; i<nsteps; i++) {
 
 1718       for (j=0; j<3; j++) {
 
 1719          fRmin[j] = oc[j]-od[j];
 
 1720          fRmax[j] = oc[j]+od[j];
 
 1724       fLongitude += dlong;
 
 1726       DefinePerspectiveView();
 
 1738 void TView3D::MoveViewCommand(Char_t option, Int_t count)
 
 1740    if (count <= 0) count = 1;
 
 1786 void TView3D::MoveWindow(Char_t option)
 
 1788    if (!IsPerspective()) 
return;
 
 1789    Double_t shiftu = 0.1*fUVcoord[2];
 
 1790    Double_t shiftv = 0.1*fUVcoord[3];
 
 1794          fUVcoord[0] += shiftu;
 
 1798          fUVcoord[0] -= shiftu;
 
 1802          fUVcoord[1] += shiftv;
 
 1806          fUVcoord[1] -= shiftv;
 
 1811    DefinePerspectiveView();
 
 1821 void TView3D::ZoomIn()
 
 1823    if (!IsPerspective()) 
return;
 
 1824    Double_t extent = GetExtent();
 
 1826    if (fDview<extent) {
 
 1827       fDview -= fc*extent;
 
 1831    DefinePerspectiveView();
 
 1841 void TView3D::ZoomOut()
 
 1843    if (!IsPerspective()) 
return;
 
 1844    Double_t extent = GetExtent();
 
 1846    if (fDview<extent) {
 
 1847       fDview += fc*extent;
 
 1851    DefinePerspectiveView();
 
 1861 void TView3D::Streamer(TBuffer &R__b)
 
 1863    if (R__b.IsReading()) {
 
 1865       Version_t R__v = R__b.ReadVersion(&R__s, &R__c);
 
 1867          R__b.ReadClassBuffer(TView3D::Class(), 
this, R__v, R__s, R__c);
 
 1874       if (R__b.GetParent() && R__b.GetVersionOwner() < 22500) { 
 
 1875          TObject::Streamer(R__b);
 
 1876          TAttLine::Streamer(R__b);
 
 1877          Float_t single, sa[12];
 
 1880          R__b >> single; fLatitude = single;
 
 1881          R__b >> single; fLongitude = single;
 
 1882          R__b >> single; fPsi = single;
 
 1883          R__b.ReadStaticArray(sa);   
for (i=0;i<12;i++) fTN[i] = sa[i];
 
 1884          R__b.ReadStaticArray(sa);   
for (i=0;i<12;i++) fTB[i] = sa[i];
 
 1885          R__b.ReadStaticArray(sa);   
for (i=0;i<3;i++)  fRmax[i] = sa[i];
 
 1886          R__b.ReadStaticArray(sa);   
for (i=0;i<3;i++)  fRmin[i] = sa[i];
 
 1887          R__b.ReadStaticArray(sa);   
for (i=0;i<12;i++) fTnorm[i] = sa[i];
 
 1888          R__b.ReadStaticArray(sa);   
for (i=0;i<12;i++) fTback[i] = sa[i];
 
 1889          R__b.ReadStaticArray(sa);   
for (i=0;i<3;i++)  fX1[i] = sa[i];
 
 1890          R__b.ReadStaticArray(sa);   
for (i=0;i<3;i++)  fX2[i] = sa[i];
 
 1891          R__b.ReadStaticArray(sa);   
for (i=0;i<3;i++)  fY1[i] = sa[i];
 
 1892          R__b.ReadStaticArray(sa);   
for (i=0;i<3;i++)  fY2[i] = sa[i];
 
 1893          R__b.ReadStaticArray(sa);   
for (i=0;i<3;i++)  fZ1[i] = sa[i];
 
 1894          R__b.ReadStaticArray(sa);   
for (i=0;i<3;i++)  fZ2[i] = sa[i];
 
 1896          R__b >> fDefaultOutline;
 
 1899          TObject::Streamer(R__b);
 
 1900          TAttLine::Streamer(R__b);
 
 1904          R__b.ReadStaticArray(fTN);
 
 1905          R__b.ReadStaticArray(fTB);
 
 1906          R__b.ReadStaticArray(fRmax);
 
 1907          R__b.ReadStaticArray(fRmin);
 
 1908          R__b.ReadStaticArray(fTnorm);
 
 1909          R__b.ReadStaticArray(fTback);
 
 1910          R__b.ReadStaticArray(fX1);
 
 1911          R__b.ReadStaticArray(fX2);
 
 1912          R__b.ReadStaticArray(fY1);
 
 1913          R__b.ReadStaticArray(fY2);
 
 1914          R__b.ReadStaticArray(fZ1);
 
 1915          R__b.ReadStaticArray(fZ2);
 
 1918          R__b >> fDefaultOutline;
 
 1924       R__b.WriteClassBuffer(TView3D::Class(),
this);
 
 1929 void TView3D::Centered(){Centered3DImages();}
 
 1930 void TView3D::Front()   {FrontView();}
 
 1931 void TView3D::ShowAxis(){ToggleRulers(); }
 
 1932 void TView3D::Side()    {SideView();}
 
 1933 void TView3D::Top()     {TopView();}
 
 1934 void TView3D::ZoomMove(){ToggleZoom();}
 
 1935 void TView3D::Zoom()    {ZoomView();}
 
 1936 void TView3D::UnZoom()  {UnzoomView();}