//_______________________________________________________________________________________ static void AddGrid() { TVirtualPad *thisPad = qPad(); if (thisPad) { TView *view = thisPad->GetView(); if (!view) return; Double_t min[3],max[3]; view->GetRange(min,max); TList *list = thisPad->GetListOfPrimitives(); TString histName = thisPad->GetName(); TH2F *m_DummyHist = 0; const Char_t *dummyName = "Axis3D"; histName += dummyName; m_DummyHist = list->FindObject(histName.Data()); if (!m_DummyHist) { m_DummyHist = new TH2F(histName.Data(),"",1,min[0],max[0],1,min[1],max[1]); m_DummyHist->SetDirectory(0); m_DummyHist->Draw("surf,same"); } m_DummyHist->GetXaxis()->SetLimits(min[0],max[0]); m_DummyHist->GetYaxis()->SetLimits(min[1],max[1]); m_DummyHist->GetZaxis()->SetLimits(min[2],max[2]); thisPad->Modified(); thisPad->Update(); } }
//_______________________________________________________________________________________ void MakeFourView(TVirtualPad *pad=0) { // Creates 4 pads view of the pad (or qPad) // ------------------------------ // | | | // | | | // | | | // | Front | Top | // | view | view | // | | | // | | | // | | | // ---------------+------------- // | | | // | | | // | | | // | Side | Spacial | // | view | view | // | | | // | | | // | | | // ------------------------------ // begin_html <P ALIGN=CENTER> <IMG SRC="gif/FourStarView.gif" ></P> end_html // TVirtualPad *thisPad = pad; if (!thisPad) thisPad = qPad(); TView *view = 0; TList *thisPrimitives = 0; if (thisPad && (thisPrimitives = thisPad->GetListOfPrimitives()) && (view = thisPad->GetView()) ) { Double_t min[3],max[3]; view->GetRange(min,max); Int_t system = view->GetSystem(); TCanvas *c = new TCanvas(" 4 views", thisPad->GetTitle(),600,600); c->Divide(2,2); TIter *next= new TIter(thisPrimitives); for (int i =1; i <= 4; i++) { c->cd(i); TList *newPrimitives = qPad()->GetListOfPrimitives(); TObject *obj = 0; while (obj = next->Next()) newPrimitives->Add(obj); TView *newView = new TView(system); newView->SetRange(min,max); next->Reset(); } delete next; // set separate view; // Fron view Int_t j = 1; c->cd(j++); FrontView(); c->cd(j++); TopView(); c->cd(j++); SideView(); c->cd(j++); RotateView(-30.0,60.0,0); c->Modified(); c->Update(); } }
//_______________________________________________________________________________________ static void Inscrease3DScale() { TVirtualPad *thisPad = qPad(); if (thisPad) { TView *view = thisPad->GetView(); if (!view) return; Double_t min[3],max[3]; view->GetRange(min,max); int i; for (i=0;i<3; i++) {max[i] *= 0.8; min[i]=max[i]*0.1;} view->SetRange(min,max); thisPad->Modified(); thisPad->Update(); } }
//_______________________________________________________________________________________ static void Centered3DImages() { // This macro prints out the sizes of the sekected 3d pad TVirtualPad *thisPad = qPad(); if (thisPad) { TView *view = thisPad->GetView(); if (!view) return; Double_t min[3],max[3]; view->GetRange(min,max); int i; for (i=0;i<3; i++) min[i]=-max[i]; view->SetRange(min,max); thisPad->Modified(); thisPad->Update(); } }
//_______________________________________________________________________________________ static void RotateView(Float_t phi, Float_t theta, TVirtualPad *pad=0) { TVirtualPad *thisPad = pad; if (!thisPad) thisPad = qPad(); if (thisPad) { TView *view = thisPad->GetView(); if (view) { Int_t iret; Float_t p = phi; Float_t t = theta; view->SetView(p, t, 0, iret); thisPad->SetPhi(-90-p); thisPad->SetTheta(90-t); thisPad->Modified(); thisPad->Update(); } } }
//_______________________________________________________________________________________ static void AdjustScales() { TVirtualPad *thisPad = qPad(); if (thisPad) { TView *view = thisPad->GetView(); if (!view) return; Double_t min[3],max[3]; view->GetRange(min,max); int i; Double_t maxSide = 0; // Find the largest side for (i=0;i<3; i++) maxSide = TMath::Max(maxSide,max[i]-min[i]); //Adjust scales: for (i=0;i<3; i++) max[i] += maxSide - (max[i]-min[i]); view->SetRange(min,max); thisPad->Modified(); thisPad->Update(); } }
void xtruSamples() { // Draw a sample of TXTRU shapes some convex, concave (and possibly malformed) // Change Bool_t's to test alternative specifications // Author: Robert Hatcher ([email protected]) 2000.09.06 // One normally specifies the x-y points in counter-clockwise order; // flip this to TRUE to test that it doesn't matter. Bool_t makecw = kFALSE; // One normally specifies the z points in increasing z order; // flip this to TRUE to test that it doesn't matter. Bool_t reversez = kFALSE; // One shouldn't be creating malformed polygons // but to test what happens when one does here's a flag. // The effect will be only apparent in solid rendering mode Bool_t domalformed = kFALSE; // domalformed = kTRUE; c1 = new TCanvas("c1","sample TXTRU Shapes",200,10,640,640); // Create a new geometry TGeometry* geom = new TGeometry("sample","sample"); geom->cd(); // Define the complexity of the drawing Float_t zseg = 6; // either 2 or 6 Int_t extravis = 0; // make extra z "arrow" visible Float_t unit = 1; // Create a large BRIK to embed things into Float_t bigdim = 12.5*unit; TBRIK* world = new TBRIK("world","world","void",bigdim,bigdim,bigdim); // Create the main node, make it invisible TNode* worldnode = new TNode("worldnode","world node",world); worldnode->SetVisibility(0); worldnode->cd(); // Canonical shape ... gets further modified by scale factors // to create convex (and malformed) versions Float_t x[] = { -0.50, -1.20, 1.20, 0.50, 0.50, 1.20, -1.20, -0.50 }; Float_t y[] = { -0.75, -2.00, -2.00, -0.75, 0.75, 2.00, 2.00, 0.75 }; Float_t z[] = { -0.50, -1.50, -1.50, 1.50, 1.50, 0.50 }; Float_t s[] = { 0.50, 1.00, 1.50, 1.50, 1.00, 0.50 }; Int_t nxy = sizeof(x)/sizeof(Float_t); Float_t convexscale[] = { 7.0, -1.0, 1.5 }; Int_t icolor[] = { 1, 2, 3, 2, 2, 2, 4, 2, 6 }; // xycase and zcase: 0=convex, 1=malformed, 2=concave // this will either create a 2x2 matrix of shapes // or a 3x3 array (if displaying malformed versions) for (Int_t zcase = 0; zcase<3; zcase++) { if (zcase == 1 && !domalformed) continue; for (Int_t xycase = 0; xycase<3; xycase++) { if (xycase == 1 && !domalformed) continue; Char_t *name = "txtruXYZ"; sprintf(name,"txtru%1d%1d%1d",xycase,zcase,zseg); TXTRU* mytxtru = new TXTRU(name,name,"void",8,2); Int_t i, j; Float_t xsign = (makecw) ? -1 : 1; Float_t zsign = (reversez) ? -1 : 1; // set the vertex points for (i=0; i<nxy; i++) { Float_t xtmp = x[i]*xsign; Float_t ytmp = y[i]; if (i==0||i==3||i==4||i==7) xtmp *= convexscale[xycase]; if (xycase==2) xtmp *=2; mytxtru->DefineVertex(i,xtmp,ytmp); } // set the z segment positions and scales for (i=0, j=0; i<zseg; i++) { Float_t ztmp = z[i]*zsign; if (i==0||i==5) ztmp *= convexscale[zcase]; if (zcase==2) ztmp *= 2.5; if (zseg>2 && zcase!=2 && (i==1||i==4)) continue; mytxtru->DefineSection(j,ztmp,s[i]); j++; } TNode* txtrunode = new TNode(name,name,mytxtru); txtrunode->SetLineColor(icolor[3*zcase+xycase]); Float_t pos_scale = (domalformed) ? 10 : 6; Float_t xpos = (xycase-1)*pos_scale*unit; Float_t ypos = (zcase-1)*pos_scale*unit; txtrunode->SetPosition(xpos,ypos,0.); } } // Some extra shapes to show the direction of "z" Float_t zhalf = 0.5*bigdim; Float_t rmax = 0.03*bigdim; TCONE* zcone = new TCONE("zcone","zcone","void",zhalf,0.,rmax,0.,0.); zcone->SetVisibility(extravis); TNode* zconenode = new TNode("zconenode","zconenode",zcone); zconenode->SetLineColor(3); Float_t dzstub = 2*rmax; TBRIK* zbrik = new TBRIK("zbrik","zbrik","void",rmax,rmax,dzstub); zbrik->SetVisibility(extravis); TNode* zbriknode = new TNode("zbriknode","zbriknode",zbrik); zbriknode->SetPosition(0.,0.,zhalf+dzstub); zbriknode->SetLineColor(3); // geom->ls(); geom->Draw(); // Tweak the pad so that it displays the entire geometry undistorted TVirtualPad *thisPad = gPad; if (thisPad) { TView *view = thisPad->GetView(); if (!view) return; Double_t min[3],max[3],center[3]; view->GetRange(min,max); int i; // Find the boxed center for (i=0;i<3; i++) center[i] = 0.5*(max[i]+min[i]); Double_t maxSide = 0; // Find the largest side for (i=0;i<3; i++) maxSide = TMath::Max(maxSide,max[i]-center[i]); file://Adjust scales: for (i=0;i<3; i++) { max[i] = center[i] + maxSide; min[i] = center[i] - maxSide; } view->SetRange(min,max); thisPad->Modified(); thisPad->Update(); } }