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

📄 test.cpp

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

		Matrix matrix = A;
		matrix += B;
		assert(matrix==A+B);

		matrix = A;
		matrix -= B;
		assert(matrix==A-B);

		matrix = A;
		matrix *= B;
		assert(matrix==A*B);

		matrix = A;
		matrix *= a;
		assert(matrix==A*a);

		matrix = A;
		matrix /= a;
		assert(matrix==A/a);

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

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

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

		assert(a*(A*x) + b*(B*y) + c*(C*z) == (a*A)*x + (b*B)*y + (c*C)*z);
		assert(a*(A*x) - b*(B*y) - c*(C*z) == (a*A)*x - (b*B)*y - (c*C)*z);

		assert(a*(A*x) + b*(B*y) + c*(C*z) == A*(a*x) + B*(b*y) + C*(c*z));
		assert(a*(x*A) - b*(y*B) - c*(z*C) == (a*x)*A - (b*y)*B - (c*z)*C);

		assert(x*A==A.transpose()*x);
		assert(y*B==B.transpose()*y);
		assert(z*C==C.transpose()*z);
	}

	// test quaternion class
	{
		{
			printf("testing quaternion identity\n");

			Vector a(8,6,5);
			Vector b;
			Quaternion quaternion;
			quaternion.identity();
			matrix = quaternion.matrix();
			matrix.transform(a,b);
			assert(b==a);

			Quaternion p(1,2,3,4);
			assert(p*identity==p);
			assert(identity*p==p);

			// todo: test quaternion zero, what properties does it have ?
		}

		printf("testing quaternion add\n");

		Quaternion a(1,2,3,4);
		Quaternion b(2,3,4,5);
		Quaternion c(3,4,5,6);

		const float s = 5;

		Quaternion q;
		q = a;
		q.add(b);
		assert(q.w==a.w+b.w);
		assert(q.x==a.x+b.x);
		assert(q.y==a.y+b.y);
		assert(q.z==a.z+b.z);

		printf("testing quaternion subtract\n");

		q = a;
		q.subtract(b);
		assert(q.w==a.w-b.w);
		assert(q.x==a.x-b.x);
		assert(q.y==a.y-b.y);
		assert(q.z==a.z-b.z);

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

		q = a;
		q.multiply(s);
		assert(q.w==a.w*s);
		assert(q.x==a.x*s);
		assert(q.y==a.y*s);
		assert(q.z==a.z*s);

		printf("testing quaternion scalar divide\n");

		q = a;
		q.divide(s);
		assert(Float::equal(q.w,a.w/s));
		assert(Float::equal(q.x,a.x/s));
		assert(Float::equal(q.y,a.y/s));
		assert(Float::equal(q.z,a.z/s));

		printf("testing quaternion multiply\n");

		q = Quaternion(0,1,0,0);
		q.multiply(q);
		assert(q==Quaternion(-1,0,0,0));

		q = Quaternion(0,0,1,0);
		q.multiply(q);
		assert(q==Quaternion(-1,0,0,0));

		q = Quaternion(0,0,0,1);
		q.multiply(q);
		assert(q==Quaternion(-1,0,0,0));

		q = Quaternion(1,0,0,0);
		q.multiply(q);
		assert(q==Quaternion(1,0,0,0));

		q = Quaternion(0,1,0,0);
		q.multiply(Quaternion(0,0,1,0));
		assert(q==Quaternion(0,0,0,1));

		q = Quaternion(0,0,1,0);
		q.multiply(Quaternion(0,1,0,0));
		assert(q==Quaternion(0,0,0,-1));

		q = Quaternion(0,0,0,1);
		q.multiply(Quaternion(0,1,0,0));
		assert(q==Quaternion(0,0,1,0));

		q = Quaternion(0,1,0,0);
		q.multiply(Quaternion(0,0,0,1));
		assert(q==Quaternion(0,0,-1,0));

		Quaternion result;
		q = Quaternion(0,1,0,0);
		q.multiply(q,result);
		assert(result==Quaternion(-1,0,0,0));

		q = Quaternion(0,0,1,0);
		q.multiply(q,result);
		assert(result==Quaternion(-1,0,0,0));

		q = Quaternion(0,0,0,1);
		q.multiply(q,result);
		assert(result==Quaternion(-1,0,0,0));

		q = Quaternion(1,0,0,0);
		q.multiply(q,result);
		assert(result==Quaternion(1,0,0,0));

		q = Quaternion(0,1,0,0);
		q.multiply(Quaternion(0,0,1,0),result);
		assert(result==Quaternion(0,0,0,1));

		q = Quaternion(0,0,1,0);
		q.multiply(Quaternion(0,1,0,0),result);
		assert(result==Quaternion(0,0,0,-1));

		q = Quaternion(0,0,0,1);
		q.multiply(Quaternion(0,1,0,0),result);
		assert(result==Quaternion(0,0,1,0));

		q = Quaternion(0,1,0,0);
		q.multiply(Quaternion(0,0,0,1),result);
		assert(result==Quaternion(0,0,-1,0));

		printf("testing quaternion conjugate\n");

		assert(a.conjugate().conjugate()==a);

		assert(Float::equal(a.conjugate().w,a.w));
		assert(Float::equal(a.conjugate().x,-a.x));
		assert(Float::equal(a.conjugate().y,-a.y));
		assert(Float::equal(a.conjugate().z,-a.z));

		printf("testing quaternion norm\n");

		Quaternion p, pq;
		p = a;
		q = b;
		p.multiply(q,pq);
		assert(Float::equal(p.norm()*q.norm(),pq.norm()));

		a.conjugate(result);
		assert(result.norm()==a.norm());

		printf("testing quaternion length\n");

		assert(Float::equal(p.length(),Float::sqrt(p.norm())));

		printf("testing quaternion normalize\n");
		{
			Quaternion n = p;
			n.normalize();
			assert(n.normalized());
			assert(n.conjugate()==n.inverse());

			n = q;
			n.normalize();
			assert(n.normalized());
			assert(n.conjugate()==n.inverse());
		}

		printf("testing quaternion inverse\n");

		assert(a.inverse().inverse()==a);

		q.multiply(q.inverse());
		assert(q==1);

		Quaternion q_inv = q.inverse();
		q_inv.multiply(q);
		assert(q_inv==1);

		printf("testing quaternion operators\n");
		{
			Quaternion p(1,2,3,4);
			Quaternion q(2,3,4,5);
			Quaternion r(3,4,5,6);

			const float a = 5;

			assert(p-p==0);
			assert(q-q==0);
			assert(r-r==0);

			assert(p+p==2*p);
			assert(q+q==2*q);
			assert(r+r==2*r);

			assert(p+q==q+p);
			assert(p-q==-(q-p));

			assert(a*p==p*a);
			assert(a*p+a*q+a*r==a*(p+q+r));
			assert(p*a+q*a+r*a==(p+q+r)*a);

			assert(p/a==p*1.0f/a);
			assert(p/a+q/a+r/a==(p+q+r)/a);

			assert(Quaternion(0,1,0,0)*Quaternion(0,1,0,0)==-1);
			assert(Quaternion(0,0,1,0)*Quaternion(0,0,1,0)==-1);
			assert(Quaternion(0,0,0,1)*Quaternion(0,0,0,1)==-1);
			
			assert(Quaternion(0,1,0,0)*Quaternion(0,0,1,0)==Quaternion(0,0,0,1));
			assert(Quaternion(0,0,1,0)*Quaternion(0,1,0,0)==Quaternion(0,0,0,-1));

			assert(Quaternion(0,0,1,0)*Quaternion(0,0,0,1)==Quaternion(0,1,0,0));
			assert(Quaternion(0,0,0,1)*Quaternion(0,0,1,0)==Quaternion(0,-1,0,0));

			assert(Quaternion(0,0,0,1)*Quaternion(0,1,0,0)==Quaternion(0,0,1,0));
			assert(Quaternion(0,1,0,0)*Quaternion(0,0,0,1)==Quaternion(0,0,-1,0));

			assert((p*q).conjugate()==q.conjugate()*p.conjugate());
			assert((q*p).conjugate()==p.conjugate()*q.conjugate());
			assert((q*r).conjugate()==r.conjugate()*q.conjugate());
			assert((p*q).conjugate()==q.conjugate()*p.conjugate());
			assert((p*r).conjugate()==r.conjugate()*p.conjugate());
			assert((r*p).conjugate()==p.conjugate()*r.conjugate());

			assert(p.norm()*q.norm()==(p*q).norm());

			assert(p*p.inverse()==1);
			assert(q*q.inverse()==1);
			assert(r*r.inverse()==1);

			assert(p.inverse()==p.conjugate()/p.norm());
			assert(q.inverse()==q.conjugate()/q.norm());
			assert(r.inverse()==r.conjugate()/r.norm());

			assert((p*q).inverse()==q.inverse()*p.inverse());
			assert((q*p).inverse()==p.inverse()*q.inverse());
			assert((q*r).inverse()==r.inverse()*q.inverse());
			assert((p*q).inverse()==q.inverse()*p.inverse());
			assert((p*r).inverse()==r.inverse()*p.inverse());
			assert((r*p).inverse()==p.inverse()*r.inverse());

			assert(p.w == (p+p.conjugate())/2);
			assert(q.w == (q+q.conjugate())/2);
			assert(r.w == (r+r.conjugate())/2);

			Quaternion t;
			t = p;
			t += q;
			assert(t==p+q);

			t = p;
			t -= q;
			assert(t==p-q);

			t = p;
			t *= q;
			assert(t==p*q);			// todo: decide on definition of quaternion *= quaternion

			t = p;
			t *= a;
			assert(t==p*a);

			t = p;
			t /= a;
			assert(t==p/a);
		}

		printf("testing quaternion dot\n");

		assert(a.dot(b)==(a*b.conjugate()).w);

		// todo: axis angle <-> quaternion conversion

		// todo: quaternion <-> matrix conversion
		
		// todo: euler <-> quaternion conversion
	}

	// test complex class

	printf("testing complex axioms\n");
	{
		Complex a(1,1);
		Complex b(2,3);
		Complex c(-2,-1);
		Complex d(2,1);

		// 1. commutativity of addition
		
		assert(a+b==b+a);				

		// 2. associativity of addition

		assert((a+b)+c==a+(b+c));

		// 3. existence of zero

		assert(a+0==0+a && 0+a==a);
		assert(a*0==0*a && 0*a==0);

		// 4. existence of negatives
        
		assert(a+(-a)==(-a)+a && (-a)+a==0);

		// 5. commutativity of multiplication

		assert(a*b==b*a);

		// 6. associativity of multiplication

		assert((a*b)*c==a*(b*c));

		// 7. existance of identity

		assert(a*Complex(1,0)==Complex(1,0)*a && Complex(1,0)*a==a);

		// 8. existance of multiplicative inverse

		assert(a*a.inverse() == Complex(1,0));

		// 9. distributivity

		assert(a*(b+c)==a*b+a*c);
	}
		
	printf("testing plane primitive\n");
	{
		Plane plane(Vector(0,0,10), Vector(0,0,1));
		assert(Float::equal(plane.distance(Vector(0,0,10)),0));
		assert(Float::equal(plane.distance(Vector(0,0,0)),-10));
		assert(Float::equal(plane.distance(Vector(0,0,20)),10));
		
		assert(plane.normal==Vector(0,0,1));
	}

	printf("testing sphere primitive\n");
	{
		Sphere sphere(Vector(1,2,3), 1);
		assert(Float::equal(sphere.distance(sphere.center), -sphere.radius));
		assert(Float::equal(sphere.distance(sphere.center + Vector(0,0,1)), 0));
		assert(Float::equal(sphere.distance(sphere.center + Vector(0,2,0)), 1));
		assert(Float::equal(sphere.distance(sphere.center + Vector(-1,0,0)), 0));
		assert(Float::equal(sphere.distance(sphere.center + Vector(-5,0,0)), 4));
	}

	printf("testing ellipsoid primitive\n");
	{
		Quaternion quaternion(1,2,3,4);
		quaternion.normalize();
		Matrix matrix = quaternion.matrix();

		Ellipsoid ellipsoid(Vector(1,2,3), 1, 2, 3, quaternion);

		Vector i(1,0,0);
		Vector j(0,1,0);
		Vector k(0,0,1);
		
		Vector a = ellipsoid.matrix * i;
		Vector b = ellipsoid.matrix * j;
		Vector c = ellipsoid.matrix * k ;

	 	assert(Float::equal(ellipsoid.distance(a),0));
		assert(Float::equal(ellipsoid.distance(b),0));
		assert(Float::equal(ellipsoid.distance(c),0));

		assert(Float::equal(ellipsoid.distance(a+(ellipsoid.center-a)/2), -1.0f/2.0f));
		assert(Float::equal(ellipsoid.distance(b+(ellipsoid.center-b)/2), -2.0f/2.0f));
		assert(Float::equal(ellipsoid.distance(c+(ellipsoid.center-c)/2), -3.0f/2.0f));

		assert(Float::equal(ellipsoid.distance(a-(ellipsoid.center-a)/2), 1.0f/2.0f));
		assert(Float::equal(ellipsoid.distance(b-(ellipsoid.center-b)/2), 2.0f/2.0f));
		assert(Float::equal(ellipsoid.distance(c-(ellipsoid.center-c)/2), 3.0f/2.0f));

		// todo: test ellipsoid normal
	}
}

⌨️ 快捷键说明

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