85 SetParaboloidDimensions(rlo, rhi, dz);
100 SetParaboloidDimensions(rlo, rhi, dz);
146 norm[0] = norm[1] = 0.0;
166 Double_t ndotd = norm[0] * dir[0] + norm[1] * dir[1] + norm[2] * dir[2];
184 Double_t rsq = point[0] * point[0] + point[1] * point[1];
185 if (aa <
fA *
fA * rsq)
196 const Int_t numPoints =
n * (
n + 1) + 2;
206 Double_t rsq = point[0] * point[0] + point[1] * point[1];
207 Double_t a =
fA * (dir[0] * dir[0] + dir[1] * dir[1]);
208 Double_t b = 2. *
fA * (point[0] * dir[0] + point[1] * dir[1]) - dir[2];
229 dist = 0.5 * (
sum + i * sone * delta);
253 if (iact < 3 && safe) {
258 if (iact == 1 && step < *safe)
264 dz = -(point[2] +
fDz) / dir[2];
265 }
else if (dir[2] > 0) {
266 dz = (
fDz - point[2]) / dir[2];
278 if (iact < 3 && safe) {
283 if (iact == 1 && step < *safe)
287 if (point[2] <= -
fDz) {
292 xnew = point[0] + snxt * dir[0];
293 ynew = point[1] + snxt * dir[1];
294 if ((xnew * xnew + ynew * ynew) <=
fRlo *
fRlo)
296 }
else if (point[2] >=
fDz) {
301 xnew = point[0] + snxt * dir[0];
302 ynew = point[1] + snxt * dir[1];
303 if ((xnew * xnew + ynew * ynew) <=
fRhi *
fRhi)
309 znew = point[2] + snxt * dir[2];
321 Error(
"Divide",
"Paraboloid divisions not implemented");
333 param[1] *= param[1];
352 printf(
"*** Shape %s: TGeoParaboloid ***\n",
GetName());
353 printf(
" rlo = %11.5f\n",
fRlo);
354 printf(
" rhi = %11.5f\n",
fRhi);
355 printf(
" dz = %11.5f\n",
fDz);
356 printf(
" Bounding box:\n");
367 Int_t nbPnts =
n * (
n + 1) + 2;
368 Int_t nbSegs =
n * (2 *
n + 3);
395 for (j = 0; j <
n; j++) {
396 buff.
fSegs[indx++] =
c + 2;
397 buff.
fSegs[indx++] = 0;
398 buff.
fSegs[indx++] = j + 1;
401 for (i = 0; i <
n + 1; i++) {
403 for (j = 0; j <
n; j++) {
405 buff.
fSegs[indx++] =
n * i + 1 + j;
406 buff.
fSegs[indx++] =
n * i + 1 + ((j + 1) %
n);
411 for (j = 0; j <
n; j++) {
413 buff.
fSegs[indx++] =
n * i + 1 + j;
414 buff.
fSegs[indx++] =
n * (i + 1) + 1 + j;
418 for (j = 0; j <
n; j++) {
419 buff.
fSegs[indx++] =
c + 1;
420 buff.
fSegs[indx++] =
n *
n + 1 + j;
421 buff.
fSegs[indx++] = nn1;
427 for (j = 0; j <
n; j++) {
428 buff.
fPols[indx++] =
c + 2;
429 buff.
fPols[indx++] = 3;
430 buff.
fPols[indx++] =
n + j;
431 buff.
fPols[indx++] = (j + 1) %
n;
432 buff.
fPols[indx++] = j;
435 for (i = 0; i <
n; i++) {
437 for (j = 0; j <
n; j++) {
439 buff.
fPols[indx++] = 4;
440 buff.
fPols[indx++] = (2 * i + 1) *
n + j;
441 buff.
fPols[indx++] = 2 * (i + 1) *
n + j;
442 buff.
fPols[indx++] = (2 * i + 3) *
n + j;
443 buff.
fPols[indx++] = 2 * (i + 1) *
n + ((j + 1) %
n);
447 for (j = 0; j <
n; j++) {
448 buff.
fPols[indx++] =
c + 1;
449 buff.
fPols[indx++] = 3;
450 buff.
fPols[indx++] = 2 *
n * (
n + 1) + j;
451 buff.
fPols[indx++] = 2 *
n * (
n + 1) + ((j + 1) %
n);
452 buff.
fPols[indx++] = (2 *
n + 1) *
n + j;
465 Double_t rsq = point[0] * point[0] + point[1] * point[1];
498 Error(
"SetParaboloidDimensions",
"Dimensions of %s invalid: check (rlo>=0) (rhi>=0) (rlo!=rhi) dz>0",
GetName());
557 for (
Int_t i = 0; i <
n + 1; i++) {
570 for (
Int_t j = 0; j <
n; j++) {
591 nvert =
n * (
n + 1) + 2;
592 nsegs =
n * (2 *
n + 3);
602 return (
n * (
n + 1) + 2);
613 out <<
" rlo = " <<
fRlo <<
";" << std::endl;
614 out <<
" rhi = " <<
fRhi <<
";" << std::endl;
615 out <<
" dz = " <<
fDZ <<
";" << std::endl;
642 for (
Int_t i = 0; i <
n + 1; i++) {
655 for (
Int_t j = 0; j <
n; j++) {
683 Int_t nbPnts =
n * (
n + 1) + 2;
684 Int_t nbSegs =
n * (2 *
n + 3);
686 if (buffer.SetRawSizes(nbPnts, 3 * nbPnts, nbSegs, 3 * nbSegs, nbPols, 2 *
n * 5 +
n *
n * 6)) {
692 if (!buffer.fLocalFrame) {
709 for (
Int_t i = 0; i < vecsize; i++)
720 for (
Int_t i = 0; i < vecsize; i++)
730 for (
Int_t i = 0; i < vecsize; i++)
740 for (
Int_t i = 0; i < vecsize; i++)
751 for (
Int_t i = 0; i < vecsize; i++)
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.
void FillBuffer3D(TBuffer3D &buffer, Int_t reqSections, Bool_t localFrame) const override
Fill the supplied buffer, with sections in desired frame See TBuffer3D.h for explanation of sections,...
void InspectShape() const override
Int_t GetNsegments() const
Get number of segments approximating circles.
Geometrical transformation package.
const TBuffer3D & GetBuffer3D(Int_t reqSections, Bool_t localFrame) const override
Stub implementation to avoid forcing implementation at this stage.
Double_t Capacity() const override
Double_t DistToParaboloid(const Double_t *point, const Double_t *dir, Bool_t in) const
void InspectShape() const override
TGeoShape * GetMakeRuntimeShape(TGeoShape *mother, TGeoMatrix *mat) const override
TBuffer3D * MakeBuffer3D() const override
void GetMeshNumbers(Int_t &nvert, Int_t &nsegs, Int_t &npols) const override
Int_t GetNmeshVertices() const override
void Sizeof3D() const override
void SetPoints(Double_t *points) const override
void GetBoundingCylinder(Double_t *param) const override
void ComputeNormal(const Double_t *point, const Double_t *dir, Double_t *norm) override
void SetParaboloidDimensions(Double_t rlo, Double_t rhi, Double_t dz)
void SetSegsAndPols(TBuffer3D &buff) const override
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
Int_t DistancetoPrimitive(Int_t px, Int_t py) override
Computes distance from point (px,py) to the object.
void ComputeNormal_v(const Double_t *points, const Double_t *dirs, Double_t *norms, Int_t vecsize) override
void SavePrimitive(std::ostream &out, Option_t *option="") override
Save a primitive as a C++ statement(s) on output stream "out".
~TGeoParaboloid() override
void DistFromInside_v(const Double_t *points, const Double_t *dirs, Double_t *dists, Int_t vecsize, Double_t *step) const override
void DistFromOutside_v(const Double_t *points, const Double_t *dirs, Double_t *dists, Int_t vecsize, Double_t *step) const override
void ComputeBBox() override
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
Bool_t Contains(const Double_t *point) const override
void Contains_v(const Double_t *points, Bool_t *inside, Int_t vecsize) const override
void SetDimensions(Double_t *param) override
TGeoVolume * Divide(TGeoVolume *voldiv, const char *divname, Int_t iaxis, Int_t ndiv, Double_t start, Double_t step) override
Double_t Safety(const Double_t *point, Bool_t in=kTRUE) const override
void Safety_v(const Double_t *points, const Bool_t *inside, Double_t *safe, Int_t vecsize) const override
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.
double dist(Rotation3D const &r1, Rotation3D const &r2)
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)