150 norm[0] = norm[1] = 0.0;
170 Double_t ndotd = norm[0]*dir[0]+norm[1]*dir[1]+norm[2]*dir[2];
185 if (aa < 0)
return kFALSE;
186 Double_t rsq = point[0]*point[0]+point[1]*point[1];
197 const Int_t numPoints=
n*(
n+1)+2;
207 Double_t rsq = point[0]*point[0]+point[1]*point[1];
209 Double_t b = 2.*
fA*(point[0]*dir[0]+point[1]*dir[1])-dir[2];
222 if (delta<0)
return dist;
227 dist = 0.5*(
sum+i*sone*delta);
229 if (dist<0)
continue;
234 if (!in) ndotd *= -1;
235 if (ndotd<0)
return dist;
246 if (iact<3 && safe) {
255 dz = -(point[2]+
fDz)/dir[2];
256 }
else if (dir[2]>0) {
257 dz = (
fDz-point[2])/dir[2];
268 if (iact<3 && safe) {
275 if (point[2]<=-
fDz) {
279 xnew = point[0]+snxt*dir[0];
280 ynew = point[1]+snxt*dir[1];
281 if ((xnew*xnew+ynew*ynew) <=
fRlo*
fRlo)
return snxt;
282 }
else if (point[2]>=
fDz) {
286 xnew = point[0]+snxt*dir[0];
287 ynew = point[1]+snxt*dir[1];
288 if ((xnew*xnew+ynew*ynew) <=
fRhi*
fRhi)
return snxt;
291 if (snxt > 1E20)
return snxt;
292 znew = point[2]+snxt*dir[2];
303 Error(
"Divide",
"Paraboloid divisions not implemented");
315 param[1] *= param[1];
334 printf(
"*** Shape %s: TGeoParaboloid ***\n",
GetName());
335 printf(
" rlo = %11.5f\n",
fRlo);
336 printf(
" rhi = %11.5f\n",
fRhi);
337 printf(
" dz = %11.5f\n",
fDz);
338 printf(
" Bounding box:\n");
354 nbPnts, 3*nbPnts, nbSegs, 3*nbSegs, nbPols, 2*
n*5 +
n*
n*6);
378 for (j=0; j<
n; j++) {
380 buff.
fSegs[indx++] = 0;
381 buff.
fSegs[indx++] = j+1;
384 for (i=0; i<
n+1; i++) {
386 for (j=0; j<
n; j++) {
388 buff.
fSegs[indx++] =
n*i+1+j;
389 buff.
fSegs[indx++] =
n*i+1+((j+1)%
n);
393 for (j=0; j<
n; j++) {
395 buff.
fSegs[indx++] =
n*i+1+j;
396 buff.
fSegs[indx++] =
n*(i+1)+1+j;
400 for (j=0; j<
n; j++) {
403 buff.
fSegs[indx++] = nn1;
409 for (j=0; j<
n; j++) {
411 buff.
fPols[indx++] = 3;
413 buff.
fPols[indx++] = (j+1)%
n;
414 buff.
fPols[indx++] = j;
417 for (i=0; i<
n; i++) {
419 for (j=0; j<
n; j++) {
421 buff.
fPols[indx++] = 4;
422 buff.
fPols[indx++] = (2*i+1)*
n+j;
423 buff.
fPols[indx++] = 2*(i+1)*
n+j;
424 buff.
fPols[indx++] = (2*i+3)*
n+j;
425 buff.
fPols[indx++] = 2*(i+1)*
n+((j+1)%
n);
429 for (j=0; j<
n; j++) {
431 buff.
fPols[indx++] = 3;
432 buff.
fPols[indx++] = 2*
n*(
n+1)+j;
433 buff.
fPols[indx++] = 2*
n*(
n+1)+((j+1)%
n);
434 buff.
fPols[indx++] = (2*
n+1)*
n+j;
444 if (!in) safz = -safz;
446 Double_t rsq = point[0]*point[0]+point[1]*point[1];
455 if (dr>-1.E-8)
return 0.;
459 if (dr<1.E-8)
return safz;
475 Error(
"SetParaboloidDimensions",
"Dimensions of %s invalid: check (rlo>=0) (rhi>=0) (rlo!=rhi) dz>0",
GetName());
533 for (
Int_t i=0; i<
n+1; i++) {
546 for (
Int_t j=0; j<
n; j++) {
588 out <<
" rlo = " <<
fRlo <<
";" << std::endl;
589 out <<
" rhi = " <<
fRhi <<
";" << std::endl;
590 out <<
" dz = " <<
fDZ <<
";" << std::endl;
591 out <<
" TGeoShape *" <<
GetPointerName() <<
" = new TGeoParaboloid(\"" <<
GetName() <<
"\", rlo,rhi,dz);" << std::endl;
615 for (
Int_t i=0; i<
n+1; i++) {
628 for (
Int_t j=0; j<
n; j++) {
661 if (buffer.
SetRawSizes(nbPnts, 3*nbPnts, nbSegs, 3*nbSegs, nbPols, 2*
n*5 +
n*
n*6)) {
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t r
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t points
R__EXTERN TGeoManager * gGeoManager
Generic 3D primitive description class.
Bool_t SectionsValid(UInt_t mask) const
void SetSectionsValid(UInt_t mask)
Bool_t SetRawSizes(UInt_t reqPnts, UInt_t reqPntsCapacity, UInt_t reqSegs, UInt_t reqSegsCapacity, UInt_t reqPols, UInt_t reqPolsCapacity)
Set kRaw tessellation section of buffer with supplied sizes.
void FillBuffer3D(TBuffer3D &buffer, Int_t reqSections, Bool_t localFrame) const override
Fills the supplied buffer, with sections in desired frame See TBuffer3D.h for explanation of sections...
void InspectShape() const override
Prints shape parameters.
Int_t GetNsegments() const
Get number of segments approximating circles.
Geometrical transformation package.
A paraboloid is defined by the revolution surface generated by a parabola and is bounded by two plane...
const TBuffer3D & GetBuffer3D(Int_t reqSections, Bool_t localFrame) const override
Fills a static 3D buffer and returns a reference.
Double_t Capacity() const override
Computes capacity of the shape in [length^3].
Double_t DistToParaboloid(const Double_t *point, const Double_t *dir, Bool_t in) const
Compute distance from a point to the parabola given by: z = a*rsq + b; rsq = x*x+y*y
void InspectShape() const override
print shape parameters
TGeoShape * GetMakeRuntimeShape(TGeoShape *mother, TGeoMatrix *mat) const override
in case shape has some negative parameters, these has to be computed in order to fit the mother
TBuffer3D * MakeBuffer3D() const override
Creates a TBuffer3D describing this shape.
void GetMeshNumbers(Int_t &nvert, Int_t &nsegs, Int_t &npols) const override
Returns numbers of vertices, segments and polygons composing the shape mesh.
Int_t GetNmeshVertices() const override
Returns number of vertices on the paraboloid mesh.
void Sizeof3D() const override
void SetPoints(Double_t *points) const override
Create paraboloid mesh points.
void GetBoundingCylinder(Double_t *param) const override
Fill vector param[4] with the bounding cylinder parameters.
void ComputeNormal(const Double_t *point, const Double_t *dir, Double_t *norm) override
Compute normal to closest surface from POINT.
void SetParaboloidDimensions(Double_t rlo, Double_t rhi, Double_t dz)
Set paraboloid dimensions.
void SetSegsAndPols(TBuffer3D &buff) const override
Fill TBuffer3D structure for segments and polygons.
Double_t DistFromOutside(const Double_t *point, const Double_t *dir, Int_t iact=1, Double_t step=TGeoShape::Big(), Double_t *safe=nullptr) const override
compute distance from outside point to surface of the paraboloid and safe distance
Int_t DistancetoPrimitive(Int_t px, Int_t py) override
compute closest distance from point px,py to each vertex
void ComputeNormal_v(const Double_t *points, const Double_t *dirs, Double_t *norms, Int_t vecsize) override
Compute the normal for an array o points so that norm.dot.dir is positive Input: Arrays of point coor...
void SavePrimitive(std::ostream &out, Option_t *option="") override
Save a primitive as a C++ statement(s) on output stream "out".
~TGeoParaboloid() override
destructor
void DistFromInside_v(const Double_t *points, const Double_t *dirs, Double_t *dists, Int_t vecsize, Double_t *step) const override
Compute distance from array of input points having directions specified by dirs. Store output in dist...
void DistFromOutside_v(const Double_t *points, const Double_t *dirs, Double_t *dists, Int_t vecsize, Double_t *step) const override
Compute distance from array of input points having directions specified by dirs. Store output in dist...
void ComputeBBox() override
compute bounding box of the tube
Double_t DistFromInside(const Double_t *point, const Double_t *dir, Int_t iact=1, Double_t step=TGeoShape::Big(), Double_t *safe=nullptr) const override
compute distance from inside point to surface of the paraboloid
Bool_t Contains(const Double_t *point) const override
test if point is inside the elliptical tube
void Contains_v(const Double_t *points, Bool_t *inside, Int_t vecsize) const override
Check the inside status for each of the points in the array.
void SetDimensions(Double_t *param) override
Set paraboloid dimensions starting from an array.
TGeoParaboloid()
Dummy constructor.
TGeoVolume * Divide(TGeoVolume *voldiv, const char *divname, Int_t iaxis, Int_t ndiv, Double_t start, Double_t step) override
Divide the paraboloid along one axis.
Double_t Safety(const Double_t *point, Bool_t in=kTRUE) const override
Computes the closest distance from given point to this shape.
void Safety_v(const Double_t *points, const Bool_t *inside, Double_t *safe, Int_t vecsize) const override
Compute safe distance from each of the points in the input array.
Base abstract class for all shapes.
Int_t GetBasicColor() const
Get the basic color (0-7).
void TransformPoints(Double_t *points, UInt_t NbPoints) const
Tranform a set of points (LocalToMaster)
void SetShapeBit(UInt_t f, Bool_t set)
Equivalent of TObject::SetBit.
const char * GetPointerName() const
Provide a pointer name containing uid.
Int_t ShapeDistancetoPrimitive(Int_t numpoints, Int_t px, Int_t py) const
Returns distance to shape primitive mesh.
const char * GetName() const override
Get the shape name.
static Double_t Tolerance()
TGeoVolume, TGeoVolumeMulti, TGeoVolumeAssembly are the volume classes.
R__ALWAYS_INLINE Bool_t TestBit(UInt_t f) const
virtual const char * ClassName() const
Returns name of class to which the object belongs.
void SetBit(UInt_t f, Bool_t set)
Set or unset the user status bits as specified in f.
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
Short_t Max(Short_t a, Short_t b)
Returns the largest of a and b.
T1 Sign(T1 a, T2 b)
Returns a value with the magnitude of a and the sign of b.
Double_t ATan2(Double_t y, Double_t x)
Returns the principal value of the arc tangent of y/x, expressed in radians.
constexpr Double_t DegToRad()
Conversion from degree to radian: .
Double_t Sqrt(Double_t x)
Returns the square root of x.
Short_t Min(Short_t a, Short_t b)
Returns the smallest of a and b.
Double_t Cos(Double_t)
Returns the cosine of an angle of x radians.
Double_t Sin(Double_t)
Returns the sine of an angle of x radians.
Double_t Tan(Double_t)
Returns the tangent of an angle of x radians.
Short_t Abs(Short_t d)
Returns the absolute value of parameter Short_t d.
static uint64_t sum(uint64_t i)