35 TGLAxis::TGLAxis(): TAttLine(1,1,1), TAttText(20,0.,1,42,0.04)
45 fNDiv = fNDiv1 = fNDiv2 = fNDiv3 = 0;
46 fNTicks1 = fNTicks2 = 0;
56 fTickMarksLength = 0.04;
57 fTickMarksOrientation = 2;
68 if (fTicks1)
delete [] fTicks1;
69 if (fTicks2)
delete [] fTicks2;
70 if (fLabels)
delete [] fLabels;
71 if (fText)
delete fText;
88 void TGLAxis::PaintGLAxis(
const Double_t p1[3],
const Double_t p2[3],
89 Double_t wmin, Double_t wmax, Int_t ndiv,
102 Double_t x1 = p1[0], y1 = p1[1], z1 = p1[2];
103 Double_t x2 = p2[0], y2 = p2[1], z2 = p2[2];
104 fAxisLength = TMath::Sqrt((x2-x1)*(x2-x1)+
116 glTranslatef(x1, y1, z1);
125 if (y2==y1 && x2==x1) {
130 p3[0] = p2[0]; p3[1] = p2[1]; p3[2] = 0;
131 TMath::Normal2Plane(p1, p2, p3, normal);
132 phi = TMath::ACos(TMath::Abs(z2-z1)/fAxisLength);
133 phi = -(90-(180/TMath::Pi())*phi);
135 glRotatef(phi, normal[0], normal[1], normal[2]);
142 theta = TMath::ATan((y2-y1)/(x2-x1));
143 theta = (180/TMath::Pi())*theta;
144 }
else if ((x2-x1)<0) {
145 theta = TMath::ATan((y2-y1)/(x2-x1));
146 theta = 180+(180/TMath::Pi())*theta;
148 if (y2>y1) theta = 90;
152 if (x2<x1) theta = 180;
154 glRotatef(theta, 0., 0., 1.);
158 PaintGLAxisTickMarks();
168 void TGLAxis::PaintGLAxisBody()
171 Float_t red = 1.f, green = 1.f, blue = 1.f;
172 if ((col = gROOT->GetColor(GetLineColor())))
173 col->GetRGB(red, green, blue);
174 glColor3d(red, green, blue);
175 TGLUtil::LineWidth(GetLineWidth());
177 glVertex3d(0., 0., 0.);
178 glVertex3d(fAxisLength, 0., 0.);
185 void TGLAxis::PaintGLAxisTickMarks()
191 switch (fTickMarksOrientation) {
213 if (fTickMarksLength) {
214 Double_t tl = fTickMarksLength*fAxisLength;
216 for (i=0; i<fNTicks1 ; i++) {
217 glVertex3f( fTicks1[i], 0, 0);
218 glVertex3f( fTicks1[i], yo*tl, zo*tl);
225 const UShort_t stipple = 0x8888;
226 glLineStipple(1, stipple);
227 glEnable(GL_LINE_STIPPLE);
229 for (i=0; i<fNTicks1; i++) {
230 glVertex3f( fTicks1[i], 0, 0);
231 glVertex3f( fTicks1[i], -yo*fGridLength, -zo*fGridLength);
234 glDisable(GL_LINE_STIPPLE);
240 if (fTickMarksLength) {
241 Double_t tl = 0.5*fTickMarksLength*fAxisLength;
243 for (i=0; i<fNTicks2; i++) {
244 glVertex3f( fTicks2[i], 0, 0);
245 glVertex3f( fTicks2[i], yo*tl, zo*tl);
255 void TGLAxis::PaintGLAxisLabels()
257 if (!fLabelsSize)
return;
259 Double_t x=0,y=0,z=0;
263 fText =
new TGLText();
264 fText->SetTextColor(GetTextColor());
265 fText->SetGLTextFont(GetTextFont());
266 fText->SetTextSize(fLabelsSize*fAxisLength);
267 fText->SetTextAlign(GetTextAlign());
269 fText->SetGLTextAngles(fAngle1, fAngle2, fAngle3);
271 switch (fTickMarksOrientation) {
274 z = fLabelsOffset*fAxisLength;
277 y = -fLabelsOffset*fAxisLength;
282 z = -fLabelsOffset*fAxisLength;
285 y = fLabelsOffset*fAxisLength;
289 for (i=0; i<fNDiv1+1 ; i++) {
291 fText->PaintGLText(x,y,z,fLabels[i]);
298 void TGLAxis::TicksPositions(Option_t *opt)
302 if (strchr(opt,
'N')) optionNoopt = kTRUE;
else optionNoopt = kFALSE;
306 fNDiv3 = fNDiv/10000;
307 fNDiv2 = (fNDiv-10000*fNDiv3)/100;
322 TicksPositionsNoOpt();
331 void TGLAxis::TicksPositionsNoOpt()
334 Double_t step1 = fAxisLength/(fNDiv1);
337 fTicks1 =
new Double_t[fNTicks1];
340 for (i=0; i<fNTicks1; i++) fTicks1[i] = i*step1;
345 Double_t step2 = step1/fNDiv2;
346 fNTicks2 = fNDiv1*(fNDiv2-1);
347 fTicks2 =
new Double_t[fNTicks2];
349 for (i=0; i<fNTicks1-1; i++) {
350 t2 = fTicks1[i]+step2;
351 for (j=0; j<fNDiv2-1; j++) {
363 void TGLAxis::TicksPositionsOpt()
365 Int_t i, j, k, nDivOpt;
366 Double_t step1=0, step2=0, wmin2=0, wmax2=0;
367 Double_t wmin = fWmin;
368 Double_t wmax = fWmax;
371 THLimitsFinder::Optimize(wmin, wmax, fNDiv1,
372 fWmin, fWmax, nDivOpt,
376 fTicks1 =
new Double_t[fNTicks1];
378 Double_t r = fAxisLength/(wmax-wmin);
382 fTicks1[i] = r*(w-wmin);
390 THLimitsFinder::Optimize(fWmin, fWmin+step1, fNDiv2,
391 wmin2, wmax2, nDivOpt,
394 step2 = TMath::Abs((fTicks1[1]-fTicks1[0])/fNDiv2);
395 Int_t nTickl = (Int_t)(fTicks1[0]/step2);
396 Int_t nTickr = (Int_t)((fAxisLength-fTicks1[fNTicks1-1])/step2);
397 fNTicks2 = fNDiv1*(fNDiv2-1)+nTickl+nTickr;
398 fTicks2 =
new Double_t[fNTicks2];
400 for (i=0; i<fNTicks1-1; i++) {
401 t2 = fTicks1[i]+step2;
402 for (j=0; j<fNDiv2-1; j++) {
409 t2 = fTicks1[0]-step2;
410 for (i=0; i<nTickl; i++) {
417 t2 = fTicks1[fNTicks1-1]+step2;
418 for (i=0; i<nTickr; i++) {
430 void TGLAxis::DoLabels()
432 if (fLabels)
delete [] fLabels;
433 fLabels =
new TString[fNTicks1];
437 Double_t dw = (fWmax-fWmin)/(fNDiv1);
438 for (i=0; i<fNTicks1; i++) {
439 fLabels[i] = Form(
"%g",fWmin+i*dw);
446 void TGLAxis::SetLabelsAngles(Double_t a1, Double_t a2, Double_t a3)