40TEST(AngleIntervalTest, InnerAngleConstrutor) {
41 std::vector<AngleInterval> ivs;
43 ivs.emplace_back(0, M_PI,
true);
44 ivs.emplace_back(0, M_PI,
false);
45 ivs.emplace_back(M_PI, 0,
true);
46 ivs.emplace_back(M_PI, 0,
false);
49 for (
auto & iv : ivs) {
55TEST(AngleIntervalTest, Containment) {
64 EXPECT_EQ(a.
extent(), M_PI);
68 EXPECT_EQ(b.
extent(), M_PI);
70 EXPECT_FALSE(
c.contains(1.));
71 EXPECT_TRUE(
c.contains(5.));
72 EXPECT_EQ(
c.extent(), M_PI);
76 EXPECT_EQ(d.
extent(), M_PI);
80 EXPECT_EQ(e.
extent(), 2*M_PI);
83TEST(AngleIntervalTest, TimeAtAngle) {
84 Coord pi32 = (3./2.)*M_PI;
95 EXPECT_EQ(a.
extent(), M_PI/2);
96 for (
Coord t = -1; t <= 2; t += 0.125) {
100 EXPECT_FLOAT_EQ(ti, t);
105 EXPECT_EQ(b.
extent(), pi32);
108 EXPECT_FLOAT_EQ(b.
timeAtAngle((11./8)*M_PI), -1./12);
109 for (
Coord t = -0.125; t <= 1.125; t += 0.0625) {
113 EXPECT_FLOAT_EQ(ti, t);
116 EXPECT_EQ(
c.timeAtAngle(M_PI), 0);
117 EXPECT_EQ(
c.timeAtAngle(0), 1);
118 EXPECT_EQ(
c.extent(), M_PI);
119 EXPECT_FLOAT_EQ(
c.timeAtAngle(M_PI/2), 0.5);
120 for (
Coord t = -0.25; t <= 1.25; t += 0.125) {
122 Coord ti =
c.timeAtAngle(angle);
123 EXPECT_EQ(unit.
contains(ti),
c.contains(angle));
124 EXPECT_FLOAT_EQ(ti, t);
129 EXPECT_EQ(d.
extent(), pi32);
131 for (
Coord t = -0.125; t <= 1.125; t += 0.0625) {
135 EXPECT_FLOAT_EQ(ti, t);
139 EXPECT_EQ(e.
extent(), 2*M_PI);
141 for (
Coord t = 0; t < 1; t += 0.125) {
146 EXPECT_FLOAT_EQ(ti, t);
150 EXPECT_EQ(f.
extent(), 2*M_PI);
152 for (
Coord t = 0; t < 1; t += 0.125) {
157 EXPECT_FLOAT_EQ(ti, t);
161TEST(AngleIntervalTest, AngleAt) {
162 Coord pi32 = (3./2.)*M_PI;
170 EXPECT_EQ(a.
extent(), M_PI/2);
171 for (
Coord t = -1; t <= 2; t += 0.125) {
175 EXPECT_EQ(
c.angleAt(0), M_PI);
176 EXPECT_EQ(
c.angleAt(1), 0.);
177 EXPECT_EQ(
c.extent(), M_PI);
178 for (
Coord t = -0.25; t <= 1.25; t += 0.0625) {
184 for (
Coord t = 0; t < 1; t += 0.125) {
187 EXPECT_EQ(f2.
angleAt(0), M_PI);
188 EXPECT_EQ(f2.
angleAt(1), M_PI);
189 for (
Coord t = 0; t < 1; t += 0.125) {
194TEST(AngleIntervalTest, Extent) {
195 Coord pi32 = (3./2.)*M_PI;
201 EXPECT_EQ(a.
extent(), M_PI/2);
203 EXPECT_EQ(b.
extent(), pi32);
205 EXPECT_EQ(
c.extent(), M_PI);
206 EXPECT_EQ(
c.sweepAngle(), -M_PI);
207 EXPECT_EQ(d.
extent(), pi32);
211TEST(DegRadConversion, PreservesPI180)
213 EXPECT_EQ(deg_from_rad(M_PI), 180);
214 EXPECT_EQ(rad_from_deg(180), M_PI);
Various trigoniometric helper functions.
Directed angular interval.
Coord sweepAngle() const
Get the sweep angle of the interval.
Angle angleAt(Coord t) const
Get an angle corresponding to the specified time value.
Coord timeAtAngle(Angle a) const
Compute a time value that would evaluate to the given angle.
Coord extent() const
Extent of the angle interval.
static AngleInterval create_full(Angle start, bool sweep=true)
bool contains(Angle a) const
Check whether the interval includes the given angle.
Wrapper for angular values.
constexpr bool contains(C val) const
Check whether the interval includes this number.
Range of real numbers that is never empty.
double inner(valarray< double > const &x, valarray< double > const &y)
constexpr Coord lerp(Coord t, Coord a, Coord b)
Numerically stable linear interpolation.
double Coord
Floating point type used to store coordinates.
Various utility functions.
TEST(AffineTest, Equality)