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

📄 mathlib.cpp

📁 《OpenGL游戏编程》这本书的配套源码。
💻 CPP
字号:
//========================================================
/**
*  @file      mathlib.cpp
*
*  项目描述: 构造游戏引擎
*  文件描述:  数学计算用的类的结构  
*  适用平台: Windows98/2000/NT/XP
*  
*  作者:     WWBOSS
*  电子邮件:  wwboss123@gmail.com
*  创建日期: 2007-07-26	
*  修改日期: 2007-07-26
*
*/     
//========================================================


#include "stdafx.h"
#include "mathlib.h"

//////////////////////////////////////////////////////
/**\brief
 * 判断点到直线的投影是否在线段内
 */
BOOL vector2d::bPtInLine(vector2d p1 , vector2d p2)
{
	vector2d p;
	float d = dist(p1,p2);
	
	p.x = p2.x - p1.x;
	p.y = p2.y - p1.y;
	float x1 = p.x;
	p.normalize();
	p.change();
	p.x *= d;
	p.y *= d;
	float x2;
	x2 = x - p1.x - p.x;
	float t;
	t = x2 / x1;
	if((t>0)&&(t<1)) return TRUE;
	return FALSE;
}






///////////////////////////////////////////////////////////////

BOOL line2d::IsIntersect(line2d& line)
{
	float a1 , b1 , c1;
	float a2 , b2 , c2;
	a1 = p2.x - p1.x;
	b1 = line.p1.x - line.p2.x;
	c1 = line.p1.x - p1.x;

	a2 = p2.y - p1.y;
	b2 = line.p1.y - line.p2.y;
	c2 = line.p1.y - p1.y;
	if(fabs(a2*b1 - a1*b2)>0.0001f)
		return TRUE;
	else
		return FALSE;
}

vector2d line2d::GetIntersectPoint(line2d& line)
{
	float a1 , b1 , c1;
	float a2 , b2 , c2;
	a1 = p2.x - p1.x;
	b1 = line.p1.x - line.p2.x;
	c1 = line.p1.x - p1.x;

	a2 = p2.y - p1.y;
	b2 = line.p1.y - line.p2.y;
	c2 = line.p1.y - p1.y;
	vector2d rel;
	float t;
	t = (a2 * c1 - a1 * c2) / (a2 * b1 - a1 * b2);
	rel = line.p1 + (line.p2 - line.p1) * t;
	return rel;
}


////////////////////////////////////////////////////////////////


void SCircle::Set(vector2d &v, float& r)
{
}

vector2d SCircle::getpoint(vector2d&p1 , vector2d&p2)
{
	float d = pos.dist(p1,p2);
	float l = pos.dist(p1);
	l = radius / l;
	if(l > 1.0f)l= 1.0f;
	if(l < -1.0f)l=-1.0f;
	float s = (float)asin(l);
	if(d > 0) s = -s;
	vector2d p;
	p = pos - p1;
	p.normalize();
	p.rotate(s);
	d = sqrtf(fabsf(pos.dist(p1)*pos.dist(p1) - radius * radius));
	p = p1 + vector2d(p.x*d,p.y*d);
	return p;
}

BOOL SCircle::isIntersect(vector2d&p1, vector2d&p2)
{
	vector2d p(pos.x,pos.y);		
	float d;
    d = fabsf(p.dist(p1,p2));
	if(d > radius)
		return FALSE;
	else
	{
		if(pos.bPtInLine(p1,p2))
			return TRUE;
		else
			return FALSE;
	}
}


////////////////////////////////////////////////////////
vector3d CBox::corner(int i)
{
	if(i < 0) i = 0;
	if(i > 7) i = 7;
	return vector3d((i & 1) ? max.x :min.x , 
					(i & 2) ? max.y : min.y,
					(i & 3) ? max.z : min.z
					);
}


vector3d CBox::closestPointTo(vector3d& v)
{
	vector3d rel;
	if(v.x < min.x)
		rel.x = min.x;
	else 
		if(v.x > max.x)
			rel.x = max.x;
		else
			rel.x = v.x;

	if(v.y < min.y)
		rel.y = min.y;
	else 
		if(v.y > max.y)
			rel.y = max.y;
		else
			rel.y = v.y;

	if(v.z < min.z)
		rel.z = min.z;
	else 
		if(v.z > max.z)
			rel.z = max.z;
		else
			rel.z = v.z;

	return rel;
}

BOOL CBox::IntersectSphere(vector3d&vcenter , float radius)
{
	vector3d closestpoint = closestPointTo(vcenter);
	return vcenter.dist_sqr(closestpoint) < radius * radius;
}


//the return value must be from 0 to 1
//if it is 2 , ray isn't intersect with box
float CBox::IntersectRay(vector3d&start , vector3d&end)
{
	BOOL inside = TRUE;
	vector3d delta = end - start;
	

	float xt , xn;
	if(start.x < min.x)
	{
		xt = min.x - start.x;
		if(xt > delta.x)return 2.0f;
		xt /= delta.x;
		inside =FALSE;
		xn = -1.0f;
	}
	else if(start.x > max.x)
	{
		xt = max.x - start.x;
		if(xt < delta.x)return 2.0f;
		xt /= delta.x;
		inside = FALSE;
		xn = 1.0f;
	}
	else{xt = -1.0f;}


	float yt , yn;
	if(start.y < min.y)
	{
		yt = min.y - start.y;
		if(yt > delta.y)return 2.0f;
		yt /= delta.y;
		inside = FALSE;
		yn = -1.0f;
	}
	else if(start.y > max.y)
	{
		yt = max.y - start.y;
		if(yt < delta.y)return 2.0f;
		yt /= delta.y;
		inside = FALSE;
		yn = 1.0f;
	}
	else{yt = -1.0f;}


	float zt , zn;
	if(start.z < min.z)
	{
		zt = min.z - start.z;
		if(zt > delta.z)return 2.0f;
		zt /= delta.z;
		inside = FALSE;
		zn = -1.0f;
	}
	else if(start.z > max.z)
	{
		zt = max.z - start.z;
		if(zt < delta.z)return 2.0f;
		zt /= delta.z;
		inside = FALSE;
		zn = 1.0f;
	}
	else{zt = -1.0f;}

	if(inside)return 2.0f;

	int which = 0;
	float t = xt;
	if(yt > t){which = 1;t = yt;}
	if(zt > t){which = 2;t = zt;}


	switch(which)
	{
	case 0:
		{
			float y = start.y + delta.y * t;
			if(y < min.y || y > max.y)return 2.0f;

			float z = start.z + delta.z * t;
			if(z < min.z || z > max.z)return 2.0f;
		}
		break;


	case 1:
		{
			float x = start.x + delta.x * t;
			if(x < min.x || x > max.x)return 2.0f;

			float z = start.z + delta.z * t;
			if(z < min.z || z > max.z)return 2.0f;
		}
		break;


	case 2:
		{
			float x = start.x + delta.x * t;
			if(x < min.x || x > max.x)return 2.0f;

			float y = start.y + delta.y * t;
			if(y < min.y || y > max.y)return 2.0f;
		}
		break;
	}


	return t;
}

⌨️ 快捷键说明

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