59 faX = faY = faZ = 1.0;
66 TSPHE::TSPHE(
const char *name,
const char *title,
const char *material, Float_t rmin, Float_t rmax, Float_t themin,
67 Float_t themax, Float_t phimin, Float_t phimax)
68 : TShape(name, title,material)
83 faX = faY = faZ = 1.0;
85 SetNumberOfDivisions (20);
91 TSPHE::TSPHE(
const char *name,
const char *title,
const char *material, Float_t rmax)
92 : TShape(name, title,material)
107 faX = faY = faZ = 1.0;
109 SetNumberOfDivisions (20);
117 if (fCoThetaTab)
delete [] fCoThetaTab;
118 if (fSiTab)
delete [] fSiTab;
119 if (fCoTab)
delete [] fCoTab;
132 Int_t TSPHE::DistancetoPrimitive(Int_t px, Int_t py)
134 Int_t n = GetNumberOfDivisions()+1;
135 Int_t numPoints = 2*n*(fNz+1);
136 return ShapeDistancetoPrimitive(numPoints,px,py);
142 void TSPHE::SetEllipse(
const Float_t *factors)
144 if (factors[0] > 0) faX = factors[0];
145 if (factors[1] > 0) faY = factors[1];
146 if (factors[2] > 0) faZ = factors[2];
152 void TSPHE::SetNumberOfDivisions (Int_t p)
154 if (GetNumberOfDivisions () == p)
return;
156 fNz = Int_t(fAspectRatio*fNdiv*(fThemax - fThemin )/(fPhimax - fPhimin )) + 1;
163 void TSPHE::SetPoints(Double_t *points)
const
168 n = GetNumberOfDivisions()+1;
171 if (!fCoTab) MakeTableOfCoSin();
173 for (i = 0; i < fNz+1; i++) {
174 z = fRmin * fCoThetaTab[i];
175 Float_t sithet = TMath::Sqrt(TMath::Abs(1-fCoThetaTab[i]*fCoThetaTab[i]));
176 Float_t zi = fRmin*sithet;
177 for (j = 0; j < n; j++) {
178 points[indx++] = faX*zi * fCoTab[j];
179 points[indx++] = faY*zi * fSiTab[j];
180 points[indx++] = faZ*z;
182 z = fRmax * fCoThetaTab[i];
184 for (j = 0; j < n; j++) {
185 points[indx++] = faX*zi * fCoTab[j];
186 points[indx++] = faY*zi * fSiTab[j];
187 points[indx++] = faZ*z;
196 void TSPHE::Sizeof3D()
const
200 n = GetNumberOfDivisions()+1;
202 Bool_t specialCase = kFALSE;
204 if (TMath::Abs(TMath::Sin(2*(fPhimax - fPhimin))) <= 0.01)
207 gSize3D.numPoints += 2*n*nz;
208 gSize3D.numSegs += 4*(nz*n-1+(specialCase == kTRUE));
209 gSize3D.numPolys += 2*(nz*n-1+(specialCase == kTRUE));
215 void TSPHE::MakeTableOfCoSin()
const
217 const Double_t pi = TMath::ATan(1) * 4.0;
218 const Double_t ragrad = pi/180.0;
220 Float_t dphi = fPhimax - fPhimin;
221 while (dphi > 360) dphi -= 360;
223 Float_t dtet = fThemax - fThemin;
224 while (dtet > 180) dtet -= 180;
227 Int_t n = GetNumberOfDivisions () + 1;
230 fCoTab =
new Double_t [n];
231 if (!fCoTab )
return;
235 fSiTab =
new Double_t [n];
236 if (!fSiTab )
return;
238 Double_t range = Double_t(dphi * ragrad);
239 Double_t phi1 = Double_t(fPhimin * ragrad);
240 Double_t angstep = range/(n-1);
243 for (j = 0; j < n; j++)
245 ph = phi1 + j*angstep;
246 fCoTab[j] = TMath::Cos(ph);
247 fSiTab[j] = TMath::Sin(ph);
253 delete [] fCoThetaTab;
254 fCoThetaTab =
new Double_t [n];
255 if (!fCoThetaTab )
return;
257 range = Double_t(dtet * ragrad);
258 phi1 = Double_t(fThemin * ragrad);
259 angstep = range/(n-1);
262 for (j = 0; j < n; j++)
264 fCoThetaTab[n-j-1] = TMath::Cos(ph);
273 void TSPHE::Streamer(TBuffer &b)
277 Version_t R__v = b.ReadVersion(&R__s, &R__c);
279 b.ReadClassBuffer(TSPHE::Class(),
this, R__v, R__s, R__c);
282 SetNumberOfDivisions (ndiv);
300 SetNumberOfDivisions (tNdiv);
301 b.CheckByteCount(R__s, R__c, TSPHE::IsA());
305 b.WriteClassBuffer(TSPHE::Class(),
this);
312 const TBuffer3D & TSPHE::GetBuffer3D(Int_t reqSections)
const
314 static TBuffer3D buffer(TBuffer3DTypes::kGeneric);
316 TShape::FillBuffer3D(buffer, reqSections);
319 const Int_t n = GetNumberOfDivisions()+1;
320 const Int_t nz = fNz+1;
321 Bool_t specialCase = (TMath::Abs(TMath::Sin(2*(fPhimax - fPhimin))) <= 0.01);
323 if (reqSections & TBuffer3D::kRawSizes) {
324 Int_t nbPnts = 2*n*nz;
325 Int_t nbSegs = 4*(nz*n-1+(specialCase == kTRUE));
326 Int_t nbPols = 2*(nz*n-1+(specialCase == kTRUE));
327 if (buffer.SetRawSizes(nbPnts, 3*nbPnts, nbSegs, 3*nbSegs, nbPols, 6*nbPols)) {
328 buffer.SetSectionsValid(TBuffer3D::kRawSizes);
331 if ((reqSections & TBuffer3D::kRaw) && buffer.SectionsValid(TBuffer3D::kRawSizes)) {
333 SetPoints(buffer.fPnts);
334 if (!buffer.fLocalFrame) {
335 TransformPoints(buffer.fPnts, buffer.NbPnts());
338 Int_t c = GetBasicColor();
346 for (i = 0; i < nz*2; i++) {
348 for (j = 1; j < n; j++) {
349 buffer.fSegs[indx++] = c;
350 buffer.fSegs[indx++] = indx2+j-1;
351 buffer.fSegs[indx++] = indx2+j;
354 buffer.fSegs[indx++] = c;
355 buffer.fSegs[indx++] = indx2+j-1;
356 buffer.fSegs[indx++] = indx2;
361 for (i = 0; i < 2; i++) {
362 indx2 = i*(nz-1)*2*n;
363 for (j = 0; j < n; j++) {
364 buffer.fSegs[indx++] = c;
365 buffer.fSegs[indx++] = indx2+j;
366 buffer.fSegs[indx++] = indx2+n+j;
371 for (i = 0; i < (nz-1); i++) {
375 for (j = 0; j < n; j++) {
376 buffer.fSegs[indx++] = c+2;
377 buffer.fSegs[indx++] = indx2+j;
378 buffer.fSegs[indx++] = indx2+n*2+j;
382 for (j = 0; j < n; j++) {
383 buffer.fSegs[indx++] = c+3;
384 buffer.fSegs[indx++] = indx2+j;
385 buffer.fSegs[indx++] = indx2+n*2+j;
392 for (i = 1; i < (nz-1); i++) {
393 for (j = 0; j < 2; j++) {
394 buffer.fSegs[indx++] = c;
395 buffer.fSegs[indx++] = 2*i * n + j*(n-1);
396 buffer.fSegs[indx++] = (2*i+1) * n + j*(n-1);
402 Int_t m = n - 1 + (specialCase == kTRUE);
407 for (j = 0; j < n-1; j++) {
408 buffer.fPols[indx++] = c+3;
409 buffer.fPols[indx++] = 4;
410 buffer.fPols[indx++] = 2*nz*m+j;
411 buffer.fPols[indx++] = m+j;
412 buffer.fPols[indx++] = 2*nz*m+j+1;
413 buffer.fPols[indx++] = j;
415 for (j = 0; j < n-1; j++) {
416 buffer.fPols[indx++] = c+3;
417 buffer.fPols[indx++] = 4;
418 buffer.fPols[indx++] = 2*nz*m+n+j;
419 buffer.fPols[indx++] = (nz*2-2)*m+j;
420 buffer.fPols[indx++] = 2*nz*m+n+j+1;
421 buffer.fPols[indx++] = (nz*2-2)*m+m+j;
424 buffer.fPols[indx++] = c+3;
425 buffer.fPols[indx++] = 4;
426 buffer.fPols[indx++] = 2*nz*m+j;
427 buffer.fPols[indx++] = m+j;
428 buffer.fPols[indx++] = 2*nz*m;
429 buffer.fPols[indx++] = j;
431 buffer.fPols[indx++] = c+3;
432 buffer.fPols[indx++] = 4;
433 buffer.fPols[indx++] = 2*nz*m+n+j;
434 buffer.fPols[indx++] = (nz*2-2)*m+j;
435 buffer.fPols[indx++] = 2*nz*m+n;
436 buffer.fPols[indx++] = (nz*2-2)*m+m+j;
440 for (k = 0; k < (nz-1); k++) {
441 for (j = 0; j < n-1; j++) {
442 buffer.fPols[indx++] = c;
443 buffer.fPols[indx++] = 4;
444 buffer.fPols[indx++] = 2*k*m+j;
445 buffer.fPols[indx++] = nz*2*m+(2*k+2)*n+j+1;
446 buffer.fPols[indx++] = (2*k+2)*m+j;
447 buffer.fPols[indx++] = nz*2*m+(2*k+2)*n+j;
449 for (j = 0; j < n-1; j++) {
450 buffer.fPols[indx++] = c+1;
451 buffer.fPols[indx++] = 4;
452 buffer.fPols[indx++] = (2*k+1)*m+j;
453 buffer.fPols[indx++] = nz*2*m+(2*k + 3)*n+j;
454 buffer.fPols[indx++] = (2*k+ 3)*m+j;
455 buffer.fPols[indx++] = nz*2*m+(2*k+3)*n+j+1;
459 buffer.fPols[indx++] = c;
460 buffer.fPols[indx++] = 4;
461 buffer.fPols[indx++] = 2*k*m+j;
462 buffer.fPols[indx++] = nz*2*m+(2*k+2)*n+j;
463 buffer.fPols[indx++] = (2*k+2)*m+j;
464 buffer.fPols[indx++] = nz*2*m+(2*k+2)*n;
466 buffer.fPols[indx++] = c+1;
467 buffer.fPols[indx++] = 4;
468 buffer.fPols[indx++] = (2*k+1)*m+j;
469 buffer.fPols[indx++] = nz*2*m+(2*k+3)*n+j;
470 buffer.fPols[indx++] = (2*k+3)*m+j;
471 buffer.fPols[indx++] = nz*2*m+(2*k+3)*n;
479 for (k = 0; k < (nz-1); k++) {
480 buffer.fPols[indx++] = c+2;
481 buffer.fPols[indx++] = 4;
482 buffer.fPols[indx++] = k==0 ? indx2 : indx2+2*nz*n+2*(k-1);
483 buffer.fPols[indx++] = indx2+2*(k+1)*n;
484 buffer.fPols[indx++] = indx2+2*nz*n+2*k;
485 buffer.fPols[indx++] = indx2+(2*k+3)*n;
487 buffer.fPols[indx++] = c+2;
488 buffer.fPols[indx++] = 4;
489 buffer.fPols[indx++] = k==0 ? indx2+n-1 : indx2+2*nz*n+2*(k-1)+1;
490 buffer.fPols[indx++] = indx2+(2*k+3)*n+n-1;
491 buffer.fPols[indx++] = indx2+2*nz*n+2*k+1;
492 buffer.fPols[indx++] = indx2+2*(k+1)*n+n-1;
495 buffer.fPols[indx-8] = indx2+n;
496 buffer.fPols[indx-2] = indx2+2*n-1;
499 buffer.SetSectionsValid(TBuffer3D::kRaw);