void test_vunit(void) { EXPECT_APPROX(1.0, az_vnorm(az_vunit(AZ_VZERO))); EXPECT_APPROX(az_vtheta(AZ_VZERO), az_vtheta(az_vunit(AZ_VZERO))); for (int i = 0; i < 1000; ++i) { const az_vector_t vec = {az_random(-1.5, 1.5), az_random(-1.5, 1.5)}; ASSERT_APPROX(1.0, az_vnorm(az_vunit(vec))); ASSERT_APPROX(az_vtheta(vec), az_vtheta(az_vunit(vec))); } }
void test_vcaplen(void) { EXPECT_APPROX(0.0, az_vnorm(az_vcaplen(AZ_VZERO, 3.0))); EXPECT_APPROX(0.0, az_vnorm(az_vcaplen(az_vpolar(3, 3), 0))); for (int i = 0; i < 1000; ++i) { const az_vector_t v1 = {az_random(-1.5, 1.5), az_random(-1.5, 1.5)}; const double length = az_random(0.0, 1.3); const az_vector_t v2 = az_vcaplen(v1, length); ASSERT_APPROX(fmin(length, az_vnorm(v1)), az_vnorm(v2)); ASSERT_APPROX(az_vtheta(v1), az_vtheta(v2)); } }
void test_vaddlen(void) { EXPECT_APPROX(3.0, az_vnorm(az_vaddlen(AZ_VZERO, 3.0))); EXPECT_APPROX(0.0, az_vtheta(az_vaddlen(AZ_VZERO, 3.0))); EXPECT_APPROX(4.0, az_vnorm(az_vaddlen(AZ_VZERO, -4.0))); EXPECT_APPROX(AZ_PI, az_vtheta(az_vaddlen(AZ_VZERO, -4.0))); for (int i = 0; i < 1000; ++i) { const az_vector_t v1 = {az_random(-1.5, 1.5), az_random(-1.5, 1.5)}; const double length = az_random(0.0, 1.3); const az_vector_t v2 = az_vaddlen(v1, length); ASSERT_APPROX((length + az_vnorm(v1)), az_vnorm(v2)); ASSERT_APPROX(az_vtheta(v1), az_vtheta(v2)); } }
void test_vwithlen(void) { EXPECT_APPROX(3.0, az_vnorm(az_vwithlen(AZ_VZERO, 3.0))); EXPECT_APPROX(0.0, az_vtheta(az_vwithlen(AZ_VZERO, 3.0))); for (int i = 0; i < 1000; ++i) { const az_vector_t v1 = {az_random(-1.5, 1.5), az_random(-1.5, 1.5)}; const double length = az_random(0.0, 1.3); const az_vector_t v2 = az_vwithlen(v1, length); ASSERT_APPROX(length, az_vnorm(v2)); ASSERT_APPROX(az_vtheta(v1), az_vtheta(v2)); } for (int i = 0; i < 1000; ++i) { const az_vector_t v1 = {az_random(-1.5, 1.5), az_random(-1.5, 1.5)}; const double length = az_random(0.0, 1.3); const az_vector_t v2 = az_vwithlen(v1, -length); ASSERT_APPROX(length, az_vnorm(v2)); ASSERT_APPROX(az_vtheta(v1), az_mod2pi(az_vtheta(v2) + AZ_PI)); } }
template<class T, unsigned int D> void testIntersectsDistance() { HyperSphere<T, D> sphere { }; HyperSphere<T, D> sphere2 { }; HyperPlane<T, D> plane {}; plane.normal()[0] = 1; HyperRectangle<T, D> rect {}; ASSERT_EQ(sphere.intersects(sphere2), true); ASSERT_EQ(sphere.intersects(plane), true); ASSERT_EQ(sphere.intersects(rect), true); ASSERT_EQ(sphere.getSignedDistance(sphere2), -2); ASSERT_EQ(sphere.getSignedDistance(sphere2.center()), -1); sphere.center()[0] = 1; plane.base()[0] = 10; ASSERT_EQ(sphere.intersects(sphere2), true); ASSERT_EQ(sphere.intersects(plane), false); ASSERT_EQ(sphere.intersects(rect), true); ASSERT_EQ(sphere.getSignedDistance(sphere2), -1); ASSERT_EQ(sphere.getSignedDistance(sphere2.center()), 0); sphere.center()[0] = 2; plane.base()[0] = 0; ASSERT_EQ(sphere.intersects(sphere2), true); ASSERT_EQ(sphere.intersects(plane), false); ASSERT_EQ(sphere.intersects(rect), true); ASSERT_EQ(sphere.getSignedDistance(sphere2), 0); ASSERT_EQ(sphere.getSignedDistance(sphere2.center()), 1); sphere.center()[0] = 2.1f; plane.base()[0] = 1; plane.base()[1] = 1; plane.normal()[0] = 1; plane.normal()[1] = 1; plane.normal().normalize(); rect.pos()[0] = 1; rect.pos()[1] = 1; ASSERT_EQ(sphere.intersects(sphere2), false); ASSERT_EQ(sphere.intersects(plane), true); ASSERT_EQ(sphere.intersects(rect), false); ASSERT_APPROX(sphere.getSignedDistance(sphere2), 0.1f, 0.01f); ASSERT_APPROX(sphere.getSignedDistance(sphere2.center()), 1.1f, 0.01f); }