自己写的一个数学库
来源:互联网 发布:淘宝小工具 编辑:程序博客网 时间:2024/04/29 06:56
因为要做光线跟踪,所以要有一个自己的图形库嘛,所以要封装自己的数学库,所以我就模仿者书上写了一个图形库
按它的那个库中的函数写的,名字大多都一样,有些我认为可以优化的优化了一下
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来测试,然后他具体些注释,我太邪恶了
以后还会把图形库一起封装的。。。
- 自己写的一个数学库
- 写一个自己的javascript库
- 写一个自己的javascript库
- 自己用C#写的一个Math类,数学不好,大家帮我看下
- 写一个自己的引擎
- 写一个自己的引擎
- 自己写的一个分页
- 自己写的一个ArrayList
- 自己写的一个linkedList
- 自己写的一个例子
- 自己写的一个isNumeric。
- 写一个自己的Filter
- 写一个自己的Dictionary
- 写一个自己的listview
- 自己写的一个请求
- 写一个自己的springMVC?
- 自己写的一个CircleImageView
- 贴一个自己写的用到boost库的实例
- 官方线刷
- 《Windows核心编程 5th》部分读书笔记----第10章 同步设备I/O与异步设备I/O
- 留个爪子,证明自己在学习!
- 第二次上机实验报告
- NYOJ 183 赚钱啦
- 自己写的一个数学库
- gravity和layout_gravity的区别
- 哥已成风
- dbutil总结
- 数据库 中的控制文件的添加移动
- 学习《C Primer Plus》---指针常量与常量指针
- SDK之 TreeView
- 关于EOF(文件结束符)问题的体会
- 匿名类型