int Vector3f_ediv_Vector3f (Vector3f *v, Vector3f *result, Vector3f *right) { CHECK_VECTOR3F(v); CHECK_VECTOR3F(right); return Vector_ediv_Vector (v, result, right, VECTOR3F_ROWS); }
int Vector3f_compare (Vector3f *v, Vector3f *right) { CHECK_VECTOR3F(v); CHECK_VECTOR3F(right); return Vector_compare (v, right); }
int Vector3f_dot (Vector3f *v, float *result, Vector3f *right) { CHECK_VECTOR3F(v); CHECK_VECTOR3F(right); return Vector_dot (v, result, right); }
int Vector3f_sub_Vector3f (Vector3f *v, Vector3f *right) { CHECK_VECTOR3F(v); CHECK_VECTOR3F(right); return Vector_sub_Vector (v, right); }
//-------------------------------------------------------------------------- void VectorTests::testSwap() { vector::swap(v2, v4); CHECK_VECTOR3F(v2, 4.0f, 5.0f, 6.0f); vector::swap(v2, v4); CHECK_VECTOR3F(v2, 1.0f, 2.0f, 3.0f); vector::swap(v4, v2); CHECK_VECTOR3F(v2, 4.0f, 5.0f, 6.0f); vector::swap(v4, v2); CHECK_VECTOR3F(v2, 1.0f, 2.0f, 3.0f); }
//-------------------------------------------------------------------------- void VectorTests::testCopy() { v1 = v5; CHECK_VECTOR3F(v1, 1.0f, 2.0f, 3.0f); //v1 = 42.0f; //CHECK_VECTOR3F(v1, 42.0f, 42.0f, 42.0f); }
int Vector3f_cross_Vector3f (Vector3f *v, Vector3f *right) { float v0, v1, v2, right0, right1, right2; float res0, res1, res2; CHECK_VECTOR3F(v); CHECK_VECTOR3F(right); MATHLIB_ASSERT (Vector3f_getX (v, &v0)); MATHLIB_ASSERT (Vector3f_getY (v, &v1)); MATHLIB_ASSERT (Vector3f_getZ (v, &v2)); MATHLIB_ASSERT (Vector3f_getX (right, &right0)); MATHLIB_ASSERT (Vector3f_getY (right, &right1)); MATHLIB_ASSERT (Vector3f_getZ (right, &right2)); res0 = v1 * right2 - v2 * right1; res1 = v2 * right0 - v0 * right2; res2 = v0 * right1 - v1 * right0; return Vector3f_init_components (v, res0, res1, res2); }
//-------------------------------------------------------------------------- void VectorTests::testCreator() { // Check the size CPPUNIT_ASSERT_EQUAL(12_z, sizeof (Vector3f)); // Check values passed to the constructor CHECK_NAN_VECTOR3F(dummy); CHECK_VECTOR3F(v2, 1.0f, 2.0f, 3.0f); CHECK_VECTOR3F(v3, 1.0f, 2.0f, 0.0f); CHECK_VECTOR3F(v7, 1.0f, 2.0f, 0.0f); CHECK_VECTOR3F(v4, 4.0f, 5.0f, 6.0f); CHECK_VECTOR3F(v5, 1.0f, 2.0f, 3.0f); CHECK_VECTOR3F(v6, -4.0f, 5.0f, -6.0f); CPPUNIT_ASSERT_EQUAL(3_z, v1.size()); // Check the union [x,y,z] == [r,g,b] CPPUNIT_ASSERT_EQUAL(v1.r, v1.x); CPPUNIT_ASSERT_EQUAL(v1.g, v1.y); CPPUNIT_ASSERT_EQUAL(v1.b, v1.z); // Display std::cout << v2 << std::endl; }
int Vector3f_set_all (Vector3f *v, float value) { CHECK_VECTOR3F(v); return Vector_init_three_elements (v, value, value, value); }
// copy constructor int Vector3f_init_Vector3f (Vector3f *v, Vector3f *right) { CHECK_VECTOR3F(right); return Vector_init_Vector (v, right); }
int Vector3f_unit (Vector3f *v) { CHECK_VECTOR3F(v); return Vector_normalize (v); }
int Vector3f_norm (Vector3f *v, float *result) { CHECK_VECTOR3F(v); return Vector_length (v, result); }
int Vector3f_div_float (Vector3f *v, float value) { CHECK_VECTOR3F(v); return Vector_div_float (v, value); }
//-------------------------------------------------------------------------- void VectorTests::testOperations() { // Min, max, clamp, abs CHECK_VECTOR3F(vector::abs(v6), 4.0f, 5.0f, 6.0f); CHECK_VECTOR3F(vector::min(v2, dummy), v2.x, v2.y, v2.z); CHECK_VECTOR3F(vector::max(v2, dummy), v2.x, v2.y, v2.z); CHECK_VECTOR3F(vector::min(v2, Vector3f::UNIT_Z + 1.0f), 1.0f, 1.0f, 2.0f); CHECK_VECTOR3F(vector::max(v2, Vector3f::UNIT_Y + 2.0f), 2.0f, 3.0f, 3.0f); CHECK_VECTOR3F(vector::clamp(v6, -5.0f, 3.0f), -4.0f, 3.0f, -5.0f); CHECK_VECTOR3F(vector::clamp(vector::abs(v6), -3.0f, 5.0f), 4.0f, 5.0f, 5.0f); // Middle Point CHECK_VECTOR3F(vector::middle(Vector3f::ZERO, Vector3f::UNIT_Z), 0.0f, 0.0f, 0.5f); CHECK_VECTOR3F(vector::middle(Vector3f::ZERO, Vector3f::UNIT_Y), 0.0f, 0.5f, 0.0f); CHECK_VECTOR3F(vector::middle(Vector3f::ZERO, Vector3f::UNIT_X), 0.5f, 0.0f, 0.0f); CHECK_VECTOR3F(vector::middle(Vector3f::UNIT_X, -Vector3f::UNIT_X), 0.0f, 0.0f, 0.0f); CHECK_VECTOR3F(vector::middle(-Vector3f::UNIT_X, Vector3f::UNIT_X), 0.0f, 0.0f, 0.0f); CHECK_VECTOR3F(-vector::middle(Vector3f::UNIT_X, Vector3f::UNIT_X), -1.0f, 0.0f, 0.0f); // Distance v1 = Vector3f::UNIT_SCALE * 2.0f; CPPUNIT_ASSERT_EQUAL(std::sqrt(12.0f), vector::distance(v1, Vector3f::ZERO)); v1 = Vector3f::ZERO; CPPUNIT_ASSERT_EQUAL(0.0f, vector::distance(v1, Vector3f::ZERO)); // Norm CPPUNIT_ASSERT_EQUAL(5, vector::norm(Vector2i(-3, 4))); CPPUNIT_ASSERT_EQUAL(5, vector::length(Vector2i(-3, 4))); CPPUNIT_ASSERT_EQUAL(5.0f, std::sqrt(vector::squaredLength(Vector2f(-3, 4)))); CPPUNIT_ASSERT_EQUAL(1.0f, vector::length(Vector3f::UNIT_X)); CPPUNIT_ASSERT_EQUAL(std::sqrt(3.0f), vector::length(Vector3f::UNIT_SCALE)); CPPUNIT_ASSERT_EQUAL(std::sqrt(3.0f), vector::length(-Vector3f::UNIT_SCALE)); CPPUNIT_ASSERT_EQUAL(3.0f, vector::squaredLength(Vector3f::UNIT_SCALE)); CPPUNIT_ASSERT_EQUAL(0.0f, vector::dot(Vector3f::UNIT_X, Vector3f::UNIT_Y)); CPPUNIT_ASSERT_EQUAL(3.0f, vector::dot(Vector3f::UNIT_SCALE, Vector3f::UNIT_SCALE)); // Normalize v1 = vector::normalize(Vector3f::UNIT_SCALE * 2.0f); v2 = Vector3f::UNIT_SCALE / std::sqrt(3.0f); CHECK_VECTOR3B(v2 == v1, true, true, true); // Perpendicular 2D Vector2f a = Vector2f(2.0f, 4.0f); Vector2f o = vector::orthogonal(Vector2f(2.0f, 4.0f)); CPPUNIT_ASSERT_EQUAL(true, vector::orthogonal(o, a)); CPPUNIT_ASSERT_EQUAL(true, vector::eq(o, Vector2f(-4.0f, 2.0f))); CPPUNIT_ASSERT_EQUAL(false, vector::orthogonal(a, Vector2f(3.0f, 2.0f))); // Perpendicular 3D // Cross product 3D Vector3f v = vector::cross(Vector3f::UNIT_X, Vector3f::UNIT_Y); CHECK_VECTOR3B((v == Vector3f::UNIT_Z), true, true, true); v = vector::cross(Vector3f::UNIT_Y, Vector3f::UNIT_X); CHECK_VECTOR3B((v == -Vector3f::UNIT_Z), true, true, true); // Cross product 2D //Vector2f b = cross(Vector2f::UNIT_X, Vector2f::UNIT_Y); //CPPUNIT_ASSERT_EQUAL(true, eq(b, Vector2f::UNIT_Z)); //b = cross(Vector2f::UNIT_Y, Vector2f::UNIT_X); //CPPUNIT_ASSERT_EQUAL(true, eq(b, -Vector2f::UNIT_Z)); // Complex math CPPUNIT_ASSERT_EQUAL(true, vector::eq(Vector3f::NEGATIVE_UNIT_X, vector::reflect(Vector3f::UNIT_X, Vector3f::UNIT_X))); CPPUNIT_ASSERT_EQUAL(true, vector::eq(Vector3f::NEGATIVE_UNIT_Y, vector::reflect(Vector3f::UNIT_Y, Vector3f::UNIT_Y))); CPPUNIT_ASSERT_EQUAL(true, vector::eq(Vector3f::NEGATIVE_UNIT_Z, vector::reflect(Vector3f::UNIT_Z, Vector3f::UNIT_Z))); CPPUNIT_ASSERT_EQUAL(true, vector::eq(Vector3f::UNIT_X, vector::reflect(Vector3f::UNIT_X, Vector3f::UNIT_Y))); // Complex math CPPUNIT_ASSERT_DOUBLES_EQUAL(00.0f, vector::angleBetween(Vector3f::UNIT_X, Vector3f::UNIT_X), 0.0001f); CPPUNIT_ASSERT_DOUBLES_EQUAL(90.0f, vector::angleBetween(Vector3f::UNIT_X, Vector3f::UNIT_Y), 0.0001f); CPPUNIT_ASSERT_DOUBLES_EQUAL(90.0f, vector::angleBetween(Vector3f::UNIT_Y, Vector3f::UNIT_X), 0.0001f); CPPUNIT_ASSERT_DOUBLES_EQUAL(180.0f, vector::angleBetween(Vector3f::UNIT_X, Vector3f::NEGATIVE_UNIT_X), 0.0001f); CPPUNIT_ASSERT_DOUBLES_EQUAL(180.0f, vector::angleBetween(Vector3f::NEGATIVE_UNIT_X, Vector3f::UNIT_X), 0.0001f); CPPUNIT_ASSERT_DOUBLES_EQUAL(90.0f, vector::angleBetween(Vector3f::UNIT_X, Vector3f::NEGATIVE_UNIT_Y), 0.0001f); CPPUNIT_ASSERT_DOUBLES_EQUAL(90.0f, vector::angleBetween(Vector3f::NEGATIVE_UNIT_X, Vector3f::UNIT_Y), 0.0001f); CPPUNIT_ASSERT_DOUBLES_EQUAL(90.0f, vector::angleBetween(Vector3f::NEGATIVE_UNIT_X, Vector3f::UNIT_Z), 0.0001f); }
int Vector3f_getZ (Vector3f *v, float *result) { CHECK_VECTOR3F(v); return Vector_get_data (v, result, 2); }
int Vector3f_change_sign (Vector3f *v) { CHECK_VECTOR3F(v); return Vector_change_sign (v); }
int Vector3f_setZ (Vector3f *v, float value) { CHECK_VECTOR3F(v); return Vector_set_data (v, value, 2); }
//-------------------------------------------------------------------------- void VectorTests::testArithmetic() { const float c_scalar = -2.0f; float scalar = -2.0f; // Addition, substraction CHECK_VECTOR3F((v2 + v5 + v3), 3.0f, 6.0f, 6.0f); CHECK_VECTOR3F(Vector3f::ZERO + 4.0f, 4.0f, 4.0f, 4.0f); CHECK_VECTOR3F(Vector3f::UNIT_X - Vector3f::UNIT_X, 0.0f, 0.0f, 0.0f); CHECK_VECTOR3F(-Vector3f::UNIT_X, -1.0f, 0.0f, 0.0f); CHECK_VECTOR3F(+Vector3f::UNIT_X, +1.0f, 0.0f, 0.0f); CHECK_VECTOR3F(-v2, -1.0f, -2.0f, -3.0f); // Multiplication CHECK_VECTOR3F((v5 * 2.0f), 2.0f, 4.0f, 6.0f); CHECK_VECTOR3F((v5 * -2.0f), -2.0f, -4.0f, -6.0f); CHECK_VECTOR3F((-2.0f * v5), -2.0f, -4.0f, -6.0f); CHECK_VECTOR3F((c_scalar * v5), -2.0f, -4.0f, -6.0f); CHECK_VECTOR3F((-v5 * 2.0f), -2.0f, -4.0f, -6.0f); CHECK_VECTOR3F((-v5 * c_scalar), 2.0f, 4.0f, 6.0f); CHECK_VECTOR3F((-v5 * scalar), 2.0f, 4.0f, 6.0f); // Division CHECK_VECTOR3F((v5 / 2.0f), 0.5f, 1.0f, 3.0f/2.0f); CHECK_VECTOR3F((v5 / -2.0f), -0.5f, -1.0f, -3.0f/2.0f); CHECK_VECTOR3F((-2.0f / v5), -2.0f, -1.0f, -2.0f/3.0f); CHECK_VECTOR3F((c_scalar / v5), -2.0f, -1.0f, -2.0f/3.0f); CHECK_VECTOR3F((scalar / v5), -2.0f, -1.0f, -2.0f/3.0f); CHECK_VECTOR3F((-v5 / 2.0f), -0.5f, -1.0f, -3.0f/2.0f); CHECK_VECTOR3F((-v5 / c_scalar), 0.5f, 1.0f, 3.0f/2.0f); CHECK_VECTOR3F((-v5 / scalar), 0.5f, 1.0f, 3.0f/2.0f); // static Vector3f v(v2); v += 1.0f; CHECK_VECTOR3F(v, 2.0f, 3.0f, 4.0f); v += 1.0f; CHECK_VECTOR3F(v, 3.0f, 4.0f, 5.0f); v -= 2.0f; CHECK_VECTOR3F(v, 1.0f, 2.0f, 3.0f); v /= 2.0f; CHECK_VECTOR3F(v, 1.0f / 2.0f, 1.0f, 3.0f / 2.0f); v *= 2.0f; CHECK_VECTOR3F(v, 1.0f, 2.0f, 3.0f); }