File indexing completed on 2026-04-17 08:35:33
0001 #ifndef VECGEOM_SURFACE_PARALLELEPIPEDCONVERTER_H_
0002 #define VECGEOM_SURFACE_PARALLELEPIPEDCONVERTER_H_
0003
0004 #include <VecGeom/surfaces/conv/Builder.h>
0005 #include <VecGeom/surfaces/Model.h>
0006
0007 #include <VecGeom/volumes/Parallelepiped.h>
0008
0009 namespace vgbrep {
0010 namespace conv {
0011
0012
0013
0014
0015
0016
0017 template <typename Real_t>
0018 bool CreateParallelepipedSurfaces(vecgeom::UnplacedParallelepiped const ¶, int logical_id,
0019 bool intersection = false)
0020 {
0021 using Vector3D = vecgeom::Vector3D<vecgeom::Precision>;
0022
0023 auto dx = para.GetX();
0024 auto dy = para.GetY();
0025 auto dz = para.GetZ();
0026
0027 auto txy = para.GetTanAlpha();
0028 auto txz = para.GetTanThetaCosPhi();
0029 auto tyz = para.GetTanThetaSinPhi();
0030
0031 int isurf;
0032 LogicExpressionCPU logic;
0033 vecgeom::Transformation3D transformation;
0034 std::vector<Vector3D> vert;
0035
0036
0037
0038 std::vector<Vector3D> corners = {
0039 {-dx - dy * txy - dz * txz, -dy - dz * tyz, -dz}, {-dx + dy * txy - dz * txz, +dy - dz * tyz, -dz},
0040 {+dx + dy * txy - dz * txz, +dy - dz * tyz, -dz}, {+dx - dy * txy - dz * txz, -dy - dz * tyz, -dz},
0041 {-dx - dy * txy + dz * txz, -dy + dz * tyz, +dz}, {-dx + dy * txy + dz * txz, +dy + dz * tyz, +dz},
0042 {+dx + dy * txy + dz * txz, +dy + dz * tyz, +dz}, {+dx - dy * txy + dz * txz, -dy + dz * tyz, +dz}};
0043
0044
0045 vert = {corners[1], corners[0], corners[4], corners[5]};
0046 isurf = builder::CreateLocalSurfaceFromVertices<Real_t>(vert, logical_id);
0047 if (intersection) builder::GetSurface<Real_t>(isurf).fSkipConvexity = true;
0048 logic.push_back(isurf);
0049
0050
0051 vert = {corners[3], corners[2], corners[6], corners[7]};
0052 isurf = builder::CreateLocalSurfaceFromVertices<Real_t>(vert, logical_id);
0053 if (intersection) builder::GetSurface<Real_t>(isurf).fSkipConvexity = true;
0054 logic.push_back(land);
0055 logic.push_back(isurf);
0056
0057
0058 vert = {corners[0], corners[3], corners[7], corners[4]};
0059 isurf = builder::CreateLocalSurfaceFromVertices<Real_t>(vert, logical_id);
0060 if (intersection) builder::GetSurface<Real_t>(isurf).fSkipConvexity = true;
0061 logic.push_back(land);
0062 logic.push_back(isurf);
0063
0064
0065 vert = {corners[2], corners[1], corners[5], corners[6]};
0066 isurf = builder::CreateLocalSurfaceFromVertices<Real_t>(vert, logical_id);
0067 if (intersection) builder::GetSurface<Real_t>(isurf).fSkipConvexity = true;
0068 logic.push_back(land);
0069 logic.push_back(isurf);
0070
0071
0072 vert = {corners[0], corners[1], corners[2], corners[3]};
0073 isurf = builder::CreateLocalSurfaceFromVertices<Real_t>(vert, logical_id);
0074 if (intersection) builder::GetSurface<Real_t>(isurf).fSkipConvexity = true;
0075 logic.push_back(land);
0076 logic.push_back(isurf);
0077
0078
0079 vert = {corners[7], corners[6], corners[5], corners[4]};
0080 isurf = builder::CreateLocalSurfaceFromVertices<Real_t>(vert, logical_id);
0081 if (intersection) builder::GetSurface<Real_t>(isurf).fSkipConvexity = true;
0082 logic.push_back(land);
0083 logic.push_back(isurf);
0084 builder::AddLogicToShell<Real_t>(logical_id, logic);
0085 return true;
0086 }
0087
0088 }
0089 }
0090 #endif