📄 quadra.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 + -