Logo ROOT   6.30.04
Reference Guide
 All Namespaces Files Pages
TPainter3dAlgorithms.h
Go to the documentation of this file.
1 // @(#)root/histpainter:$Id$
2 // Author: Rene Brun, Evgueni Tcherniaev, Olivier Couet 12/12/94
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 #ifndef ROOT_TPainter3dAlgorithms
13 #define ROOT_TPainter3dAlgorithms
14 
15 #include "TObject.h"
16 
17 #include "TAttLine.h"
18 
19 #include "TAttFill.h"
20 
21 const Int_t kCARTESIAN = 1;
22 const Int_t kPOLAR = 2;
23 const Int_t kCYLINDRICAL = 3;
24 const Int_t kSPHERICAL = 4;
25 const Int_t kRAPIDITY = 5;
26 
27 class TF3;
28 
29 class TPainter3dAlgorithms : public TObject, public TAttLine, public TAttFill {
30 
31 private:
32  Double_t fRmin[3]; /// Lower limits of lego
33  Double_t fRmax[3]; /// Upper limits of lego
34  Double_t *fAphi; ///
35  Int_t fNaphi; /// Size of fAphi
36  Int_t fSystem; /// Coordinate system
37  Int_t *fColorMain; ///
38  Int_t *fColorDark; ///
39  Int_t fColorTop; ///
40  Int_t fColorBottom; ///
41  Int_t *fEdgeColor; ///
42  Int_t *fEdgeStyle; ///
43  Int_t *fEdgeWidth; ///
44  Int_t fEdgeIdx; ///
45  Int_t fMesh; /// (=1 if mesh to draw, o otherwise)
46  Int_t fNStack; /// Number of histograms in the stack to be painted
47  Double_t fFmin; /// IsoSurface minimum function value
48  Double_t fFmax; /// IsoSurface maximum function value
49  Int_t fNcolor; /// Number of colours per Iso surface
50  Int_t fIc1; /// Base colour for the 1st Iso Surface
51  Int_t fIc2; /// Base colour for the 2nd Iso Surface
52  Int_t fIc3; /// Base colour for the 3rd Iso Surface
53 
54  static Int_t fgF3Clipping; /// Clipping box is off (0) or on (1)
55  static Double_t fgF3XClip; /// Clipping plane along X
56  static Double_t fgF3YClip; /// Clipping plane along Y
57  static Double_t fgF3ZClip; /// Clipping plane along Y
58  static TF3 *fgCurrentF3; /// Pointer to the 3D function to be paint.
59 
60 
61 public:
62  typedef void (TPainter3dAlgorithms::*DrawFaceFunc_t)(Int_t *, Double_t *, Int_t, Int_t *, Double_t *);
63  typedef void (TPainter3dAlgorithms::*LegoFunc_t)(Int_t,Int_t,Int_t&,Double_t*,Double_t*,Double_t*);
64  typedef void (TPainter3dAlgorithms::*SurfaceFunc_t)(Int_t,Int_t,Double_t*,Double_t*);
65 
66 private:
67  DrawFaceFunc_t fDrawFace; /// pointer to face drawing function
68  LegoFunc_t fLegoFunction; /// pointer to lego function
69  SurfaceFunc_t fSurfaceFunction; /// pointer to surface function
70 
71 public:
72  TPainter3dAlgorithms();
73  TPainter3dAlgorithms(Double_t *rmin, Double_t *rmax, Int_t system=1);
74  virtual ~TPainter3dAlgorithms();
75  void BackBox(Double_t ang);
76  void FrontBox(Double_t ang);
77  void DrawFaceGouraudShaded(Int_t *icodes, Double_t xyz[][3], Int_t np, Int_t *iface, Double_t *t);
78  void DrawFaceMode1(Int_t *icodes, Double_t *xyz, Int_t np, Int_t *iface, Double_t *t);
79  void DrawFaceMode2(Int_t *icodes, Double_t *xyz, Int_t np, Int_t *iface, Double_t *t);
80  void DrawFaceMode3(Int_t *icodes, Double_t *xyz, Int_t np, Int_t *iface, Double_t *t);
81  void DrawFaceMove1(Int_t *icodes, Double_t *xyz, Int_t np, Int_t *iface, Double_t *tt);
82  void DrawFaceMove2(Int_t *icodes, Double_t *xyz, Int_t np, Int_t *iface, Double_t *tt);
83  void DrawFaceMove3(Int_t *icodes, Double_t *xyz, Int_t np, Int_t *iface, Double_t *tt);
84  void DrawLevelLines(Int_t *icodes, Double_t *xyz, Int_t np, Int_t *iface, Double_t *tt);
85  void DrawFaceRaster1(Int_t *icodes, Double_t *xyz, Int_t np, Int_t *iface, Double_t *tt);
86  void DrawFaceRaster2(Int_t *icodes, Double_t *xyz, Int_t np, Int_t *iface, Double_t *tt);
87  void GouraudFunction(Int_t ia, Int_t ib, Double_t *f, Double_t *t);
88  void ImplicitFunction(Double_t *rmin, Double_t *rmax, Int_t nx, Int_t ny, Int_t nz, const char *chopt);
89  void IsoSurface (Int_t ns, Double_t *s, Int_t nx, Int_t ny, Int_t nz, Double_t *x, Double_t *y, Double_t *z, const char *chopt);
90  void LegoCartesian(Double_t ang, Int_t nx, Int_t ny, const char *chopt);
91  void LegoFunction(Int_t ia, Int_t ib, Int_t &nv, Double_t *ab, Double_t *vv, Double_t *t);
92  void LegoPolar(Int_t iordr, Int_t na, Int_t nb, const char *chopt);
93  void LegoCylindrical(Int_t iordr, Int_t na, Int_t nb, const char *chopt);
94  void LegoSpherical(Int_t ipsdr, Int_t iordr, Int_t na, Int_t nb, const char *chopt);
95  void SetDrawFace(DrawFaceFunc_t pointer);
96  void SetIsoSurfaceParameters(Double_t fmin, Double_t fmax, Int_t ncolor, Int_t ic1, Int_t ic2, Int_t ic3){fFmin=fmin; fFmax=fmax; fNcolor=ncolor; fIc1=ic1; fIc2=ic2; fIc3=ic3;}
97  void SetLegoFunction(LegoFunc_t pointer);
98  void SetMesh(Int_t mesh=1) {fMesh=mesh;}
99  void SetSurfaceFunction(SurfaceFunc_t pointer);
100  void SetColorDark(Color_t color, Int_t n=0);
101  void SetColorMain(Color_t color, Int_t n=0);
102  void SetEdgeAtt(Color_t color=1, Style_t style=1, Width_t width=1, Int_t n=0);
103  void SideVisibilityDecode(Double_t val, Int_t &iv1, Int_t &iv2, Int_t &iv3, Int_t &iv4, Int_t &iv5, Int_t &iv6, Int_t &ir);
104  void SideVisibilityEncode(Int_t iopt, Double_t phi1, Double_t phi2, Double_t &val);
105  void SurfaceCartesian(Double_t ang, Int_t nx, Int_t ny, const char *chopt);
106  void SurfacePolar(Int_t iordr, Int_t na, Int_t nb, const char *chopt);
107  void SurfaceCylindrical(Int_t iordr, Int_t na, Int_t nb, const char *chopt);
108  void SurfaceFunction(Int_t ia, Int_t ib, Double_t *f, Double_t *t);
109  void SurfaceSpherical(Int_t ipsdr, Int_t iordr, Int_t na, Int_t nb, const char *chopt);
110 
111  static void SetF3(TF3 *f3);
112  static void SetF3ClippingBoxOff();
113  static void SetF3ClippingBoxOn(Double_t xclip, Double_t yclip, Double_t zclip);
114 
115 // Color and function levels
116 //
117 public:
118  void DefineGridLevels(Int_t ndivz);
119  void ColorFunction(Int_t nl, Double_t *fl, Int_t *icl, Int_t &irep);
120  void Spectrum(Int_t nl, Double_t fmin, Double_t fmax, Int_t ic, Int_t idc, Int_t &irep);
121  void FindLevelLines(Int_t np, Double_t *f, Double_t *t);
122  void FindPartEdge(Double_t *p1, Double_t *p2, Double_t f1, Double_t f2, Double_t fmin, Double_t fmax, Int_t &kpp, Double_t *pp);
123  void FillPolygon(Int_t n, Double_t *p, Double_t *f);
124 
125 private:
126  static const Int_t NumOfColorLevels = 256;
127  Int_t fNlevel; // Number of color levels
128  Double_t fFunLevel[NumOfColorLevels+1]; // Function levels corresponding to colors
129  Int_t fColorLevel[NumOfColorLevels+2]; // Color levels corresponding to functions
130 
131  static const Int_t NumOfLevelLines = 200;
132  Int_t fNlines; // Number of lines
133  Int_t fLevelLine[NumOfLevelLines]; // Corresponding levels
134  Double_t fPlines[NumOfLevelLines*6]; // End points of lines
135 
136 // Light and surface properties
137 //
138 public:
139  void LightSource(Int_t nl, Double_t yl, Double_t xscr, Double_t yscr, Double_t zscr, Int_t &irep);
140  void Luminosity(Double_t *anorm, Double_t &flum);
141  void SurfaceProperty(Double_t qqa, Double_t qqd, Double_t qqs, Int_t nnqs, Int_t &irep);
142 
143 private:
144  static const Int_t NumOfLights = 4;
145  Int_t fLoff;
146  Double_t fYdl;
147  Double_t fYls[NumOfLights];
148  Double_t fVls[NumOfLights*3];
149  Double_t fQA;
150  Double_t fQD;
151  Double_t fQS;
152  Int_t fNqs;
153 
154 // Moving screen - specialized hidden line removal algorithm
155 // for rendering 2D histograms
156 //
157 public:
158  void InitMoveScreen(Double_t xmin, Double_t xmax);
159  void FindVisibleDraw(Double_t *r1, Double_t *r2);
160  void ModifyScreen(Double_t *r1, Double_t *r2);
161 
162 private:
163  static const Int_t MaxNT = 100;
164  Double_t fX0; // minimal x
165  Double_t fDX; // x size
166  Int_t fNT; // number of t-segments
167  Double_t fT[MaxNT*2]; // t-segments
168 
169  static const Int_t NumOfSlices = 2000;
170  Double_t fU[NumOfSlices*2];
171  Double_t fD[NumOfSlices*2];
172 
173 // Raster screen - specialized hidden line removal algorithm
174 // for rendering 3D polygons ordered by depth (front-to-back)
175 //
176 public:
177  void InitRaster(Double_t xmin, Double_t ymin, Double_t xmax, Double_t ymax, Int_t nx, Int_t ny);
178  void ClearRaster();
179  void FindVisibleLine(Double_t *p1, Double_t *p2, Int_t ntmax, Int_t &nt, Double_t *t);
180  void FillPolygonBorder(Int_t nn, Double_t *xy);
181 
182 private:
183  Double_t fXrast; // minimal x
184  Double_t fYrast; // minimal y
185  Double_t fDXrast; // x size
186  Double_t fDYrast; // y size
187  Int_t fNxrast; // number of pixels in x
188  Int_t fNyrast; // number of pixels in y
189  Int_t fIfrast; // flag, if it not zero them the algorithm is off
190  Int_t *fRaster; // pointer to raster buffer
191  Int_t fJmask[30]; // indices of subsets of n-bit masks (n is from 1 to 30)
192  Int_t fMask[465]; // set of masks (30+29+28+...+1)=465
193 
194 // Marching Cubes 33 - constrction of iso-surfaces, see publication CERN-CN-95-17
195 //
196 public:
197  void MarchingCube(Double_t fiso, Double_t p[8][3], Double_t f[8], Double_t g[8][3], Int_t &nnod, Int_t &ntria, Double_t xyz[][3], Double_t grad[][3], Int_t itria[][3]);
198 
199 protected:
200  void MarchingCubeCase00(Int_t k1, Int_t k2, Int_t k3, Int_t k4, Int_t k5, Int_t k6, Int_t &nnod, Int_t &ntria, Double_t xyz[52][3], Double_t grad[52][3], Int_t itria[48][3]);
201  void MarchingCubeCase03(Int_t &nnod, Int_t &ntria, Double_t xyz[52][3], Double_t grad[52][3], Int_t itria[48][3]);
202  void MarchingCubeCase04(Int_t &nnod, Int_t &ntria, Double_t xyz[52][3], Double_t grad[52][3], Int_t itria[48][3]);
203  void MarchingCubeCase06(Int_t &nnod, Int_t &ntria, Double_t xyz[52][3], Double_t grad[52][3], Int_t itria[48][3]);
204  void MarchingCubeCase07(Int_t &nnod, Int_t &ntria, Double_t xyz[52][3], Double_t grad[52][3], Int_t itria[48][3]);
205  void MarchingCubeCase10(Int_t &nnod, Int_t &ntria, Double_t xyz[52][3], Double_t grad[52][3], Int_t itria[48][3]);
206  void MarchingCubeCase12(Int_t &nnod, Int_t &ntria, Double_t xyz[52][3], Double_t grad[52][3], Int_t itria[48][3]);
207  void MarchingCubeCase13(Int_t &nnod, Int_t &ntria, Double_t xyz[52][3], Double_t grad[52][3], Int_t itria[48][3]);
208  void MarchingCubeSetTriangles(Int_t ntria, Int_t it[][3], Int_t itria[48][3]);
209  void MarchingCubeMiddlePoint(Int_t nnod, Double_t xyz[52][3], Double_t grad[52][3], Int_t it[][3], Double_t *pxyz, Double_t *pgrad);
210  void MarchingCubeSurfacePenetration(Double_t a00, Double_t a10, Double_t a11, Double_t a01, Double_t b00, Double_t b10, Double_t b11, Double_t b01, Int_t &irep);
211  void MarchingCubeFindNodes(Int_t nnod, Int_t *ie, Double_t xyz[52][3], Double_t grad[52][3]);
212 
213 private:
214  Double_t fP8[8][3]; // vertices
215  Double_t fF8[8]; // function values
216  Double_t fG8[8][3]; // function gradients
217 
218 // Z-depth sorting algorithm for set of triangles
219 //
220 public:
221  void ZDepth(Double_t xyz[52][3], Int_t &nface, Int_t iface[48][3], Double_t dface[48][6], Double_t abcd[48][4], Int_t *iorder);
222 
223 protected:
224  void TestEdge(Double_t del, Double_t xyz[52][3], Int_t i1, Int_t i2, Int_t iface[3], Double_t abcd[4], Int_t &irep);
225 
226 public:
227  ClassDef(TPainter3dAlgorithms,0) //Hidden line removal package
228 };
229 
230 #endif