104 const Char_t *TAxis3D::fgRulerName =
"axis3druler";
110 TAxis3D::TAxis3D() : TNamed(TAxis3D::fgRulerName,
"ruler")
114 fStickyZoom = kFALSE;
121 TAxis3D::TAxis3D(Option_t *) : TNamed(TAxis3D::fgRulerName,
"ruler")
126 fStickyZoom = kFALSE;
132 TAxis3D::TAxis3D(
const TAxis3D &axis) : TNamed(axis)
134 ((TAxis3D&)axis).Copy(*
this);
140 void TAxis3D::Copy(TObject &obj)
const
143 for (Int_t i=0;i<2;i++) fAxis[i].Copy(((TAxis3D&)obj).fAxis[i]);
149 void TAxis3D::InitSet()
151 fAxis[0].SetName(
"xaxis");
152 fAxis[1].SetName(
"yaxis");
153 fAxis[2].SetName(
"zaxis");
155 fAxis[0].Set(1,0.,1.);
156 fAxis[1].Set(1,0.,1.);
157 fAxis[2].Set(1,0.,1.);
164 void TAxis3D::Browse(TBrowser *b)
166 for (Int_t i=0;i<3;i++) b->Add(&fAxis[i],fAxis[i].GetTitle());
172 Int_t TAxis3D::DistancetoPrimitive(Int_t px, Int_t py)
175 for (
int i=0;i<3;i++) {
176 Int_t axDist = fAxis[i].DistancetoPrimitive(px,py);
177 if (dist > axDist) { dist = axDist; fSelected = &fAxis[i]; }
190 void TAxis3D::ExecuteEvent(Int_t event, Int_t px, Int_t py)
194 if (fSelected) fSelected->ExecuteEvent(event,px,py);
198 static Double_t x0, y0, x1, y1;
200 static Int_t pxold, pyold;
201 static Int_t px0, py0;
202 static Int_t linedrawn;
204 if (!fZoomMode)
return;
208 gPad->SetCursor(kCross);
213 gVirtualX->SetLineColor(-1);
214 gPad->TAttLine::Modify();
215 ((TPad *)gPad)->AbsPixeltoXY(px,py,x0,y0);
217 pxold = px; pyold = py;
222 if (linedrawn) gVirtualX->DrawBox(px0, py0, pxold, pyold, TVirtualX::kHollow);
226 gVirtualX->DrawBox(px0, py0, pxold, pyold, TVirtualX::kHollow);
231 gPad->SetDoubleBuffer(1);
232 gVirtualX->SetDrawMode(TVirtualX::kCopy);
233 TView *view = gPad->GetView();
236 Double_t min[3],max[3],viewCenter[3],viewCenterNDC[3];
238 view->GetRange(min,max);
239 for (i =0; i<3;i++) viewCenter[i] = (max[i]+min[i])/2;
240 view->WCtoNDC(viewCenter,viewCenterNDC);
242 Double_t center[3],pointNDC[3],size[3],oldSize[3];
243 ((TPad *)gPad)->AbsPixeltoXY(px,py,x1,y1);
244 pointNDC[0] = (x0+x1)/2; pointNDC[1] = (y0+y1)/2;
245 pointNDC[2] = viewCenterNDC[2];
246 view->NDCtoWC(pointNDC, center);
248 for (i =0; i<3;i++) oldSize[i] = size[i]= (max[i]-min[i])/2;
251 if (TMath::Abs(px-px0)+TMath::Abs(py - py0) > 4 ) {
253 for (i =0; i<3;i++) size[i] = -1;
255 pointNDC[0] = x0; pointNDC[1] = y0;
257 view->NDCtoWC(pointNDC, newEdge);
258 for (i =0; i<3;i++) {
259 Double_t newSize = TMath::Abs(newEdge[i]-center[i]);
260 if ( newSize/oldSize[i] > 0.002)
261 size[i] = TMath::Max(size[i], newSize);
263 size[i] = oldSize[i];
266 pointNDC[0] = x1; pointNDC[1] = y1;
268 view->NDCtoWC(pointNDC, newEdge);
269 for (i =0; i<3;i++) {
270 Double_t newSize = TMath::Abs(newEdge[i]-center[i]);
271 if ( newSize/oldSize[i] > 0.002)
272 size[i] = TMath::Max(size[i], newSize);
274 size[i] = oldSize[i];
277 if (fZooms == kMAXZOOMS) fZoom = 0;
279 memcpy(fZoomMin[fZooms],min,3*
sizeof(Float_t));
280 memcpy(fZoomMax[fZooms],max,3*
sizeof(Float_t));
283 for (i =0; i<3;i++) {
284 max[i] = center[i] + size[i];
285 min[i] = center[i] - size[i];
287 view->SetRange(min,max);
289 if(!fStickyZoom)SwitchZoom();
290 gPad->Modified(kTRUE);
302 char *TAxis3D::GetObjectInfo(Int_t , Int_t )
const
304 return (
char*)
"axis3d";
310 void TAxis3D::Paint(Option_t *)
313 PaintAxis(&axis, 90);
323 void TAxis3D::PaintAxis(TGaxis *axis, Float_t ang)
325 static Double_t epsil = 0.001;
331 Double_t x1[3], x2[3], y1[3], y2[3], z1[3], z2[3], av[24] ;
333 Int_t ix1, ix2, iy1, iy2, iz1, iz2;
336 TView *view = gPad->GetView();
338 Error(
"PaintAxis",
"no TView in current pad");
342 rad = TMath::ATan(1.) * 4. / 180.;
343 cosa = TMath::Cos(ang*rad);
344 sina = TMath::Sin(ang*rad);
346 view->AxisVertex(ang, av, ix1, ix2, iy1, iy2, iz1, iz2);
347 for (i = 1; i <= 8; ++i) {
348 r[i*3 - 3] = av[i*3 - 3] + av[i*3 - 2]*cosa;
349 r[i*3 - 2] = av[i*3 - 2]*sina;
350 r[i*3 - 1] = av[i*3 - 1];
353 view->WCtoNDC(&r[ix1*3 - 3], x1);
354 view->WCtoNDC(&r[ix2*3 - 3], x2);
355 view->WCtoNDC(&r[iy1*3 - 3], y1);
356 view->WCtoNDC(&r[iy2*3 - 3], y2);
357 view->WCtoNDC(&r[iz1*3 - 3], z1);
358 view->WCtoNDC(&r[iz2*3 - 3], z2);
360 view->SetAxisNDC(x1, x2, y1, y2, z1, z2);
362 Double_t *rmin = view->GetRmin();
363 Double_t *rmax = view->GetRmax();
365 axis->SetLineWidth(1);
370 Double_t ax[2], ay[2];
371 Bool_t logAx = kFALSE;
372 memset(chopax,0,
sizeof(chopax));
375 ax[0] = x1[0]; ax[1] = x2[0];
376 ay[0] = x1[1]; ay[1] = x2[1];
377 logAx = gPad->GetLogx();
380 if (TMath::Abs(y1[0] - y2[0]) < epsil) y2[0] = y1[0];
381 ax[0] = y1[0]; ax[1] = y2[0];
382 ay[0] = y1[1]; ay[1] = y2[1];
383 logAx = gPad->GetLogy();
386 ax[0] = z1[0]; ax[1] = z2[0];
387 ay[0] = z1[1]; ay[1] = z2[1];
388 strlcpy(chopax,
"SDH+=",10);
389 logAx = gPad->GetLogz();
397 if ( ( TMath::Abs(ax[0] - ax[1]) + TMath::Abs(ay[0] - ay[1])) < epsil )
continue;
400 if (ax[0] > ax[1]) strlcpy(chopax,
"SDHV=+",10);
401 else strlcpy(chopax,
"SDHV=-",10);
404 if (i==1 && (TMath::Abs(z1[0] - z2[0]) + TMath::Abs(z1[1] - z2[1])) < epsil)
405 strlcpy(chopax,
"SDH+=",10);
409 strlcat(chopax,
"G",10);
410 bmin = TMath::Power(10, rmin[i]);
411 bmax = TMath::Power(10, rmax[i]);
417 axis->SetLineColor( fAxis[i].GetAxisColor());
418 axis->SetTextFont( fAxis[i].GetTitleFont());
419 axis->SetTextColor( fAxis[i].GetTitleColor());
420 axis->SetTickSize( fAxis[i].GetTickLength());
421 axis->SetLabelColor( fAxis[i].GetLabelColor());
422 axis->SetLabelFont( fAxis[i].GetLabelFont());
423 axis->SetLabelOffset(fAxis[i].GetLabelOffset()+fAxis[i].GetTickLength());
424 axis->SetLabelSize( fAxis[i].GetLabelSize());
425 axis->SetTitle( fAxis[i].GetTitle());
426 axis->SetTitleOffset(fAxis[i].GetTitleOffset());
427 axis->SetTitleSize( fAxis[i].GetTitleSize());
428 enum { kCenterTitle = BIT(12) };
429 axis->SetBit(kCenterTitle, fAxis[i].TestBit(kCenterTitle));
433 ndiv = fAxis[i].GetNdivisions();
440 if (fAxis[i].GetTimeDisplay()) {
441 strlcat(chopax,
"t",10);
442 if (strlen(fAxis[i].GetTimeFormatOnly()) == 0) {
443 axis->SetTimeFormat(fAxis[i].ChooseTimeFormat(bmax-bmin));
445 axis->SetTimeFormat(fAxis[i].GetTimeFormat());
448 axis->SetOption(chopax);
449 axis->PaintAxis(ax[0], ay[0], ax[1], ay[1], bmin, bmax, ndiv, chopax);
457 Double_t *TAxis3D::PixeltoXYZ(Double_t px, Double_t py, Double_t *point3D, TView *view)
459 Double_t *thisPoint = 0;
460 if (!view && gPad) view = gPad->GetView();
462 Double_t x[3] = {px,py,0.5};
463 Double_t min[3], max[3];
464 view->GetRange(min,max);
466 for (i =0; i<3;i++) min[i] = (max[i]+min[i])/2;
467 view->WCtoNDC(min,max);
468 min[0] = x[0]; min[1] = x[1];
470 view->NDCtoWC(min, x);
471 for (i=0;i<3;i++) point3D[i] = x[i];
480 void TAxis3D::SavePrimitive(std::ostream &out, Option_t * )
482 fAxis[0].SaveAttributes(out,GetName(),
"->GetXaxis()");
483 fAxis[1].SaveAttributes(out,GetName(),
"->GetYaxis()");
484 fAxis[2].SaveAttributes(out,GetName(),
"->GetZaxis()");
490 void TAxis3D::UseCurrentStyle()
492 if (gStyle->IsReading()) {
493 fAxis[0].ResetAttAxis(
"X");
494 fAxis[1].ResetAttAxis(
"Y");
495 fAxis[2].ResetAttAxis(
"Z");
497 fAxis[0].SetTitle(
"x");
498 fAxis[0].SetLabelColor(kRed); fAxis[0].SetAxisColor(kRed);
499 fAxis[1].SetLabelColor(kGreen); fAxis[1].SetAxisColor(kGreen);
500 fAxis[2].SetLabelColor(kBlue); fAxis[2].SetAxisColor(kBlue);
502 gStyle->SetNdivisions (fAxis[0].GetNdivisions(),
"x");
503 gStyle->SetAxisColor (fAxis[0].GetAxisColor(),
"x");
504 gStyle->SetLabelColor (fAxis[0].GetLabelColor(),
"x");
505 gStyle->SetLabelFont (fAxis[0].GetLabelFont(),
"x");
506 gStyle->SetLabelOffset(fAxis[0].GetLabelOffset(),
"x");
507 gStyle->SetLabelSize (fAxis[0].GetLabelSize(),
"x");
508 gStyle->SetTickLength (fAxis[0].GetTickLength(),
"x");
509 gStyle->SetTitleOffset(fAxis[0].GetTitleOffset(),
"x");
510 gStyle->SetTitleSize (fAxis[0].GetTitleSize(),
"x");
511 gStyle->SetTitleColor (fAxis[0].GetTitleColor(),
"x");
512 gStyle->SetTitleFont (fAxis[0].GetTitleFont(),
"x");
514 gStyle->SetNdivisions (fAxis[1].GetNdivisions(),
"y");
515 gStyle->SetAxisColor (fAxis[1].GetAxisColor(),
"y");
516 gStyle->SetLabelColor (fAxis[1].GetLabelColor(),
"y");
517 gStyle->SetLabelFont (fAxis[1].GetLabelFont(),
"y");
518 gStyle->SetLabelOffset(fAxis[1].GetLabelOffset(),
"y");
519 gStyle->SetLabelSize (fAxis[1].GetLabelSize(),
"y");
520 gStyle->SetTickLength (fAxis[1].GetTickLength(),
"y");
521 gStyle->SetTitleOffset(fAxis[1].GetTitleOffset(),
"y");
522 gStyle->SetTitleSize (fAxis[1].GetTitleSize(),
"y");
523 gStyle->SetTitleColor (fAxis[1].GetTitleColor(),
"y");
524 gStyle->SetTitleFont (fAxis[1].GetTitleFont(),
"y");
526 gStyle->SetNdivisions (fAxis[2].GetNdivisions(),
"z");
527 gStyle->SetAxisColor (fAxis[2].GetAxisColor(),
"z");
528 gStyle->SetLabelColor (fAxis[2].GetLabelColor(),
"z");
529 gStyle->SetLabelFont (fAxis[2].GetLabelFont(),
"z");
530 gStyle->SetLabelOffset(fAxis[2].GetLabelOffset(),
"z");
531 gStyle->SetLabelSize (fAxis[2].GetLabelSize(),
"z");
532 gStyle->SetTickLength (fAxis[2].GetTickLength(),
"z");
533 gStyle->SetTitleOffset(fAxis[2].GetTitleOffset(),
"z");
534 gStyle->SetTitleSize (fAxis[2].GetTitleSize(),
"z");
535 gStyle->SetTitleColor (fAxis[2].GetTitleColor(),
"z");
536 gStyle->SetTitleFont (fAxis[2].GetTitleFont(),
"z");
543 Int_t TAxis3D::AxisChoice( Option_t *axis)
const
545 char achoice = toupper(axis[0]);
546 if (achoice ==
'X')
return 0;
547 if (achoice ==
'Y')
return 1;
548 if (achoice ==
'Z')
return 2;
555 Int_t TAxis3D::GetNdivisions( Option_t *axis)
const
557 Int_t ax = AxisChoice(axis);
558 if (ax < 0)
return 0;
559 return fAxis[ax].GetNdivisions();
565 Color_t TAxis3D::GetAxisColor( Option_t *axis)
const
567 Int_t ax = AxisChoice(axis);
568 if (ax < 0)
return 0;
569 return fAxis[ax].GetAxisColor();
575 Color_t TAxis3D::GetLabelColor( Option_t *axis)
const
577 Int_t ax = AxisChoice(axis);
578 if (ax < 0)
return 0;
579 return fAxis[ax].GetLabelColor();
585 Style_t TAxis3D::GetLabelFont( Option_t *axis)
const
587 Int_t ax = AxisChoice(axis);
588 if (ax < 0)
return 0;
589 return fAxis[ax].GetLabelFont();
595 Float_t TAxis3D::GetLabelOffset( Option_t *axis)
const
597 Int_t ax = AxisChoice(axis);
598 if (ax < 0)
return 0;
599 return fAxis[ax].GetLabelOffset();
605 Float_t TAxis3D::GetLabelSize( Option_t *axis)
const
607 Int_t ax = AxisChoice(axis);
608 if (ax < 0)
return 0;
609 return fAxis[ax].GetLabelSize();
615 Float_t TAxis3D::GetTickLength( Option_t *axis)
const
617 Int_t ax = AxisChoice(axis);
618 if (ax < 0)
return 0;
619 return fAxis[ax].GetTickLength();
625 Float_t TAxis3D::GetTitleOffset( Option_t *axis)
const
627 Int_t ax = AxisChoice(axis);
628 if (ax < 0)
return 0;
629 return fAxis[ax].GetTitleOffset();
635 Int_t i = AxisChoice(axis); \
637 if (i == -1) { i = 0; nax = 3;}\
638 for (Int_t ax=i;ax<nax+i;ax++)
643 void TAxis3D::SetNdivisions(Int_t n, Option_t *axis)
645 AXISCHOICE {fAxis[ax].SetNdivisions(n);}
651 void TAxis3D::SetAxisColor(Color_t color, Option_t *axis)
653 AXISCHOICE {fAxis[ax].SetAxisColor(color);}
659 void TAxis3D::SetAxisRange(Double_t xmin, Double_t xmax, Option_t *axis)
661 Int_t ax = AxisChoice(axis);
663 TAxis *theAxis = &fAxis[ax];
664 Int_t bin1 = theAxis->FindBin(xmin);
665 Int_t bin2 = theAxis->FindBin(xmax);
666 theAxis->SetRange(bin1, bin2);
672 void TAxis3D::SetLabelColor(Color_t color, Option_t *axis)
674 AXISCHOICE { fAxis[ax].SetLabelColor(color); }
680 void TAxis3D::SetLabelFont(Style_t font, Option_t *axis)
682 AXISCHOICE { fAxis[ax].SetLabelFont(font); }
688 void TAxis3D::SetLabelOffset(Float_t offset, Option_t *axis)
690 AXISCHOICE { fAxis[ax].SetLabelOffset(offset); }
696 void TAxis3D::SetLabelSize(Float_t size, Option_t *axis)
698 AXISCHOICE { fAxis[ax].SetLabelSize(size); }
704 void TAxis3D::SetTickLength(Float_t length, Option_t *axis)
706 AXISCHOICE { fAxis[ax].SetTickLength(length); }
712 void TAxis3D::SetTitleOffset(Float_t offset, Option_t *axis)
714 AXISCHOICE { fAxis[ax].SetTitleOffset(offset); }
721 TAxis3D *TAxis3D::GetPadAxis(TVirtualPad *pad)
724 TVirtualPad *thisPad=pad;
725 if (!thisPad) thisPad = gPad;
728 obj = thisPad->FindObject(TAxis3D::fgRulerName);
729 if (!(obj && obj->InheritsFrom(Class()->GetName()))) obj = 0;
731 return (TAxis3D *)obj;
738 TAxis3D *TAxis3D::ToggleRulers(TVirtualPad *pad)
741 TVirtualPad *thisPad=pad;
742 if (!thisPad) thisPad = gPad;
743 if (thisPad && thisPad->GetView() ) {
744 TAxis3D *a = GetPadAxis(pad);
748 ax->SetBit(kCanDelete);
766 TAxis3D *TAxis3D::ToggleZoom(TVirtualPad *pad)
769 TVirtualPad *thisPad=pad;
770 if (!thisPad) thisPad = gPad;
771 if (thisPad && thisPad->GetView()) {
773 TList *l = thisPad->GetListOfPrimitives();
774 TObject *o = l->FindObject(TAxis3D::fgRulerName);
775 if (o && o->InheritsFrom(Class()->GetName())) {
776 if (o != l->Last()) {
783 ax->SetBit(kCanDelete);