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)