⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 test.cpp

📁 一个纹理地形渲染器
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// mathematics regression test

#pragma warning( disable : 4127 )  // conditional expression is constant
#pragma warning( disable : 4100 )  // unreferenced formal parameter
#pragma warning( disable : 4702 )  // unreachable code

#ifndef _DEBUG
#pragma warning( disable : 4189 )  // local variable is initialized but not referenced (because of asserts)
#endif

#include "Matrix.h"
#include "Vector.h"
#include "Complex.h"
#include "Quaternion.h"
#include "Plane.h"
#include "Box.h"
#include "Sphere.h"
#include "Ellipsoid.h"
#include "Intersection.h"

#include <assert.h>

using namespace Mathematics;


void main()
{
	// test vector class

	Vector a(1,2,3);
	Vector b(4,5,6);
	Vector c(7,8,9);

	printf("testing vector negate\n");

	c = a;
	c.negate();
	c.multiply(-1);
	assert(c==a);

	printf("testing vector add\n");

	c = a;
	c.add(b);
	
	printf("testing vector subtract\n");

	c.subtract(b);
	assert(c==a);

	printf("testing vector scalar multiply\n");

	c = a;
	c.multiply(10.0f);
	assert(c.x==10*a.x);
	assert(c.y==10*a.y);
	assert(c.z==10*a.z);
	
	printf("testing vector scalar divide\n");

	c = a;
	c.divide(10.0f);
	assert(Float::equal(c.x,a.x/10));
	assert(Float::equal(c.y,a.y/10));
	assert(Float::equal(c.z,a.z/10));

	printf("testing vector dot product\n");

	Vector i(1,0,0);
	Vector j(0,1,0);
	Vector k(0,0,1);
	assert(i.dot(j)==0);
	assert(j.dot(k)==0);
	assert(k.dot(i)==0);

	i = a;
	i.normalize();
	j = i;
	j.multiply(-1);
	assert(Float::equal(i.dot(j), -1.0f));

	printf("testing vector cross product\n");

	i = Vector(1,0,0);
	j = Vector(0,1,0);
	k = Vector(0,0,1);

	Vector result;
	i.cross(j, result);
	assert(result==k);

	j.cross(k, result);
	assert(result==i);

	k.cross(i, result);
	assert(result==j);

	printf("testing vector length squared\n");

	assert(Float::equal(i.length_squared(), 1));
	assert(Float::equal(j.length_squared(), 1));
	assert(Float::equal(k.length_squared(), 1));

	printf("testing vector length\n");

	c = a;
	c.multiply(10);
	assert(Float::equal(a.length() * 10, c.length()));

	printf("testing vector normalize\n");

	c.normalize();
	assert(Float::equal(c.length(), 1));

	printf("testing vector operators\n");
	{
		Vector u = Vector(1,2,3);
		Vector v = Vector(2,3,4);
		Vector w = Vector(3,4,5);
		Vector zero = Vector(0,0,0);

		const float a = 5;
		const float b = 3;
		const float c = 2;

		assert(u+u==2*u);
		assert(v+v==2*v);
		assert(w+w==2*w);

		assert(a*u + b*v + c*w == u*a + v*b + w*c);
		assert(a*u - b*v - c*w == u*a - v*b - w*c);
		assert(a*(u + v + w) == a*u + a*v + a*w);
		assert(a*(u + v + w) == u*a + v*a + w*a);
		assert(u+(v+w) == (u+v)+w);
		assert(u-(v-w) == (u-v)+w);
		assert(zero - v == -v);

		Vector i(1,0,0);
		Vector j(0,1,0);
		Vector k(0,0,1);
		assert(i*j==k);
		assert(j*k==i);
		assert(k*i==j);
		assert(j*i==-k);
		assert(k*j==-i);
		assert(i*k==-j);

		Vector x = u;
		x += v;
		assert(x==u+v);

		x = u;
		x -= v;
		assert(x==u-v);

		x = i;
		x *= j;
		assert(x==i*j);

		x = u;
		x *= a;
		assert(x==u*a);

		x = u;
		x /= a;
		assert(x==u/a);
	}

	printf("testing vector orthonormal basis");
	{
		Vector u(1,2,3);
		u.normalize();

		Vector v,w;

		Vector::orthonormal_basis(u,v,w);
	}

	// test matrix class

	printf("testing matrix zero\n");

	a = Vector(1,1,1);
	Matrix matrix;
	matrix.zero();
	matrix.transform(a);
	assert(a==Vector(0,0,0));

	printf("testing matrix identity\n");

	a = Vector(8,6,5);
	matrix.zero();
	matrix.transform(a);
	assert(a==Vector(0,0,0));

	printf("testing matrix translate\n");

	a = Vector(1,2,3);
	b = Vector(1,1,1);
	c = a;
	c.add(b);
	matrix.identity();
	matrix.translate(b.x, b.y, b.z);
	matrix.transform(a);
	assert(a==c);

	printf("testing matrix scale\n");

	a = Vector(1,2,3);
	b = a;
	b.multiply(3);
	matrix.scale(3);
	matrix.transform(a);
	assert(a==b);

	a = Vector(1,2,3);
	b = a;
	b.x *= 3;
	b.y *= 4;
	b.z *= 5;
	matrix.diagonal(3,4,5);
	matrix.transform(a);
	assert(a==b);

	printf("testing matrix determinant\n");

	a = Vector(1,2,3);
	matrix = Matrix(a, a, a);
	assert(Float::equal(matrix.determinant(),0));

	b = Vector(3,2,1);
	matrix = Matrix(a, a, b);
	assert(Float::equal(matrix.determinant(),0));

	c = Vector(5,5,6);
	matrix = Matrix(a, b, c);
	assert(!Float::equal(matrix.determinant(),0));

	printf("testing matrix inverse\n");
	
	Matrix product;
	Matrix inverse;
	matrix.inverse(inverse);
	matrix.multiply(inverse, product);
	Matrix identity;
	identity.identity();
	assert(product==identity);
	Matrix output;
	inverse.inverse(output);
	assert(output==matrix);

	printf("testing matrix transpose\n");

	Matrix transpose;
	matrix.transpose(transpose);
	transpose.transpose(output);
	assert(output==matrix);

	printf("testing matrix transform\n");

	Matrix A(matrix);		// Ax = b <-> x = Ainv b
	Vector x(1,2,3);
	A.transform(x, b);
	result = x;
	A.transform(result);
	assert(b==result);
	Matrix Ainv;
	A.inverse(Ainv);
	Vector y;
	Ainv.transform(b, y);
	assert(x==y);

	printf("testing matrix multiply and add\n");

	Matrix B(Vector(1,5,3), Vector(0,1,2), Vector(5,6,10));
	x = Vector(1,2,3);
	Vector AplusB_x, Ax_plus_Bx;
	Matrix AplusB;
	AplusB = A;
	AplusB.add(B);
	AplusB.transform(x,AplusB_x);
	Vector Ax, Bx;
	A.transform(x,Ax);
	B.transform(x,Bx);
	Ax_plus_Bx = Ax;
	Ax_plus_Bx.add(Bx);
	assert(AplusB_x==Ax_plus_Bx);

	printf("testing matrix multiply and subtract\n");

	B = Matrix(Vector(1,5,3), Vector(0,1,2), Vector(5,6,10));
	x = Vector(1,2,3);
	Vector AminusB_x, Ax_minus_Bx;
	Matrix AminusB;
	AminusB = Matrix(A);
	AminusB.subtract(B);
	AminusB.transform(x,AminusB_x);
	A.transform(x,Ax);
	B.transform(x,Bx);
	Ax_minus_Bx = Ax;
	Ax_minus_Bx.subtract(Bx);
	assert(AminusB_x==Ax_minus_Bx);

	printf("testing matrix multiply and scalar multiply\n");

	const float s = 10;
	Vector s_Ax, sA_x;
	Matrix sA = A;
	sA.multiply(s);
	sA.transform(x,sA_x);
	A.transform(x,s_Ax);
	s_Ax.multiply(s);
	assert(s_Ax==sA_x);

	{
		printf("testing matrix rotate\n");

		Vector x(1,2,3);

		Vector axis(2,3,4);
		axis.normalize();

		Matrix R;
		R.rotate(2*Float::pi, axis);
		assert(R*x==x);
		assert(x*R==x);

		const float angle = 0.1f;

		R.rotate(angle, axis);
		Vector _x = R*x;
		R.rotate(angle, -axis);
		_x = R*_x;
		assert(_x==x);

		R.rotate(angle, Vector(1,0,0));
		_x = R*x;
		assert(Float::equal(_x.x,x.x));
		assert(Float::equal(_x.length(), x.length()));

		R.rotate(angle, Vector(0,1,0));
		_x = R*x;
		assert(Float::equal(_x.y,x.y));
		assert(Float::equal(_x.length(), x.length()));

		R.rotate(angle, Vector(0,0,1));
		_x = R*x;
		assert(Float::equal(_x.z,x.z));
		assert(Float::equal(_x.length(), x.length()));
	}

	// test projection matrix

	// test orthogonal matrix

	// test lookat matrix

	printf("testing matrix operators\n");
	{
		Matrix A( 1,0,0,
			      2,1,2,
				  3,2,1 );

		Matrix B( 4,0,0,
			      0,2,0,
				  0,0,3 );

		Matrix C( 5,6,2,
			      2,5,2,
				  1,2,3 );

		const float a = 2;
		const float b = 3;
		const float c = 4;

		Matrix zero;
		zero.zero();

		Matrix identity;
		identity.identity();

		Vector x(1,2,3);
		Vector y(2,3,4);
		Vector z(3,4,5);

		Vector result;
		A.transform(x, result);
		assert(result==A*x);

		assert(B.transpose()*A.transpose()==(A*B).transpose());
		assert(A.transpose()*B.transpose()==(B*A).transpose());

		assert(B.inverse()*A.inverse()==(A*B).inverse());
		assert(A.inverse()*B.inverse()==(B*A).inverse());

		assert(A.inverse()*A==identity);
		assert(A*A.inverse()==identity);
		
		assert(identity.inverse()==identity);

		result = x;
		result *= A;
		assert(result==A*x);

		assert(A*zero==zero);
		assert(zero*A==zero);

		assert(a*A+a*B==a*(A+B));
		assert(a*A-a*B==a*(A-B));

		assert(A*a+B*a==(A+B)*a);
		assert(A*a-B*a==(A-B)*a);
		assert(A/a+B/a==(A+B)/a);
		assert(A/a-B/a==(A-B)/a);

		assert((-A)==-1*A);
		assert(A+(-A)==zero);
		assert(A-(-A)==2*A);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -