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

📄 quadra.cpp

📁 蒙特卡罗方法可以有效地解决复杂的工程问题
💻 CPP
字号:
// Quadra.cpp: implementation of the CQuadra class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "raytrace.h"
#include "Quadra.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CQuadra::CQuadra()
{

}

CQuadra::~CQuadra()
{

}

CQuadra::CQuadra(CVector vec1, CVector vec2, CVector vec3, CVector vec4)
	:
	Vertex1 ( vec1 ),
	Vertex2 ( vec2 ),
	Vertex3 ( vec3 ),
	Vertex4 ( vec4 )
{
	NormalVec = ( ( vec2 - vec1 ) / ( vec3 - vec2 ) );
	NormalVec.Normalize();
}

void CQuadra::Transform(CVector offset,CVector rotate)
{
	Vertex1.Rotate( rotate );
	Vertex2.Rotate( rotate );
	Vertex3.Rotate( rotate );
	Vertex4.Rotate( rotate );
	Vertex1.Translate( offset );
	Vertex2.Translate( offset );
	Vertex3.Translate( offset );
	Vertex4.Translate( offset );
	NormalVec.Rotate( rotate );
}

double CQuadra::Intersect()
{
	double dintersect,denominator;
	CVector temp( HitRay->Direction );
	denominator = temp * NormalVec;

	if( denominator >= 0.0 )	//光源位于四边形后面,则无光亮度
		dintersect = 0.0;
	else	//求出交点参数值
	{
		temp = Vertex1;
		temp -= HitRay->StartPoint;
		double numerator = temp * NormalVec;
		dintersect = numerator / denominator;
	}

	if( dintersect > SMALL )	//交点大于阈值
	{
		IntersectPoint = HitRay->Direction;
		IntersectPoint *= dintersect;
		IntersectPoint += HitRay->StartPoint;
	
		if( !IntersectInQuadra() )	//交点不在四边形内部,则无光亮度
		{
			dintersect = 0.0;
			IntersectPoint.Empty();
		}
	}
	else
		dintersect=0.0;

	return dintersect;
}

CVector CQuadra::Mapping()
{
	double A,B,C,D,E,F,G,H,I;//,J,K,L;
	double x0,x1,x2,x3,
			y0,y1,y2,y3,
			z0,z1,z2,z3;

	Vertex1.GetOffset(x0,y0,z0);
	Vertex2.GetOffset(x1,y1,z1);
	Vertex3.GetOffset(x2,y2,z2);
	Vertex4.GetOffset(x3,y3,z3);

	double a11,a12,a13,a21,a22,a23,a31,a32,a33;
	a11=x1-x3;
	a12=x2-x3;
	a13=x1+x2-x0-x3;
	a21=y1-y3;
	a22=y2-y3;
	a23=y1+y2-y0-y3;
	a31=z1-z3;
	a32=z2-z3;
	a33=z1+z2-z0-z3;

	C=x0;
	F=y0;
	I=z0;
	A=x1-C;
	D=y1-F;
	G=z1-I;
	B=x3-C;
	E=y3-F;
	H=z3-I;

	double u,v,temp;
	if((temp=A*E-B*D)!=0.0)
		v=(A*(IntersectPoint.GetY()-F)-D*(IntersectPoint.GetX()-C))/temp;
	else if((temp=D*H-G*E)!=0.0)
		v=(D*(IntersectPoint.GetZ()-I)-G*(IntersectPoint.GetY()-F))/temp;
	else if((temp=A*H-B*G)!=0.0)
		v=(A*(IntersectPoint.GetZ()-I)-G*(IntersectPoint.GetX()-C))/temp;
	
	if(A!=0.0)
		u=(IntersectPoint.GetX()-C-B*v)/A;
	else if(D!=0.0)
		u=(IntersectPoint.GetY()-F-E*v)/D;
	else if(G!=0.0)
		u=(IntersectPoint.GetZ()-I-H*v)/G;

	if(u<0.0)
		u=0.0;
	if(u>1.0)
		u=1.0;
	if(v<0.0)
		v=0.0;
	if(v>=1.0)
		v=.990;

	return Texture->GetColor(u,v);
}	

BOOL CQuadra::IntersectInQuadra()
{
	double a1,a2,a3,a4,a12,a23,a34,a14;
	double alpha12,alpha23,alpha34,alpha14;
	a1 = Vertex1.GetDistance( IntersectPoint );
	a2 = Vertex2.GetDistance( IntersectPoint );
	a3 = Vertex3.GetDistance( IntersectPoint );
	a4 = Vertex4.GetDistance( IntersectPoint );
	a12 = Vertex1.GetDistance( Vertex2 );
	a23 = Vertex2.GetDistance( Vertex3 );
	a34 = Vertex3.GetDistance( Vertex4 );
	a14 = Vertex1.GetDistance( Vertex4 );
	
	alpha12 = acos( ( a1 * a1 + a2 * a2 - a12 * a12 ) / ( 2.0 * a1 * a2 ) );
	alpha23 = acos( ( a2 * a2 + a3 * a3 - a23 * a23 ) / ( 2.0 * a2 * a3 ) );
	alpha34 = acos( ( a4 * a4 + a3 * a3 - a34 * a34 ) / ( 2.0 * a4 * a3 ) ); 
	alpha14 = acos( ( a1 * a1 + a4 * a4 - a14 * a14 ) / ( 2.0 * a1 * a4 ) );
	
	if( ( 2.0 * PI - alpha12 - alpha23 - alpha34 - alpha14 ) > 0.01 )//Small
		return FALSE;
	else
		return TRUE;
}

⌨️ 快捷键说明

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