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

📄 inttor.c

📁 [Game.Programming].Academic - Graphics Gems (6 books source code)
💻 C
字号:
#include	<math.h>#include	"GraphicsGems.h"/* ----	inttor - Intersect a ray with a torus. ------------------------	*//*									*//*									*//*	Description:							*//*	    Inttor determines the intersection of a ray with a torus.	*//*									*//*	On entry:							*//*	    raybase = The coordinate defining the base of the		*//*		      intersecting ray.					*//*	    raycos  = The direction cosines of the above ray.		*//*	    center  = The center location of the torus.			*//*	    radius  = The major radius of the torus.			*//*	    rplane  = The minor radius in the plane of the torus.	*//*	    rnorm   = The minor radius normal to the plane of the torus.*//*	    tran    = A 4x4 transformation matrix that will position	*//*		      the torus at the origin and orient it such that	*//*		      the plane of the torus lyes in the x-z plane.	*//*									*//*	On return:							*//*	    nhits   = The number of intersections the ray makes with	*//*		      the torus.					*//*	    rhits   = The entering/leaving distances of the		*//*		      intersections.					*//*									*//*	Returns:  True if the ray intersects the torus.			*//*									*//* --------------------------------------------------------------------	*/int	inttor	(raybase,raycos,center,radius,rplane,rnorm,tran,nhits,rhits)	Point3	raybase;		/* Base of the intersection ray	*/	Vector3	raycos;			/* Direction cosines of the ray	*/	Point3	center;			/* Center of the torus		*/	double	radius;			/* Major radius of the torus	*/	double	rplane;			/* Minor planer radius		*/	double	rnorm;			/* Minor normal radius		*/	Matrix4	tran;			/* Transformation matrix	*/	int *	nhits;			/* Number of intersections	*/	double	rhits[4];		/* Intersection distances	*/{	int	hit;			/* True if ray intersects torus	*/	double	rsphere;		/* Bounding sphere radius	*/	Vector3	Base, Dcos;		/* Transformed intersection ray	*/	double	rmin, rmax;		/* Root bounds			*/	double	yin, yout;	double	rho, a0, b0;		/* Related constants		*/	double	f, l, t, g, q, m, u;	/* Ray dependent terms		*/	double	C[5];			/* Quartic coefficients		*/extern	int	intsph ();		/* Intersect ray with sphere	*/extern	int	SolveQuartic ();	/* Solve quartic equation	*/	*nhits  = 0;/*	Compute the intersection of the ray with a bounding sphere.	*/	rsphere = radius + MAX (rplane,rnorm);	hit     = intsph (raybase,raycos,center,rsphere,&rmin,&rmax);	if  (!hit) return (hit);	/* If ray misses bounding sphere*//*	Transform the intersection ray					*/	Base = raybase;	Dcos = raycos;	V3MulPointByMatrix  (&Base,&tran);	V3MulVectorByMatrix (&Dcos,&tran);/*	Bound the torus by two parallel planes rnorm from the x-z plane.*/	yin  = Base.y + rmin * Dcos.y;	yout = Base.y + rmax * Dcos.y;	hit  = !( (yin >  rnorm && yout >  rnorm) ||		  (yin < -rnorm && yout < -rnorm) );	if  (!hit) return (hit);	/* If ray is above/below torus.	*//*	Compute constants related to the torus.				*/	rho = rplane*rplane / (rnorm*rnorm);	a0  = 4. * radius*radius;	b0  = radius*radius - rplane*rplane;/*	Compute ray dependent terms.					*/	f = 1. - Dcos.y*Dcos.y;	l = 2. * (Base.x*Dcos.x + Base.z*Dcos.z);	t = Base.x*Base.x + Base.z*Base.z;	g = f + rho * Dcos.y*Dcos.y;	q = a0 / (g*g);	m = (l + 2.*rho*Dcos.y*Base.y) / g;	u = (t +    rho*Base.y*Base.y + b0) / g;/*	Compute the coefficients of the quartic.			*/	C[4] = 1.0;	C[3] = 2. * m;	C[2] = m*m + 2.*u - q*f;	C[1] = 2.*m*u - q*l;	C[0] = u*u - q*t;	/*	Use quartic root solver found in "Graphics Gems" by Jochen	*//*	Schwarze.							*/	*nhits = SolveQuartic (C,rhits);/*	SolveQuartic returns root pairs in reversed order.		*/	m = rhits[0]; u = rhits[1]; rhits[0] = u; rhits[1] = m;	m = rhits[2]; u = rhits[3]; rhits[2] = u; rhits[3] = m;	return (*nhits != 0);}

⌨️ 快捷键说明

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