StRoot  1
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
TPolyLineShape.cxx
1 // @(#)root/table:$Id$
2 // Author: Valeri Fine 1999
3 
4 /*************************************************************************
5  * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers. *
6  * All rights reserved. *
7  * *
8  * For the licensing terms see $ROOTSYS/LICENSE. *
9  * For the list of contributors see $ROOTSYS/README/CREDITS. *
10  *************************************************************************/
11 
12 #include "TPolyLineShape.h"
13 
14 #include "TPoints3D.h"
15 #include "TVolume.h"
16 #include "TVolumePosition.h"
17 #include "TTUBE.h"
18 #include "TBRIK.h"
19 #include "TSPHE.h"
20 #include "TView.h"
21 #include "TVirtualPad.h"
22 #include "TVirtualX.h"
23 #include "TTablePadView3D.h"
24 #include "TPoint.h"
25 #include "TVirtualPS.h"
26 #include "TMath.h"
27 
29 // //
30 // STAR 3D geometry Object Model //
31 // ============================= //
32 // //
33 // TDataSet Legend: //
34 // | "classA" //
35 // | | "classB" is derived from//
36 // v v the "classA" //
37 // TVolume "classB" //
38 // ^ //
39 // | "classQ" //
40 // | ^ "classQ" has a pointer //
41 // TShape | to "classT" //
42 // | "classT" //
43 // v //
44 // ----------------------------------------------------- //
45 // | | | | | //
46 // | | | . . . | | //
47 // | | | | | //
48 // V v v v v //
49 // TPolyLineShape TBRIK TTUBE TPCON TTRD1 //
50 // | ^ //
51 // | | <a href="http://root.cern.ch/root/html/TShape.html#TShape:description">R O O T S H A P E S</a> //
52 // V | (see <a href="https://cern-tex.web.cern.ch/cern-tex/geant_html3/node109.html#SECTION041000000000000000000000">GEANT 3.21 shapes</a> as well) //
53 // St_PolyLine3D | //
54 // | //
55 // TPoints3DABC //
56 // | //
57 // | //
58 // v //
59 // -------------------------------------------------------- //
60 // | | | | //
61 // | | | | //
62 // | | | | //
63 // V v v v //
64 //StHits3DPoints StHelix3DPoints TTable3Points TPoints3D //
65 // ^ ^ ^ ^ //
66 // | | | | //
67 // | | | | //
68 // StObjArray StTrack / StHelixD TTableSorter flat floating //
69 // ^ point array //
70 // | (see St_PolyLine3D as well) //
71 // | //
72 // TTable //
73 // //
74 // //
75 // S T A R S H A P E S //
76 // ------------------------------- //
77 // //
79 
80 ClassImp(TPolyLineShape);
81 
84 
86 {
87  fShape = 0;
88  fSmooth = kFALSE;
89  fConnection= 0;
90  fPoints=0;
91  SetWidthFactor();
92  fHasDrawn = kFALSE;
93  fShapeType = kNULL;
94  fSizeX3D = 0;
95  fPointFlag = kFALSE;
96  fLineFlag = kFALSE;
97 }
98 
101 
102 TPolyLineShape::TPolyLineShape(TPoints3DABC *points,Option_t* option)
103 {
104  fShape = 0;
105  fShapeType = kNULL;
106  fSmooth = kFALSE;
107  fConnection = 0;
108  fPoints = points;
109  fHasDrawn = kFALSE;
110  fSizeX3D = 0;
111  // Take in account the current node if any
112  if (!fPoints) {
113  Error("TPolyLineShape","No polyline is defined");
114  return;
115  }
116  fPointFlag = strchr(option,'P')?kTRUE:kFALSE;
117  fLineFlag = strchr(option,'L')?kTRUE:kFALSE;
118 
119  SetWidthFactor();
120  Create();
121 }
122 
125 
127 {
128  SafeDelete(fShape);
129  SafeDelete(fSizeX3D);
130 }
131 
134 
136 {
137  if (!fConnection) SetConnection(kBrik);
138 }
139 
142 
143 Size3D *TPolyLineShape::CreateX3DSize(Bool_t marker)
144 {
145  if (!fSizeX3D) fSizeX3D = new Size3D;
146  fSizeX3D->numPoints = 0;
147  fSizeX3D->numSegs = 0;
148  fSizeX3D->numPolys = 0; //NOTE: Because of different structure, our
149  if (fPoints) {
150  Int_t size = fPoints->Size();
151  if (marker) {
152  Int_t mode;
153  if (size > 10000) mode = 1; // One line marker '-'
154  else if (size > 3000) mode = 2; // Two lines marker '+'
155  else mode = 3; // Three lines marker '*'
156 
157  fSizeX3D->numSegs = size*mode;
158  fSizeX3D->numPoints = size*mode*2;
159  fSizeX3D->numPolys = 0;
160  } else {
161  fSizeX3D->numSegs = size-1;
162  fSizeX3D->numPoints = size;
163  }
164  fSizeX3D->numPolys = 0; //NOTE: Because of different structure, our
165  }
166  return fSizeX3D;
167 }
168 
171 
172 Int_t TPolyLineShape::SetConnection(EShapeTypes connection)
173 {
174  Float_t size = 0.5*GetWidthFactor()*GetLineWidth();
175 
176  if (fShapeType != connection) {
177  SafeDelete(fConnection);
178  fShapeType = connection;
179  switch (fShapeType) {
180  case kSphere:
181  SetConnection(new TSPHE("connection","sphere","void",0,size,0,90,0,360));
182  break;
183  default:
184  SetConnection(new TBRIK("connection","brik","void",size,size,size));
185  break;
186  };
187  }
188  return 0;
189 }
190 
198 
199 Int_t TPolyLineShape::DistancetoPrimitive(Int_t px, Int_t py)
200 {
201  if (fPoints) {
202  Int_t ret = fPoints->DistancetoPrimitive( px, py);
203  if (ret == -1) ret = PointDistancetoPrimitive(px, py);
204  return ret;
205  }
206  return 999999;
207 }
208 
216 
218 {
219  const Int_t inaxis = 7;
220  Float_t dist = 999999;
221 
222  Int_t puxmin = gPad->XtoAbsPixel(gPad->GetUxmin());
223  Int_t puymin = gPad->YtoAbsPixel(gPad->GetUymin());
224  Int_t puxmax = gPad->XtoAbsPixel(gPad->GetUxmax());
225  Int_t puymax = gPad->YtoAbsPixel(gPad->GetUymax());
226 
227  TView *view = 0;
228 //*-*- return if point is not in the user area
229  if (px < puxmin - inaxis) goto END;
230  if (py > puymin + inaxis) goto END;
231  if (px > puxmax + inaxis) goto END;
232  if (py < puymax - inaxis) goto END;
233 
234  view = gPad->GetView();
235  if (view) {
236  Int_t i;
237  Float_t dpoint;
238  Float_t xndc[3];
239  Int_t x1,y1;
240  Int_t pointSize = fPoints->Size();
241  for (i=0;i<pointSize;i++) {
242  Float_t thisPoints[3];
243  view->WCtoNDC(fPoints->GetXYZ(thisPoints,i), xndc);
244  x1 = gPad->XtoAbsPixel(xndc[0]);
245  y1 = gPad->YtoAbsPixel(xndc[1]);
246  dpoint = (px-x1)*(px-x1) + (py-y1)*(py-y1);
247  if (dpoint < dist) dist = dpoint;
248  }
249  dist = (TMath::Sqrt(dist));
250  }
251 END:
252  return Int_t(dist);
253 }
254 
257 
258 void TPolyLineShape::Draw(Option_t *)
259 {
260  Create();
261  AppendPad();
262 }
263 
266 
267 void TPolyLineShape::ExecuteEvent(Int_t event, Int_t px, Int_t py)
268 {
269  if (fPoints) fPoints->ExecuteEvent(event,px, py);
270 }
271 
274 
276 {
277  return ((TPolyLineShape *)this)->GetLineColor();
278 }
281 
282 const char *TPolyLineShape::GetName() const
283 {
284  return fPoints ? fPoints->GetName() : TShape::GetName();
285 }
288 
289 char *TPolyLineShape::GetObjectInfo(Int_t px, Int_t py) const
290 {
291  return fPoints ? fPoints->GetObjectInfo(px, py) : TShape::GetObjectInfo(px,py);
292 }
293 
296 
298 {
299  return ((TPolyLineShape *)this)->GetMarkerSize();
300 }
301 
304 
306 {
307  return ((TPolyLineShape *)this)->GetLineStyle();
308 }
309 
312 
313 const char *TPolyLineShape::GetTitle() const
314 {
315  return fPoints ? fPoints->GetTitle() : TShape::GetTitle();
316 }
320 
321 void TPolyLineShape::PaintNode(Float_t *start,Float_t *end,Option_t *option)
322 {
323  // Calculate the vector
324  const Int_t kDimension = 3;
325  Double_t vector[kDimension];
326  Double_t nodeposition[kDimension];
327  Int_t i=0;
328  for (i=0;i<kDimension;i++) {
329  vector[i]=end[i]-start[i];
330  nodeposition[i]=0.5*(start[i]+end[i]);
331  }
332  Double_t length = TMath::Normalize(vector);
333 
334  // Calculate the rotation axis for Axis Oz
335 
336  Double_t oz[3]={0,0,1};
337  Double_t rotate[3];
338 
339  Double_t sina = TMath::Normalize(TMath::Cross(vector,oz,rotate));
340  Double_t cosa = Product(vector,oz);
341  Double_t mrot[3][3];
342 
343  TShape *shape = fShape;
344  if (!shape) shape = fConnection;
345 
346  Gyrot(rotate,cosa,sina,mrot);
347 
348  Float_t width = GetWidthFactor()*GetLineWidth();
349 
350  mrot[0][0] *= width;
351  mrot[0][1] *= width;
352  mrot[0][2] *= width;
353 
354  mrot[1][0] *= width;
355  mrot[1][1] *= width;
356  mrot[1][2] *= width;
357 
358  mrot[2][0] *= length;
359  mrot[2][1] *= length;
360  mrot[2][2] *= length;
361 
362  Color_t color = GetLineColor();
363 
364  TVolume node("SegmentNode","SegmentNode", shape);
365  node.SetLineColor(color);
366  if (!fShape) node.SetVisibility();
367  node.SetLineColor(color);
368 
369  TRotMatrix matrix ("rotate","rotate",&mrot[0][0]);
370  TVolumePosition position(&node,nodeposition[0],nodeposition[1]
371  ,nodeposition[2],&matrix);
372 
373  if (!(fSmooth || fConnection)) {
374  node.PaintNodePosition(option, &position);
375  return;
376  }
377 
378  // Add the connection
379 
380  memset(mrot,0,9*sizeof(Double_t));
381 
382  length = width/length;
383  mrot[2][2] = length;
384  mrot[0][0] = 1;
385  mrot[1][1] = 1;
386 
387  TRotMatrix kneeMatrix("knee","knee",&mrot[0][0]);
388  TVolume knee("ConnectionNode","ConnectionNode", fConnection);
389  TVolumePosition kneePosition(&knee, 0, 0, 0.5, &kneeMatrix);
390  knee.SetLineColor(color);
391  node.Add(&knee,&kneePosition);
392 
393  node.PaintNodePosition(option, &position);
394 }
395 
398 
399 void TPolyLineShape::Paint(Option_t *opt)
400 {
401  if (!GetPoints()) return;
402 
403  Bool_t rangeView = opt && opt[0] && strcmp(opt,"range")==0 ? kTRUE : kFALSE;
404  TTablePadView3D *view3D = 0;
405  if (!rangeView && (view3D = (TTablePadView3D*)gPad->GetView3D()) ) {
406  TString mode;
407 
408  mode="";
409  if (fLineFlag) mode = "L";
410  if (fPointFlag) mode += "P";
411 
412  view3D->SetLineAttr(GetColorAttribute(), (Int_t)GetSizeAttribute());
413  view3D->PaintPoints3D(GetPoints(), mode.Data());
414  }
415  if (opt && !strstr(opt, "x3d")) {
416  if (fPointFlag) {
417  SetMarkerColor(GetColorAttribute());
418  SetMarkerSize(GetSizeAttribute());
419  PaintPolyMarker(fPoints->Size());
420  }
421  if (fLineFlag) {
422  SetLineColor(GetColorAttribute());
423  SetLineWidth((Width_t)GetSizeAttribute());
424  PaintPoints(fPoints->Size());
425  }
426 
427  } else {
428  if (fLineFlag) {
429  CreateX3DSize(kFALSE); PaintX3DLine(opt);
430  } else {
431  CreateX3DSize(kTRUE); PaintX3DMarker(opt);
432  }
433 // Paint3d(opt);
434  }
435 }
436 
439 
440 void TPolyLineShape::PaintPoints(Int_t n, Float_t *, Option_t *)
441 {
442  if (n < 2) return;
443 
444  TAttLine::Modify(); //Change line attributes only if necessary
445 
446 //*-*- Loop on each individual line
447  for (Int_t i=1;i<n;i++) {
448  Float_t xyz[6];
449  fPoints->GetXYZ(&xyz[0],i-1,2);
450  gPad->PaintLine3D(xyz, &xyz[3]);
451  }
452 }
453 
456 
457 void TPolyLineShape::PaintPolyMarker(Int_t n, Float_t *, Marker_t, Option_t *)
458 {
459  if (n <= 0) return;
460 
461  TView *view = gPad->GetView(); //Get current 3-D view
462  if(!view) return; //Check if `view` is valid
463 
464  //Create temporary storage
465  TPoint *pxy = new TPoint[n];
466  Float_t *x = new Float_t[n];
467  Float_t *y = new Float_t[n];
468  Float_t xndc[3], ptr[3];
469 
470 //*-*- convert points from world to pixel coordinates
471  Int_t nin = 0;
472  for (Int_t i = 0; i < n; i++) {
473  fPoints->GetXYZ(ptr,i);
474  view->WCtoNDC(ptr, xndc);
475  if (xndc[0] < gPad->GetX1() || xndc[0] > gPad->GetX2()) continue;
476  if (xndc[1] < gPad->GetY1() || xndc[1] > gPad->GetY2()) continue;
477  x[nin] = xndc[0];
478  y[nin] = xndc[1];
479  pxy[nin].fX = gPad->XtoPixel(x[nin]);
480  pxy[nin].fY = gPad->YtoPixel(y[nin]);
481  nin++;
482  }
483 
484  TAttMarker::Modify(); //Change marker attributes only if necessary
485 
486 //*-*- invoke the graphics subsystem
487  if (!gPad->IsBatch()) gVirtualX->DrawPolyMarker(nin, pxy);
488 
489 
490  if (gVirtualPS) {
491  gVirtualPS->DrawPolyMarker(nin, x, y);
492  }
493  delete [] x;
494  delete [] y;
495 
496  delete [] pxy;
497 }
498 
501 
502 void TPolyLineShape::Paint3d(Option_t *opt)
503 {
504  if (!fPoints) return;
505 
506  Create();
507 
508  struct XYZ { Float_t fValues[3]; } *points;
509  points = (XYZ *)(fPoints->GetP());
510  Int_t size = fPoints->GetN()-1;
511 
512  for (Int_t i=0;i<size;i++)
513  PaintNode((Float_t *)(points+i+1),(Float_t *)(points+i),opt);
514  fHasDrawn = kTRUE;
515 }
516 
519 
521 {
522 #ifndef WIN32
523  Int_t size = 0;
524  if (fPoints) size = fPoints->Size();
525  if (!size) return;
526 
527  X3DBuffer *buff = new X3DBuffer;
528  if (!buff) return;
529 
530  fSizeX3D->numPoints = buff->numPoints = size;
531  fSizeX3D->numSegs = buff->numSegs = size-1;
532  fSizeX3D->numPolys = buff->numPolys = 0; //NOTE: Because of different structure, our
533 
534  buff->polys = 0; // TPolyLine3D can't use polygons
535  TPoints3D x3dPoints(size);
536  buff->points = fPoints->GetXYZ(x3dPoints.GetP(),0,size);
537 
538 // Int_t c = (((fAttributes?fAttributes->GetColorAttribute():0) % 8) - 1) * 4; // Basic colors: 0, 1, ... 8
539  Int_t c = ((GetColorAttribute() % 8) - 1) * 4; // Basic colors: 0, 1, ... 8
540  if (c < 0) c = 0;
541 
542  //*-* Allocate memory for segments *-*
543  buff->segs = new Int_t[buff->numSegs*3];
544  if (buff->segs) {
545  for (Int_t i = 0; i < buff->numSegs; i++) {
546  buff->segs[3*i ] = c;
547  buff->segs[3*i+1] = i;
548  buff->segs[3*i+2] = i+1;
549  }
550  }
551 
552 
553  if (buff && buff->points && buff->segs) //If everything seems to be OK ...
554  FillX3DBuffer(buff);
555  else { // ... something very bad was happened
556  gSize3D.numPoints -= buff->numPoints;
557  gSize3D.numSegs -= buff->numSegs;
558  gSize3D.numPolys -= buff->numPolys;
559  }
560 
561  if (buff->segs) delete [] buff->segs;
562  if (buff->polys) delete [] buff->polys;
563  if (buff) delete buff;
564 #endif
565 }
566 
569 
571 {
572 #ifndef WIN32
573  Int_t size = 0;
574  if (fPoints) size = fPoints->Size();
575  if (!size) return;
576  Int_t mode;
577  Int_t i, j, k, n;
578 
579  X3DBuffer *buff = new X3DBuffer;
580  if(!buff) return;
581 
582  if (size > 10000) mode = 1; // One line marker '-'
583  else if (size > 3000) mode = 2; // Two lines marker '+'
584  else mode = 3; // Three lines marker '*'
585 
586  fSizeX3D->numSegs = buff->numSegs = size*mode;
587  fSizeX3D->numPoints = buff->numPoints = buff->numSegs*2;
588  fSizeX3D->numPolys = buff->numPolys = 0; //NOTE: Because of different structure, our
589 
590  buff->polys = 0; // TPolyMarker3D can't use polygons
591 
592 
593  //*-* Allocate memory for points *-*
594  Float_t delta = 0.002;
595 
596  buff->points = new Float_t[buff->numPoints*3];
597  if (buff->points) {
598  for (i = 0; i < size; i++) {
599  for (j = 0; j < mode; j++) {
600  for (k = 0; k < 2; k++) {
601  delta *= -1;
602  for (n = 0; n < 3; n++) {
603  Float_t xyz[3];
604  fPoints->GetXYZ(xyz,i);
605  buff->points[mode*6*i+6*j+3*k+n] =
606  xyz[n] * (1 + (j == n ? delta : 0));
607  }
608  }
609  }
610  }
611  }
612 
613  Int_t c = ((GetColorAttribute() % 8) - 1) * 4; // Basic colors: 0, 1, ... 8
614  if (c < 0) c = 0;
615 
616  //*-* Allocate memory for segments *-*
617  buff->segs = new Int_t[buff->numSegs*3];
618  if (buff->segs) {
619  for (i = 0; i < buff->numSegs; i++) {
620  buff->segs[3*i ] = c;
621  buff->segs[3*i+1] = 2*i;
622  buff->segs[3*i+2] = 2*i+1;
623  }
624  }
625 
626  if (buff->points && buff->segs) //If everything seems to be OK ...
627  FillX3DBuffer(buff);
628  else { // ... something very bad was happened
629  gSize3D.numPoints -= buff->numPoints;
630  gSize3D.numSegs -= buff->numSegs;
631  gSize3D.numPolys -= buff->numPolys;
632  }
633 
634  if (buff->points) delete [] buff->points;
635  if (buff->segs) delete [] buff->segs;
636  if (buff->polys) delete [] buff->polys;
637  if (buff) delete buff;
638 #endif
639 }
640 
643 
644 Float_t TPolyLineShape::Product(Float_t *v1, Float_t *v2,Int_t ndim)
645 {
646  Float_t p = 0;
647  if (v1 && v2 && ndim > 0)
648  for (Int_t i=0; i<ndim; i++) p+= v1[i]*v2[i];
649  return p;
650 }
651 
654 
655 Double_t TPolyLineShape::Product(Double_t *v1, Double_t *v2,Int_t ndim)
656 {
657  Double_t p = 0;
658  if (v1 && v2 && ndim > 0)
659  for (Int_t i=0;i<ndim;i++) p+= v1[i]*v2[i];
660  return p;
661 }
662 
679 
680 Double_t *TPolyLineShape::Gyrot(Double_t *dirc, Double_t cosang, Double_t sinang, Double_t trans[3][3])
681 {
682  Double_t ax[3];
683 
684  memcpy(ax,dirc,3*sizeof(Double_t));
685  TMath::Normalize(ax);
686 
687  Double_t ca = cosang;
688  Double_t sa = sinang;
689  Double_t ca1;
690 
691  if (ca < 0.5)
692  ca1 = 1. - ca ;
693  else
694  ca1 = (sa*sa)/(1.+ca) ;
695 
696  Int_t j1 = 0;
697  Int_t j2 = 0;
698  for(j1 = 0; j1 < 3; j1++) {
699  for(j2 = 0; j2 < 3; j2++)
700  trans[j1][j2] = ca1*ax[j1]*ax[j2];
701  trans[j1][j1] += ca;
702  }
703 
704  trans[0][1] = trans[0][1] - sa*ax[2];
705  trans[1][0] = trans[1][0] + sa*ax[2];
706  trans[0][2] = trans[0][2] + sa*ax[1];
707  trans[2][0] = trans[2][0] - sa*ax[1];
708  trans[1][2] = trans[1][2] - sa*ax[0];
709  trans[2][1] = trans[2][1] + sa*ax[0];
710 
711  return (Double_t *)trans;
712 
713 }
714 
717 
718 Color_t TPolyLineShape::SetColorAttribute(Color_t color)
719 {
720  Color_t currentColor = GetColorAttribute();
721  if (color != currentColor) {
722  SetLineColor(color);
723  SetMarkerColor(color);
724  }
725  return currentColor;
726 }
727 
730 
732 {
733  Size_t currentSize = GetSizeAttribute();
734  if (size != currentSize) {
735  SetLineWidth(Width_t(size));
736  SetMarkerSize(size);
737  }
738  return currentSize;
739 }
740 
745 
746 Style_t TPolyLineShape::SetStyleAttribute(Style_t style)
747 {
748  Style_t s = 0;
749  s = GetStyleAttribute();
750  SetLineStyle(style);
751  SetMarkerStyle(style);
752  return s;
753 }
754 
757 
758 void TPolyLineShape::SetShape(TShape *shape)
759 {
760  SafeDelete(fShape)
761  fShape = shape;
762 }
763 
766 
767 Int_t TPolyLineShape::Size() const
768 {
769  return fPoints ? fPoints->Size():0;
770 }
771 
774 
776 {
777  TPolyLineShape *line = (TPolyLineShape *)this;
778  if (fLineFlag )
779  line->CreateX3DSize(kFALSE);
780  else
781  line->CreateX3DSize(kTRUE);
782  if (fSizeX3D) {
783  gSize3D.numPoints += fSizeX3D->numPoints;
784  gSize3D.numSegs += fSizeX3D->numSegs;
785  gSize3D.numPolys += fSizeX3D->numPolys;
786  }
787  else Error("Sizeof3D()","buffer size has not been defined yet");
788 }
Definition: FJcore.h:367
virtual void SetShape(TShape *shape)
to be documented
virtual char * GetObjectInfo(Int_t px, Int_t py) const
forward the GetObjectInfo call to the decorated object
virtual Size_t GetSizeAttribute() const
to be documented
virtual Size_t SetSizeAttribute(Size_t size)
to be documented
virtual Int_t Size() const
to be documented
virtual void PaintNode(Float_t *start, Float_t *end, Option_t *option)
virtual Size3D * CreateX3DSize(Bool_t marker=kFALSE)
to be documented
virtual Int_t PointDistancetoPrimitive(Int_t px, Int_t py)
virtual void ExecuteEvent(Int_t event, Int_t px, Int_t py)
forward the ExecuteEvent call to the decorated object
virtual void Paint(Option_t *opt)
to be documented
virtual Color_t GetColorAttribute() const
to be documented
virtual void Create()
the X3D buffer sizes
TPolyLineShape()
to be documented
virtual const char * GetTitle() const
forward the GetObjectInfo call to the decorated object
virtual void PaintX3DLine(Option_t *opt="")
to be documented
virtual Int_t DistancetoPrimitive(Int_t px, Int_t py)
virtual Style_t SetStyleAttribute(Style_t style)
virtual void SetVisibility(ENodeSEEN vis=TVolume::kBothVisible)
Definition: TVolume.cxx:753
virtual void Paint3d(Option_t *opt)
to be documented
virtual ~TPolyLineShape()
to be documented
virtual void PaintX3DMarker(Option_t *opt="")
to be documented
virtual void Sizeof3D() const
Return total X3D size of this shape with its attributes.
virtual void PaintNodePosition(Option_t *option="", TVolumePosition *postion=0)
Definition: TVolume.cxx:591
virtual const char * GetName() const
forward the GetName call to the decorated object
static Double_t * Gyrot(Double_t *dirc, Double_t cosang, Double_t sinang, Double_t trans[3][3])
virtual Color_t SetColorAttribute(Color_t color)
to be documented
virtual void PaintPolyMarker(Int_t n, Float_t *p=0, Marker_t m=0, Option_t *opt="")
Paint polymarker in CurrentPad World coordinates.
static Float_t Product(Float_t *v1, Float_t *v2, Int_t ndim=3)
to be documented
virtual Style_t GetStyleAttribute() const
to be documented
virtual void Draw(Option_t *opt="")
to be documented
virtual void PaintPoints(Int_t n, Float_t *p=0, Option_t *opt="")
Draw this 3-D polyline with new coordinates.