IAP GITLAB

Skip to content
Snippets Groups Projects
Commit b5796d71 authored by Maximilian Reininghaus's avatar Maximilian Reininghaus :vulcan:
Browse files

added Helix

parent 2b5ead11
No related branches found
No related tags found
No related merge requests found
set (GEOMETRY_SOURCES CoordinateSystem.cc) set (GEOMETRY_SOURCES CoordinateSystem.cc)
set (GEOMETRY_HEADERS Vector.h Point.h Sphere.h CoordinateSystem.h) set (GEOMETRY_HEADERS Vector.h Point.h Sphere.h CoordinateSystem.h Helix.h)
add_library (CORSIKAgeometry STATIC ${GEOMETRY_SOURCES}) add_library (CORSIKAgeometry STATIC ${GEOMETRY_SOURCES})
......
#ifndef _include_HELIX_H_
#define _include_HELIX_H_
#include <Geometry/Vector.h>
#include <Geometry/Point.h>
#include <Units/PhysicalUnits.h>
class Helix // TODO: inherit from to-be-implemented "Trajectory"
{
using SpeedVec = Vector<phys::units::speed_d>;
Point const r0;
phys::units::quantity<phys::units::frequency_d> const omegaC;
SpeedVec const vPar;
SpeedVec vPerp, uPerp;
public:
Helix(Point const pR0, phys::units::quantity<phys::units::frequency_d> pOmegaC,
SpeedVec const pvPar, SpeedVec const pvPerp) :
r0(pR0), omegaC(pOmegaC), vPar(pvPar), vPerp(pvPerp), uPerp(vPar.normalized().cross(vPerp))
{
}
Point getPosition(phys::units::quantity<phys::units::time_interval_d> t) const
{
return r0 + vPar * t + (vPerp * (cos(omegaC * t) - 1) + uPerp * sin(omegaC * t)) / omegaC;
}
};
#endif
...@@ -70,11 +70,28 @@ public: ...@@ -70,11 +70,28 @@ public:
} }
} }
template <typename ScalarDim>
auto operator/(phys::units::quantity<ScalarDim, double> const p) const
{
return (*this) * (1 / p);
}
auto operator*(double const p) const auto operator*(double const p) const
{ {
return QuantityVector<dim>(eVector * p); return QuantityVector<dim>(eVector * p);
} }
auto operator/(double const p) const
{
return QuantityVector<dim>(eVector / p);
}
auto& operator/=(double const p) const
{
eVector /= p;
return *this;
}
auto& operator*=(double const p) auto& operator*=(double const p)
{ {
eVector *= p; eVector *= p;
......
...@@ -92,23 +92,34 @@ public: ...@@ -92,23 +92,34 @@ public:
template <typename ScalarDim> template <typename ScalarDim>
auto operator*(phys::units::quantity<ScalarDim, double> const p) const auto operator*(phys::units::quantity<ScalarDim, double> const p) const
{ {
using ResQuantity = decltype(BaseVector<dim>::qVector * p); using ProdQuantity = phys::units::detail::Product<dim, ScalarDim, double, double>;
if constexpr (std::is_same<ResQuantity, double>::value) // result dimensionless, not a "Quantity" anymore
if constexpr (std::is_same<ProdQuantity, double>::value) // result dimensionless, not a "Quantity" anymore
{ {
return Vector<phys::units::dimensionless_d>(*BaseVector<dim>::cs, BaseVector<dim>::qVector * p); return Vector<phys::units::dimensionless_d>(*BaseVector<dim>::cs, BaseVector<dim>::qVector * p);
} }
else else
{ {
using res_dim = typename decltype(BaseVector<dim>::qVector * p)::dimension; return Vector<typename ProdQuantity::dimension_type>(*BaseVector<dim>::cs, BaseVector<dim>::qVector * p);
return Vector<res_dim>(*BaseVector<dim>::cs, BaseVector<dim>::qVector * p);
} }
} }
template <typename ScalarDim>
auto operator/(phys::units::quantity<ScalarDim, double> const p) const
{
return (*this) * (1 / p);
}
auto operator*(double const p) const auto operator*(double const p) const
{ {
return Vector<dim>(*BaseVector<dim>::cs, BaseVector<dim>::qVector * p); return Vector<dim>(*BaseVector<dim>::cs, BaseVector<dim>::qVector * p);
} }
auto operator/(double const p) const
{
return Vector<dim>(*BaseVector<dim>::cs, BaseVector<dim>::qVector / p);
}
auto& operator+=(Vector<dim> const& pVec) auto& operator+=(Vector<dim> const& pVec)
{ {
BaseVector<dim>::qVector += pVec.getComponents(*BaseVector<dim>::cs); BaseVector<dim>::qVector += pVec.getComponents(*BaseVector<dim>::cs);
...@@ -131,12 +142,25 @@ public: ...@@ -131,12 +142,25 @@ public:
return (*this) * (1 / norm()); return (*this) * (1 / norm());
} }
//~ template <typename dim2> template <typename dim2>
//~ auto operator*(Vector<dim2> const& pVec) auto cross(Vector<dim2> pV) const
//~ { {
//~ auto constexpr resulting_dim = dimension auto const c1 = getComponents().eVector;
//~ return Vector< auto const c2 = pV.getComponents(*BaseVector<dim>::cs).eVector;
//~ } auto const bareResult = c1.cross(c2);
using ProdQuantity = phys::units::detail::Product<dim, dim2, double, double>;
if constexpr (std::is_same<ProdQuantity, double>::value) // result dimensionless, not a "Quantity" anymore
{
return Vector<phys::units::dimensionless_d>(*BaseVector<dim>::cs, bareResult);
}
else
{
return Vector<typename ProdQuantity::dimension_type>(*BaseVector<dim>::cs, bareResult);
}
}
}; };
#endif #endif
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment