1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
|
/*
* PhiWedgeTest.cpp
*
* Created on: 09.10.2014
* Author: swenzel
*/
#include "VecGeom/volumes/Wedge.h"
#ifdef NDEBUG
#undef NDEBUG
#endif
using namespace vecgeom;
typedef Vector3D<Precision> Vector3D_t;
__attribute__((noinline))
// this function is just here for inspection of assembly output
int foo( Wedge const & wedge, Vector3D_t const & point )
{
return wedge.Inside<kScalar>(point);
}
int main()
{
{
// test reported by Raman Segal
Wedge wedge(3. * kPi / 2., kPi / 6.);
assert(wedge.IsOnSurface1(Vector3D_t(4.589551141500899, 2.649778586424563, 4.573258549707597)));
assert(!wedge.IsOnSurface2(Vector3D_t(4.589551141500899, 2.649778586424563, 4.573258549707597)));
assert(wedge.Inside<kScalar>(Vector3D_t(4.589551141500899, 2.649778586424563, 4.573258549707597)) ==
EInside::kSurface);
// the opposite point should be inside
assert(wedge.Contains<kScalar>(Vector3D_t(-4.589551141500899, -2.649778586424563, 4.573258549707597)));
assert(wedge.Inside<kScalar>(Vector3D_t(-4.589551141500899, -2.649778586424563, 4.573258549707597)) ==
EInside::kInside);
assert(wedge.Inside<kScalar>(Vector3D_t(0., 0., 0.)) == EInside::kSurface);
}
// test a wedge < kPi
{
Wedge wedge(kPi / 3.);
// tests on contains
assert(!wedge.Contains<kScalar>(Vector3D_t(1., -2. * kTolerance, 0.)));
assert(wedge.Contains<kScalar>(Vector3D_t(1., 0., 0.)));
assert(!wedge.Contains<kScalar>(Vector3D_t(1., -1. * kTolerance, 0.)));
assert(!wedge.Contains<kScalar>(Vector3D_t(-1, -1., 0.)));
assert(wedge.Contains<kScalar>(Vector3D_t(std::cos(kPi / 3.), std::sin(kPi / 3.), 0.)));
assert(!wedge.Contains<kScalar>(Vector3D_t(std::cos(kPi / 3. + kAngTolerance), std::sin(kPi / 3. + kAngTolerance), 0.)));
assert(wedge.Contains<kScalar>(Vector3D_t(std::cos(kPi / 6.), std::sin(kPi / 6.), 0.)));
assert(!wedge.Contains<kScalar>(Vector3D_t(std::cos(kPi / 2.), std::sin(kPi / 2.), 0.)));
assert(!wedge.Contains<kScalar>(Vector3D_t(-1., 0., 0.)));
// tests on inside
assert(wedge.Inside<kScalar>(Vector3D_t(1., 0., 0.)) == EInside::kSurface);
assert(wedge.Inside<kScalar>(Vector3D_t(1., -0.5 * kTolerance, 0.)) == EInside::kSurface);
assert(wedge.Inside<kScalar>(Vector3D_t(1., 0.5 * kTolerance, 0.)) == EInside::kSurface);
assert(wedge.Inside<kScalar>(Vector3D_t(std::cos(kPi / 3.), std::sin(kPi / 3.), 0.)) == EInside::kSurface);
assert(wedge.Inside<kScalar>(Vector3D_t(std::cos(kPi / 3. + kAngTolerance), std::sin(kPi / 3. + kAngTolerance), 0.)) ==
EInside::kOutside);
assert(wedge.Inside<kScalar>(Vector3D_t(std::cos(kPi / 6.), std::sin(kPi / 6.), 0.)) == EInside::kInside);
assert(wedge.Inside<kScalar>(Vector3D_t(std::cos(kPi / 2.), std::sin(kPi / 2.), 0.)) == EInside::kOutside);
}
// test a wedge > kPi
{
Precision angle = kPi + kPi / 3.;
Wedge wedge(angle);
// tests on contains
assert(!wedge.Contains<kScalar>(Vector3D_t(1., -2. * kTolerance, 0.)));
assert(wedge.Contains<kScalar>(Vector3D_t(1., 0., 0.)));
assert(!wedge.Contains<kScalar>(Vector3D_t(1., -1. * kTolerance, 0.)));
assert(wedge.Contains<kScalar>(Vector3D_t(std::cos(angle / 3.), std::sin(angle / 3.), 0.)));
assert(!wedge.Contains<kScalar>(Vector3D_t(std::cos(angle + kAngTolerance), std::sin(angle + kAngTolerance), 0.)));
assert(wedge.Contains<kScalar>(Vector3D_t(std::cos(angle / 6.), std::sin(angle / 6.), 0.)));
assert(!wedge.Contains<kScalar>(Vector3D_t(std::cos(angle + 0.1), std::sin(angle + 0.1), 0.)));
// tests on inside
assert(wedge.Inside<kScalar>(Vector3D_t(1., 0., 0.)) == EInside::kSurface);
assert(wedge.Inside<kScalar>(Vector3D_t(1., -0.5 * kTolerance, 0.)) == EInside::kSurface);
assert(wedge.Inside<kScalar>(Vector3D_t(1., 0.5 * kTolerance, 0.)) == EInside::kSurface);
assert(wedge.Inside<kScalar>(Vector3D_t(std::cos(angle), std::sin(angle), 0.)) == EInside::kSurface);
assert(wedge.Inside<kScalar>(Vector3D_t(std::cos(angle + kAngTolerance), std::sin(angle + kAngTolerance), 0.)) ==
EInside::kOutside);
assert(wedge.Inside<kScalar>(Vector3D_t(std::cos(angle / 6.), std::sin(angle / 6.), 0.)) == EInside::kInside);
assert(wedge.Inside<kScalar>(Vector3D_t(std::cos(angle + 0.1), std::sin(angle + 0.1), 0.)) == EInside::kOutside);
}
return 0;
}
|