21 double hr,
double dp)
const
24 double Kgeo = (dp * dp + (hs - hr) * (hs - hr)) / (dp * dp + (hs + hr) * (hs + hr));
27 s =
s.exp(std::log(10));
28 s = (
s + (-1.0)) * Kgeo + 1.0;
29 s =
s.log() * (-10.0);
36 double d_SO,
double d_OR,
46 const double ny = nCopy.getCoords()[1];
50 if (OSvec.scalar(nConventional) < 0.)
52 nConventional.invert();
66 const double OSvecHorizontalT = OSvec.scalar(tHorizontal);
67 const double OSvecN = OSvec.scalar(nConventional);
68 const OVector3D OSvecHorizontal = tHorizontal * OSvecHorizontalT + nConventional * OSvecN;
69 const double dSOHorizontal = OSvecHorizontal.
norme();
70 const double cos_beta_a = OSvecN / dSOHorizontal;
73 const double OSvecVerticalT = OSvec.scalar(tVertical);
74 const OVector3D OSvecVertical = tVertical * OSvecVerticalT + nConventional * OSvecN;
75 const double dSOVertical = OSvecVertical.
norme();
76 const double cos_beta_h = OSvecN / dSOVertical;
79 const double l_eff =
std::min(a * cos_beta_a, h * cos_beta_h);
82 const double c_9613_2 = 340.0;
84 const double fThreshold = c_9613_2 * (2. / (l_eff * l_eff)) * (d_SO * d_OR) / (d_SO + d_OR);
89 for (
unsigned int i = 0; i < frequencies.size(); i++)
91 if (frequencies[i] > fThreshold)
93 filter.getTabValReel()[i] = 1.;
127 const OVector3D u1_non_normalized{u1_prime - axis * (u1_prime.scalar(axis) / axis.
scalar(axis))};
129 u1 = u1_non_normalized * (1. / u1_non_normalized.norme());
130 u2 = u2_non_normalized * (1. / u2_non_normalized.norme());
149 const OVector3D v{SP * (MP.scalar(SP) / (dS * dS)) - MP};
150 const double d{v.
norme()};
151 const double k{d / r};
156 const double Acurv = 10. * log10(1. + 2 * dS * dR / r / (dS + dR) / sqrt(1. - k * k));
Representation of one of the most optimal path between source and receptor: S—>R Specific derivation ...
void getCoords(double coords[3])
Gets the coordinates as an array of double.
double _y
y coordinate of OCoord3D
double _x
x coordinate of OCoord3D
double dist2DFrom(const OPoint3D &pt) const
Computes the distance from this point to another in 2D plan.
static OTabFreq getTabFreqExact()
double norme() const
Computes the length of this vector.
void normalize()
Normalizes this vector.
double scalar(const OVector3D &vector) const
Performs the scalar product between this object and another vector.
OVector3D cross(const OVector3D &vector) const
Cross product.
OSpectreOctave calcTotalGroundAttenuation(const OSpectreOctave &Agr_s, const OSpectreOctave &Agr_r, const OSpectreOctave &Agr_m, double hs, double hr, double dp) const override
Compute total ground attenuation Agr from region ground attenuations and geometric configuration.
void calcCylinderReflectionAttenuation(const OPoint3D &S, const OPoint3D &R, const OPoint3D &P, const OPoint3D &M, double r, const OVector3D &axis) override
Compute attenuation when a reflection occur on a cylinder Implements Eq. 30 of 9613-2:2024 standard.
OSpectreOctave calcMinimalExtensionConditionOneReflection(const OPoint3D &Oprev, const OPoint3D &O, double d_SO, double d_OR, double a, double h, const OVector3D &n) const override
Evaluate minimal extension condition for a specular reflection on a flat surface in function of the w...
OPoint3D projectOnPlane(const OPoint3D &P, const OVector3D &u1, const OVector3D &u2)
Project a point P on the plane spanned by (u1, u2) from (0, 0, 0)
void setAttenuation(const TYTypeAttenuation &type, const OSpectreOctave &att)
Set the atmospheric attenuation.
virtual OSpectreOctave calcTotalGroundAttenuation(const OSpectreOctave &Agr_s, const OSpectreOctave &Agr_r, const OSpectreOctave &Agr_m, double hs, double hr, double dp) const
Compute total ground attenuation Agr from region ground attenuations and geometric configuration.
std::vector< double > OTabFreq
Frequencies collection.