因为要做光线跟踪,所以要有一个自己的图形库嘛,所以要封装自己的数学库,所以我就模仿者书上写了一个图形库
按它的那个库中的函数写的,名字大多都一样,有些我认为可以优化的优化了一下
BkDefs.h 定义一些数据姐都的
#ifndef BKDEFS_H_INCLUDED
#define BKDEFS_H_INCLUDED
/*包含定义的常量及数据类型*/
typedef unsigned char Byte ;
typedef unsigned int Word ;
typedef unsigned long DWord ;
//typedef enum { false , true } Boolen ;
typedef char Name[80] ;
typedef struct {
Byte Red ;
Byte Grn ;
Byte Blu ;
} RGB ;
typedef RGB Palette_Register[256] ;
typedef float TDA[3] ; //实数三维向量
typedef float FDA[4] ; //实数四维向量
typedef int TDIA[3] ; //整数三维向量
typedef float Matx4x4[4][4] ; //实数的4x4矩阵
#define MaxCol 7
#define MaxInten 35
#define Ln10 2.30258509299405E+000
#define OneOverLn10 0.43429448190325E+000
#define Pi 3.1415927
#define PiOver180 1.74532925199433E-002
#define PiUnder180 5.72957795130823E+001
#endif // BKDEFS_H_INCLUDED
BkMath.h声明函数
#ifndef BKMATH_H_INCLUDED
#define BKMATH_H_INCLUDED
/*包含数学模块各例程使用的函数原型,这些原型指明指明数学*/
/*模块中所有函数的名字和参数,以及需要向函数传入的参数*/
#include "BkDefs.h"
/*基本数学函数*/
/*Round( x ) : 返回与x最接近的整数*/
extern int Round( double x ) ;
/*Frac(x) : 返回x的小数部分,如果x < 0 ,Frac( x ) = x-Trunc( x )*/
extern float Frac ( double x ) ;
/*Trunc( x ) : 返回x的整数部分,舍去小数部分*/
extern int Trunc( double x ) ;
/*SqrFP( x ) : 返回浮点数x的平方*/
extern float SqrFp( float x ) ;
/*Sqr( x ) : 返回整数x的平方*/
extern int Sqr ( int x ) ;
/*Radians( Angle ) :返回以弧度表示的Angle*/
extern float Radians( float Angle ) ;
/*Degrees( Angle ) :返回以角度表示的Angle*/
extern float Degrees( float Angle ) ;
/*描述数学函数的cos函数,接收角度Angle*/
extern float CosD( float Angle ) ;
/*描述数学函数的sin函数,接收角度Angle*/
extern float SinD( float Angle ) ;
/*求Base的Exponent次幂*/
extern float Power( float Base , int Exponent ) ;
/*求一个数以10为底的对数*/
extern float Log ( float x ) ;
/*计算以10为底的实数次幂*/
extern float Exp10 ( float x ) ;
/*获取浮点数的符号*/
extern float Sign ( float x ) ;
/*获取传入参数的符号,传入参数为整数*/
extern int IntSign ( int x ) ;
/*计算一个整数x的平方根,并返回与结果最接近的整数*/
extern int IntSqrt ( int x ) ;
/*IntPower使用递归计算整数的整数次幂,Base的Exponent次幂*/
extern int IntPower( int x ) ;
/*返回两个浮点数里的最小数*/
extern float MIN( float a , float b ) ;
/*返回两个浮点数里的最大数*/
extern float MAX( float a , float b ) ;
/*返回三个浮点数里的最小数*/
extern float MIN3( float a , float b , float c ) ;
/*返回三个浮点数里的最大数*/
extern float MAX3( float a , float b , float c ) ;
/*返回四个浮点数里的最小数*/
extern float MIN4( float a , float b , float c , float d ) ;
/*返回四个浮点数里的最大数*/
extern float MAX4( float a , float b , float c , float d ) ;
/*向量和矩阵函数*/
/*创建浮点数三维向量TDA*/
extern void Vec ( float r , float s , float t , TDA A ) ;
/*创建整数数三维向量TDIA*/
extern void VecInt( int r , int s , int t , TDIA A ) ;
/*提取存储在TDA里的三个浮点值*/
extern void UnVec( TDA A , float *r , float *s , float *t) ;
/*提取存储在TDIA里的三个浮点值*/
extern void UnVecInt( TDIA A , int *r , int *s , int *t ) ;
/*计算向量A与向量B的点积*/
extern float VecDot( TDA A , TDA B ) ;
/*计算向量A与向量B的叉积*/
extern void VecCross( TDA A , TDA B , TDA C ) ;
/*计算向量的模长*/
extern float VecLen( TDA A ) ;
/*规格化向量A,即使A的模长为1*/
extern void VecNormalize( TDA A ) ;
/*将一个实数四维向量A与一个变换矩阵Matrix相乘,存入实数四维向量B*/
extern void VecMatxMult( FDA A , Matx4x4 Matrix , FDA B ) ;
/*对实数三维向量A-B求值,结果存入实数三维向量C*/
extern void VecSub( TDA A , TDA B , TDA C ) ;
/*对整数向量A-B求值,结果存入实数向量C*/
extern void VecSubInt( TDIA A , TDIA B , TDA C ) ;
/*对实数三维向量A+B求值,结果存入实数向量C*/
extern void VecAdd( TDA A , TDA B , TDA C ) ;
/*对整数向量A+B求值,结果存入实数向量C*/
extern void VecAdd3( TDA A , TDA B , TDA C , TDA D ) ;
/*对实数向量A+B求值,结果存入实数向量C*/
extern void VecCopy( TDA A , TDA B ) ;
/*将向量三维实数A复制到三维实数B*/
extern void VecCopyInt( TDIA A , TDIA B ) ;
/*将三维整数向量A复制到三维整数向量B*/
extern void VecLinComb( float r , TDA A , float s , TDA B , TDA C ) ;
/*计算向量A与向量B的线性组合:C = rA + sB 结果存入三维实数向量C*/
extern void VecScalMult ( float r , TDA A , TDA B ) ;
/*缩放运算,将传入三维实数向量A与给定实数r相乘 , 结果存入三维实数向量B*/
extern void VecScalMultI( float r , TDIA A , TDA B ) ;
/*缩放运算,将传入三维整数向量A与给定实数r相乘 , 结果存入三维实数向量B*/
extern void VecScalMultInt( float r , TDA A , TDIA B ) ;
/*将传入的三维实数向量A与实数r相乘,执行缩放操作, 再与三维实数向量B相加,结果存入三维实数向量C*/
extern void VecAddScalMult( float r , TDA A , TDA B , TDA C ) ;
/*将所有三维实数向量A内各元素置为0*/
extern void VecNull( TDA A ) ;
/*将所有三维整数向量A内各元素置为0*/
extern void VecNullInt( TDIA A ) ;
/*三维实数向量A乘B再与实数r相乘,最后保存在三维实数向量C内*/
extern void VecElemMult( float r , TDA A , TDA B , TDA C ) ;
/*查找向量的最小分量*/
extern void VecMin( TDA a , TDA b , TDA c ) ;
/*查找向量的最大分量*/
extern void VecMax( TDA a , TDA b , TDA c ) ;
/*通过改变元素符号,使向量反向*/
extern void VecNegate( TDA A ) ;
/*仿射变换函数*/
/*将4x4向量所有元素置0*/
extern void ZeroMatrix( Matx4x4 A ) ;
/*平移矩阵,沿向量( tx , ty , tz )反向平移 , 将该平移矩阵存入A */
extern void Translate3D( float tx , float ty , float tz , Matx4x4 A ) ;
/*缩放矩阵, 在 x 和 y 和 z 方向 ,分别缩放sx , sy , sz 倍 , 将该缩放矩阵存入A*/
extern void Scale3D( float sx , float sy , float sz , Matx4x4 A ) ;
/*旋转矩阵,沿任意坐标轴旋转Theta角度 , m = 1 : x轴, m = 2 : y轴, m = 3 : z轴, 将该旋转矩阵存入A**/
extern void Rotate3D( int m , float Theta , Matx4x4 A ) ;
/*两个实数4x4矩阵乘法, 将该乘法矩阵存入A*/
extern void Multiply3DMatricies( Matx4x4 A , Matx4x4 B , Matx4x4 C ) ;
/*将给定的矩阵a复制给矩阵b*/
extern void MatCopy( Matx4x4 a , Matx4x4 b ) ;
/*按缩放,旋转,平移方式相乘各矩阵, 得到复合矩阵存入XForm*/
extern void PrepareMatrix( float Tx , float Ty , float Tz ,
float Sx , float Sy , float Sz ,
float Rx , float Ry , float Rz ,
Matx4x4 XForm ) ;
/*本函数是用来还原函数PrepareMatrix(),本函数的参数里,*/
/*平移和旋转参数是函数PrepareMatrix里参数的相反数,而缩放参数,则是PrepareMatrix里的倒数*/
extern void PrepareInvMatrix( float Tx , float Ty , float Tz ,
float Sx , float Sy , float Sz ,
float Rx , float Ry , float Rz ,
Matx4x4 XForm ) ;
/*将一个实数三维向量A与一个实数4*4矩阵M相乘,结果存入B*/
extern void Transform( TDA A , Matx4x4 M , TDA B ) ;
/*伪随机数生成*/
/*使用一个实数初始化随机数生成器,OldSeed置为传入*/
/*的种子值,使用Rand和RandInt函数时,都必须调用InitRand函数*/
extern void InitRand( float Seed ) ;
/*返回一个正整型随机数,范围由两字节参数Range指定*/
/*或者是从0到(Range-1)*/
extern int RandInt ( Word Range ) ;
/*返回一个0.0到1.0之间的正实数随机数,OldRand*/
/*是常量sigma与OldRand之间的小数部分*/
/*使用Rand函数之前,必须调用InitRand函数*/
extern float Rand() ;
#endif // BKMATH_H_INCLUDED
BkMath.cpp 定义这些函数
/*函数Sign返回值是否改为int*/
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include "BkMath.h"
/*********************/
/* 基本数学函数 */
/*********************/
/*Round( x ) : 返回与x最接近的整数*/
int Round( double x )
{
return ( ( int ) ( x + 0.5 ) ) ;
}
/*Trunc( x ) : 返回x的整数部分,舍去小数部分*/
int Trunc( double x )
{
return ( ( int ) ( x ) ) ;
}
/*Frac(x) : 返回x的小数部分,如果x < 0 ,Frac( x ) = x-Trunc( x )*/
float Frac( double x )
{
int y ;
y = ( ( int ) ( x ) ) ;
return ( x - ( float ) y ) ;
}
/*SqrFP( x ) : 返回浮点数x的平方*/
float SqrFP( float x )
{
return ( x * x ) ;
}
/*Sqr( x ) : 返回整数x的平方*/
int Sqr( int x )
{
return ( x * x ) ;
}
/*Radians( Angle ) :返回以弧度表示的Angle*/
float Radians( float Angle )
{
return ( Angle * PiOver180 ) ;
}
/*Degrees( Angle ) :返回以角度表示的Angle*/
float Degrees( float Angle )
{
return ( Angle * PiUnder180 ) ;
}
/*描述数学函数的cos函数,接收角度Angle*/
float CosD( float Angle )
{
return ( cos( Radians( Angle ) ) ) ;
}
/*描述数学函数的sin函数,接收角度Angle*/
float SinD( float Angle )
{
return ( sin( Radians( Angle ) ) ) ;
}
/*求Base的Exponent次幂*/
float Power( float Base , float Exponent )
{
float BPower ;
if( Exponent == 0 ) return 1 ;
else {
BPower = 1.0 ;
for( int i = 1 ; i <= Exponent ; i ++ )
BPower *= Base ;
return BPower ;
}
}
/*求一个数以10为底的对数*/
float Log( float x )
{
return ( log(x) * OneOverLn10 ) ;
}
/*计算以10为底的实数次幂*/
float Exp10( float x )
{
return( exp( x * Ln10 ) ) ;
}
/*获取浮点数的符号*/
float Sign( float x )
{
if( x < 0 ) return -1 ;
else if( x > 0 ) return 1 ;
else return 0 ;
}
/*获取传入参数的符号,传入参数为整数*/
int IntSign( int x )
{
if( x < 0 ) return -1 ;
else if( x > 0 ) return 1 ;
else return 0 ;
}
/*计算一个整数x的平方根,并返回与结果最接近的整数*/
int IntSqrt( int x )
{
int OddInt = 1 , OldArg = x , FirstSqrt ;
while( x >= 0 ) {
x -= OddInt ;
OddInt += 2 ;
}
FirstSqrt = OddInt >> 1 ;
if( Sqr( FirstSqrt ) - FirstSqrt + 1 > OldArg )
return ( FirstSqrt - 1 ) ;
else return FirstSqrt ;
}
/*IntPower使用递归计算整数的整数次幂,Base的Exponent次幂*/
int IntPower( int Base , int Exponent )
{
int BPower ;
if( Exponent == 0 ) return 1 ;
else {
BPower = 1 ;
for( int i = 1 ; i <= Exponent ; i ++ )
BPower *= Base ;
return BPower ;
}
}
/*返回两个浮点数里的最小数*/
float MIN( float a , float b )
{
if( a < b ) return a ;
else return b ;
}
/*返回两个浮点数里的最大数*/
float MAX( float a , float b )
{
if( a < b ) return b ;
else return a ;
}
/*返回三个浮点数里的最小数*/
float MIN3( float a , float b , float c )
{
float t = MIN( a , b ) ;
return MIN( t , c ) ;
}
/*返回三个浮点数里的最大数*/
float MAX3( float a , float b , float c )
{
float t = MAX( a , b ) ;
return MAX( t , c ) ;
}
/*返回四个浮点数里的最小数*/
float MIN4( float a , float b , float c , float d )
{
float t = MIN3( a , b , c ) ;
return MIN( t , d ) ;
}
/*返回四个浮点数里的最大数*/
float MAX4( float a , float b , float c , float d )
{
float t = MAX3( a , b , c ) ;
return MAX( t , c ) ;
}
/****************************/
/* 向量和矩阵函数 */
/****************************/
/*创建浮点数三维向量TDA*/
void Vec( float r , float s , float t , TDA A )
{
A[0] = r ; A[1] = s ; A[2] = t ;
}
/*创建整数数三维向量TDIA*/
void VecInt( int r , int s , int t , TDIA A )
{
A[0] = r ; A[1] = s ; A[2] = t ;
}
/*提取存储在TDA里的三个浮点值*/
void UnVec( TDA A , float *r , float *s , float *t )
{
*r = A[0] ; *s = A[1] ; *t = A[2] ;
}
/*提取存储在TDIA里的三个浮点值*/
void UnVecInt( TDIA A , int *r , int *s , int *t )
{
*r = A[0] ; *s = A[1] ; *t = A[2] ;
}
/*计算向量A与向量B的点积*/
float VecDot( TDA A , TDA B )
{
return ( A[0] * B[0] + A[1] * B[1] + A[2] * B[2] ) ;
}
/*计算向量A与向量B的叉积*/
void VecCross( TDA A , TDA B , TDA C )
{
C[0] = A[1] * B[2] - A[2] * B[1] ;
C[1] = A[2] * B[0] - A[0] * B[2] ;
C[2] = A[0] * B[1] - A[1] * B[0] ;
}
/*计算向量的模长*/
float VecLen( TDA A )
{
return ( sqrt( SqrFP( A[0] ) ) + SqrFP( A[1] ) + SqrFP( A[2] ) ) ;
}
/*规格化向量A,即使A的模长为1*/
void VecNormalize( TDA A )
{
float dist , invdist ;
dist = VecLen( A ) ;
if( !( dist == 0.0 ) )
{
invdist = 1.0 / dist ;
A[0] *= invdist ;
A[1] *= invdist ;
A[2] *= invdist ;
}
else
{
puts( "Zero-Length Vectors cannot be Normalize" ) ;
exit( 1 ) ;
}
}
/*将一个实数四维向量A与一个变换矩阵Matrix相乘,存入实数四维向量B*/
void VecMatxMult( FDA A , Matx4x4 Matrix , FDA B )
{
for( int i = 0 ; i < 4 ; i ++ )
{
B[i] = 0 ;
for( int j = 0 ; j < 4 ; j ++ )
B[i] += A[j] * Matrix[j][i] ;
}
}
/*对实数三维向量A-B求值,结果存入实数三维向量C*/
void VecSub( TDA A , TDA B , TDA C )
{
C[0] = A[0] - B[0] ;
C[1] = A[1] - B[1] ;
C[2] = A[2] - B[2] ;
}
/*对整数向量A-B求值,结果存入实数向量C*/
void VecSubInt( TDIA A , TDIA B , TDA C )
{
C[0] = float ( A[0] - B[0] ) ;
C[1] = float ( A[1] - B[1] ) ;
C[2] = float ( A[2] - B[2] ) ;
}
/*对实数三维向量A+B求值,结果存入实数向量C*/
void VecAdd( TDA A , TDA B , TDA C )
{
C[0] = A[0] + B[0] ;
C[1] = A[1] + B[1] ;
C[2] = A[2] + B[2] ;
}
/*对整数向量A+B求值,结果存入实数向量C*/
void VecAddInt( TDIA A , TDIA B , TDA C )
{
C[0] = float ( A[0] + B[0] ) ;
C[1] = float ( A[1] + B[1] ) ;
C[2] = float ( A[2] + B[2] ) ;
}
/*对实数向量A+B求值,结果存入实数向量C*/
void VecAdd3( TDA A , TDA B , TDA C , TDA D)
{
D[0] = A[0] + B[0] +C[0] ;
D[1] = A[1] + B[1] +C[1] ;
D[2] = A[2] + B[2] +C[2] ;
}
/*将向量三维实数A复制到三维实数B*/
void VecCopy( TDA A , TDA B )
{
B[0] = 0.0 + A[0] ;
B[1] = 0.0 + A[1] ;
B[2] = 0.0 + A[2] ;
}
/*将三维整数向量A复制到三维整数向量B*/
void VecCopyInt( TDIA A , TDIA B )
{
B[0] = A[0] ; B[1] = A[1] ; B[2] = A[2] ;
}
/*计算向量A与向量B的线性组合:C = rA + sB 结果存入三维实数向量C*/
void VecLinComb( float r , TDA A , float s , TDA B , TDA C )
{
C[0] = r * A[0] + s * B[0] ;
C[1] = r * A[1] + s * B[1] ;
C[2] = r * A[2] + s * B[2] ;
}
/*缩放运算,将传入三维实数向量A与给定实数r相乘 , 结果存入三维实数向量B*/
void VecScalMult( float r , TDA A , TDA B )
{
B[0] = r * A[0] ;
B[1] = r * A[1] ;
B[2] = r * A[2] ;
}
/*缩放运算,将传入三维整数向量A与给定实数r相乘 , 结果存入三维实数向量B*/
void VecScalMultI( float r , TDIA A , TDA B )
{
B[0] = r * ( float ( A[0] ) ) ;
B[1] = r * ( float ( A[1] ) ) ;
B[2] = r * ( float ( A[2] ) ) ;
}
/*缩放运算,将传入三维实数向量A与给定实数r相乘 , 结果存入三维整数向量B*/
void VecScalMultInt( float r , TDA A , TDIA B )
{
B[0] = Round( r * A[0] ) ;
B[1] = Round( r * A[1] ) ;
B[2] = Round( r * A[2] ) ;
}
/*将传入的三维实数向量A与实数r相乘,执行缩放操作, 再与三维实数向量B相加,结果存入三维实数向量C*/
void VecAddScalMult( float r , TDA A , TDA B , TDA C )
{
C[0] = r * A[0] + B[0] ;
C[1] = r * A[1] + B[1] ;
C[2] = r * A[2] + B[2] ;
}
/*将所有三维实数向量A内各元素置为0*/
void VecNull( TDA A )
{
A[0] = 0.0 ; A[1] = 0.0 ; A[2] = 0.0 ;
}
/*将所有三维整数向量A内各元素置为0*/
void VecNullInt( TDIA A )
{
A[0] = 0 ; A[1] = 0 ; A[2] = 0 ;
}
/*三维实数向量A乘B再与实数r相乘,最后保存在三维实数向量C内*/
void VecElemMult( float r , TDA A , TDA B , TDA C )
{
C[0] = r * A[0] * B[0] ;
C[1] = r * A[1] * B[1] ;
C[2] = r * A[2] * B[2] ;
}
/*查找向量的最小分量*/
void VecMin( TDA a , TDA b , TDA c )
{
if( a[0] < b[0] ) c[0] = a[0] ;
else c[0] = b[0] ;
if( a[1] < b[1] ) c[1] = a[1] ;
else c[1] = b[1] ;
if( a[2] < b[2] ) c[2] = a[2] ;
else c[2] = b[2] ;
}
/*查找向量的最大分量*/
void VecMax( TDA a , TDA b , TDA c )
{
if( a[0] > b[0] ) c[0] = a[0] ;
else c[0] = b[0] ;
if( a[1] > b[1] ) c[1] = a[1] ;
else c[1] = b[1] ;
if( a[2] > b[2] ) c[2] = a[2] ;
else c[2] = b[2] ;
}
/*通过改变元素符号,使向量反向*/
void VecNegate( TDA A )
{
A[0] = -A[0] ;
A[1] = -A[1] ;
A[2] = -A[2] ;
}
/********************/
/* 仿射变换函数 */
/********************/
/*将4x4向量所有元素置0*/
void ZeroMatrix( Matx4x4 A )
{
for( int i = 0 ; i < 4 ; i ++ )
{
for( int j = 0 ; j < 4 ; j ++ )
A[i][j] = 0 ;
}
}
/*平移矩阵,沿向量( tx , ty , tz )反向平移 , 将该平移矩阵存入A */
void Translate3D( float tx , float ty , float tz , Matx4x4 A )
{
ZeroMatrix( A ) ;
for( int i = 0 ; i < 4 ; i ++ )
A[i][i] = 1.0 ;
A[0][3] = -tx ;
A[1][3] = -ty ;
A[2][3] = -tz ;
}
/*缩放矩阵, 在 x 和 y 和 z 方向 ,分别缩放sx , sy , sz 倍 , 将该缩放矩阵存入A*/
void Scale3D( float sx , float sy , float sz , Matx4x4 A )
{
ZeroMatrix( A ) ;
A[0][0] = sx ;
A[1][1] = sy ;
A[2][2] = sz ;
A[3][3] = 1.0 ;
}
/*旋转矩阵,沿任意坐标轴旋转Theta角度 , m = 1 : x轴, m = 2 : y轴, m = 3 : z轴, 将该旋转矩阵存入A**/
void Rotate3D( int m , float Theta , Matx4x4 A )
{
int m1 , m2 ;
float c , s ;
ZeroMatrix( A ) ;
A[m-1][m-1] = 1.0 ;
A[3][3] = 1.0 ;
m1 = ( m % 3 ) + 1 ;
m2 = ( m1 % 3 ) ;
m1 -= 1 ;
c = CosD( Theta ) ;
s = SinD( Theta ) ;
A[m1][m1] = c ;
A[m1][m2] = s ;
A[m2][m2] = c ;
A[m2][m1] = -s ;
}
/*两个实数4x4矩阵乘法, 将该乘法矩阵存入A*/
void Multiply3DMatricies( Matx4x4 A , Matx4x4 B , Matx4x4 C )
{
Byte i , j , k ;
float ab ;
for( i = 0 ; i < 4 ; i ++ )
{
for( j = 0 ; j < 4 ; j ++ )
{
ab = 0 ;
for( k = 0 ; k < 4 ; k ++ )
ab += A[i][k] + B[k][j] ;
C[i][j] = ab ;
}
}
}
/*将给定的矩阵a复制给矩阵b*/
void MatCopy( Matx4x4 a , Matx4x4 b )
{
Byte i , j ;
for( i = 0 ; i < 4 ; i ++ )
for( j = 0 ; j < 4 ; j ++ )
b[i][j] = a[i][j] ;
}
/*按缩放,旋转,平移方式相乘各矩阵, 得到复合矩阵存入XForm*/
void PrepareMatrix( float Tx , float Ty , float Tz , float Sx , float Sy , float Sz ,
float Rx , float Ry , float Rz , Matx4x4 XForm )
{
Matx4x4 M1 , M2 , M3 , M4 , M5 , M6 , M7 , M8 , M9 ;
Scale3D( Sx , Sy , Sz , M1 ) ;
Rotate3D( 1 , Rx , M2 ) ;
Rotate3D( 2 , Ry , M3 ) ;
Rotate3D( 3 , Rz , M4 ) ;
Translate3D( Tx , Ty , Tz , M5 ) ;
Multiply3DMatricies( M2 , M1 , M6 ) ;
Multiply3DMatricies( M3 , M6 , M7 ) ;
Multiply3DMatricies( M4 , M7 , M8 ) ;
Multiply3DMatricies( M5 , M8 , M9 ) ;
MatCopy( M9 , XForm ) ;
}
/*本函数是用来还原函数PrepareMatrix(),本函数的参数里,*/
/*平移和旋转参数是函数PrepareMatrix里参数的相反数,而缩放参数,则是PrepareMatrix里的倒数*/
void PrepareInvMatrix( float Tx , float Ty , float Tz , float Sx , float Sy , float Sz ,
float Rx , float Ry , float Rz , Matx4x4 XForm )
{
Matx4x4 M1 , M2 , M3 , M4 , M5 , M6 , M7 , M8 , M9 ;
Scale3D( Sx , Sy , Sz , M1 ) ;
Rotate3D( 1 , Rx , M2 ) ;
Rotate3D( 2 , Ry , M3 ) ;
Rotate3D( 3 , Rz , M4 ) ;
Translate3D( Tx , Ty , Tz , M5 ) ;
Multiply3DMatricies( M4 , M5 , M6 ) ;
Multiply3DMatricies( M3 , M6 , M7 ) ;
Multiply3DMatricies( M2 , M7 , M8 ) ;
Multiply3DMatricies( M1 , M8 , M9 ) ;
MatCopy( M9 , XForm ) ;
}
/*将一个实数三维向量A与一个实数4*4矩阵M相乘,结果存入B*/
void Transform( TDA A , Matx4x4 M , TDA B )
{
B[0] = M[0][0] * A[0] + M[0][1] * A[1] + M[0][2] * A[2] + M[0][3] ;
B[1] = M[1][0] * A[0] + M[1][1] * A[1] + M[1][2] * A[2] + M[1][3] ;
B[2] = M[2][0] * A[0] + M[2][1] * A[1] + M[2][2] * A[2] + M[2][3] ;
}
/********************/
/* 伪随机数生成 */
/********************/
/*种子*/
double OldRand ;
/*伪随机数生成*/
/*使用一个实数初始化随机数生成器,OldRand置为传入*/
/*的种子值,使用Rand和RandInt函数时,都必须调用InitRand函数*/
void InitRand( float Seed )
{
OldRand = Seed ;
}
/*返回一个正整型随机数,范围由两字节参数Range指定*/
/*或者是从0到(Range-1)*/
int RandInt( Word Range )
{
float sigma = 423.1966 ;
OldRand = Frac( sigma * OldRand ) ;
return ( Trunc( OldRand * ( float ) Range ) ) ;
}
/*返回一个0.0到1.0之间的正实数随机数,OldRand*/
/*是常量sigma与OldRand之间的小数部分*/
/*使用Rand函数之前,必须调用InitRand函数*/
float Rand()
{
float sigma = 423.1966 ;
OldRand = Frac( sigma * OldRand ) ;
return OldRand ;
}
我居然写完了之后让WD来测试,然后他具体些注释,我太邪恶了
以后还会把图形库一起封装的。。。