Dear Robert
----- Original Message -----
From: <rhatcher@SLAC.stanford.edu>
To: <roottalk@pcroot.cern.ch>
Subject: incorrect scaling in TPGON
> There seems to be a error in the drawing of PGCON objects under
> ROOT 2.23/12 (and I believe it was wrong before that as well).
You are right. It is a bug. But I have a small "excuse";-)
I hope people find this story useful to teach the students
The story is:
Sometimes ago ROOT team forwarded me a bug report #477 from:
> > Full_Name: Trypiniotis Theodossis
> > Version: 2.20/06
> > Hardware: PC
> > OS: Redhat Linux
> > Severity: normal
> > Reproducable: always
> > Submission from: neutralino.fnal.gov (131.225.53.162)
This report contained a macro (see attachment) to prove TPGON object is wrong.
I fixed it *quickly* ;-( and tested with that macro. As you can find out yourself
that macro did provided a *proof* that everything fine now and I sent the fix
to ROOT team without extra check.
As one can see that test made the object:
TPGON *pgon = new TPGON("PGON","PGON","void",0,360,6,2);
For this *particular* case the angstep = 60 deg and one got
a confusion with:
factor = 1/cos(angstep/2) = 1/sin(angstep)
The end of story.
Thank you very.
With my regards,
Valery
> Under GEANT3, PGON radii corresponded to the "radius of the circle
> tangent to the sides of the inner/outer polygon in the cross-section".
> In other words the radius of the _inscribed_ circle.
Yes very this feature was mentioned by the bug report #477.
> The "FillTableOfCoSin" method inherited from TPCON has recently been
> overridden but the calculation is incorrect. The resulting CoSin values
> are scaled by the radii to determine the vertices of the polygon.
> If "dphi1" (degrees) is the opening angle of the volume and "npdv" is the
> number of sides, then
> angstep = pi/180 * dphi1 / npdv
> and the relevant scale is:
> factor = 1/cos(angstep/2)
> which is the ratio of the circumscribed to inscribed radii.
> The TPCON does not scale by any additional factor (which is right for cones)
> but TPGON uses 1/sin(angstep) which is wrong.
>
> -robert
>
> The following macro will show the effect.
>
> =================================================
>
> {
> TGeometry *testgeom = new TGeometry("testgeom","test octogon");
>
> Float_t size = 1.;
> Float_t rin = 0.;
> Float_t rout, zmin, zmax;
>
> // draw a box that the octogon should fit within
> TBRIK *mybrik = new TBRIK("box","box","void",size,size,size);
> TNode *mybriknode = new TNode("box","box","box");
> cout << "draw brick of size dx = dy = " << size << endl;
>
> // For GEANT3 PGON
> // RMIN/MAX: radius of the circle tangent to the sides of the
> // inner/outer polygon in the cross-section
> //
> // ... so this means that "r" is the _incribed_ circle radius
> // (tangent to the sides).
>
> // draw an octogon with no scaling ... DOESN'T FIT!
> TPGON *oct1 = new TPGON("oct1","oct1","void",-22.5,360.,8,2);
> rout = size;
> zmin = -size;
> zmax = zmin + .1*size;
> oct1->DefineSection(0,zmin,rin,rout);
> oct1->DefineSection(1,zmax,rin,rout);
> TNode *oct1node = new TNode("oct1","oct1","oct1");
> oct1node->SetLineColor(2);
> cout << "draw a red octogon with outer radius = "
> << rout << " (no scaling) " << endl;
>
> Float_t deg2rad = TMath::Pi()/180;
> Float_t cos22p5 = TMath::Cos(deg2rad*45/2);
> Float_t sin45 = TMath::Sin(deg2rad*45);
>
> // draw an octogon with a scaled radius
> // take out the incorrect factor, put in the correct factor
> TPGON *oct2 = new TPGON("oct2","oct2","void",-22.5,360.,8,2);
> rout = size * sin45 / cos22p5;
> zmax = size;
> zmin = zmax - .1*size;
> oct2->DefineSection(0,zmin,rin,rout);
> oct2->DefineSection(1,zmax,rin,rout);
> TNode *oct2node = new TNode("oct2","oct2","oct2");
> oct2node->SetLineColor(3);
> cout << "draw a green octogon with outer radius = "
> << rout << " (to correct scaling) " << endl;
>
> TCanvas *c1 = new TCanvas("c1","test octogon size",200,10,700,700);
> testgeom->Draw();
> }
This archive was generated by hypermail 2b29 : Tue Jan 02 2001 - 11:50:22 MET