-
Notifications
You must be signed in to change notification settings - Fork 1.3k
/
Copy pathxtruSamples.C
154 lines (133 loc) · 5.13 KB
/
xtruSamples.C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
/// \file
/// \ingroup tutorial_g3d_legacy
/// Draw a sample of TXTRU shapes some convex, concave (and possibly malformed)
///
/// Change Bool_t's to test alternative specifications
///
/// \macro_image
/// \macro_code
///
/// \author Robert Hatcher (rhatcher@fnal.gov) 2000.09.06
void xtruSamples()
{
// 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;
TCanvas *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
Int_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 name[9];
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();
}
}