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();}