?? our_math.c
字號:
/**************************************************************************
Copyright (C) jianbo miao Corporation. All Rights Released.
this is a 3d engin named our_3d_engin.
our_3d_engin feature:
1:there is no float.
2:it do the 3d things all by softwear.
3:base on 1 and 2 , it can execution on arm which have no 3d hardwear accelerate.
if you have any suggestion or question,pls contact with me
mail:miaojb@126.com
msn:miaojianbo@hotmail.com
qq:30209027
2008/01/01
***************************************************************************/
#ifdef OUR_MAIN_C
#ifndef OUR_MATH_C
#define OUR_MATH_C
#include "our_math.h"
#include "our_3d.h"
#include "math.h"
#define FLOAT 1
//FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
//FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
//unsigned int reciprocal_look[1000];
unsigned int reciprocal_look[1];
//MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
//MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
#if FLOAT
unsigned short sin_cos_look[PI2_MY/4+1];//260
#else
const unsigned short sin_cos_look[PI2_MY/4+1]=
{
0,402,804,1206,1607,2009,2410,811,3211,3611,4011,4409,
4808,5205,5602,5997,6392,6786,7179,7571,7961,8351,8739,
9126,9512,9896,10278,10659,11039,11416,11793,12167,12539,
12910,13278,13645,14010,14372,14732,15090,15446,15800,16151,
16499,16846,17189,17530,17869,18204,18537,18868,19195,19519,
19841,20159,20475,20787,21097,21403,21706,22005,22301,22594,
22884,23170,23453,23732,24007,24279,24547,24812,25073,25330,
25583,25832,26077,26319,26557,26790,27020,27245,27466,27684,
27897,28106,28310,28511,28707,28898,29086,29269,29447,29621,
29791,29956,30117,30273,30425,30572,30714,30852,30985,31114,
31237,31357,31471,31581,31685,31785,31881,31971,32057,32138,
32214,32285,32351,32413,32469,32521,32568,32610,32647,32679,
32706,32728,32745,32758,32765,32768
};
/*
const unsigned short sin_cos_look[PI2_MY/4+1]=
{
};*/
#endif
//*********************************************************************
//準備sin_cos_look數組,給sin cos用
//參數1:
//return:
//*********************************************************************
void OUR_Build_Sin_Cos_Tables(void)
{
/**/
#if FLOAT
int ang;
for (ang = 0; ang <= PI2_MY/4; ang++)
{
double theta = (double)ang*PI*2/PI2_MY; // convert ang to radians
sin_cos_look[ang] = (int)((sin(theta))*(0x1<<(FIXP15_SHIFT+5))+(0x1<<(4)))>>5; // insert next entry into table
//sin_cos_look[ang] = sin(theta)*(0x1<<FIXP15_SHIFT);
}
#endif
}
//*********************************************************************
//求sin的函數,在OUR_Build_Sin_Cos_Tables之后使用
//參數1: 要求的sin的度數值 沒有限制 ( 512為360度)
//return:sin值
//*********************************************************************
FIXP16 OUR_Fast_Sin(FIXP16 theta) //30t
{
UINT ang;
ang=theta+0x80000000; //加上2PI的倍數 使得負數變成正數
//ang=ang&(~0xfffffe00); //只取2PI以內的數
ang=ang&(~(0xffffffff<<PI2_MY_BITS)); //只取2PI以內的數
if(ang<(PI2_MY/4))
return (sin_cos_look[ang]);
else if(ang<PI2_MY/2)
return (sin_cos_look[PI2_MY/2-ang]);
else if(ang<PI2_MY*3/4)
return -(sin_cos_look[ang-PI2_MY/2]);
else //if(ang<0x200)
return -(sin_cos_look[PI2_MY-ang]); /**/
}
//*********************************************************************
//求cos的函數,在OUR_Build_Sin_Cos_Tables之后使用
//參數1: 要求的cos的度數值 沒有限制 ( 512為360度)
//return:cos值
//*********************************************************************
FIXP16 OUR_Fast_Cos(FIXP16 theta) //30t
{
UINT ang;
ang=theta&(~(0xffffffff<<PI2_MY_BITS)); //只取2PI以內的數
if(ang<(PI2_MY/4))
return (sin_cos_look[(PI2_MY/4)-ang]); //10t
else if(ang<(PI2_MY/2))
return -(sin_cos_look[ang-(PI2_MY/4)]); //15t
else if(ang<(PI2_MY*3/4))
return -(sin_cos_look[(PI2_MY*3/4)-ang]); //20t
else //if(ang<0x200)
return (sin_cos_look[ang-(PI2_MY*3/4)]); /**///25t
}
//*********************************************************************
//準備reciprocal_look數組,給OUR_Fast_reciprocal用
//參數1:
//return:
//*********************************************************************
void OUR_Build_reciprocal_look(void)
{
/*
int i;
for (i=1;i<sizeof(reciprocal_look)/4;i++)
{
reciprocal_look[i]=(1<<18)/i;
}
reciprocal_look[0]=0x7fffffff;
*/
}
//*********************************************************************
//求倒數
//參數1:
//return: (0x1<<20)/theta
//注意:使用這個函數時要>>20,所以出去之后乘以的值不能太大
//就是說,除以后的值是小于2000的話是肯定正確的
//如果估計大于2000,就在外面先>>5再乘.
//*********************************************************************
UINT OUR_Fast_reciprocal(FIXP16 theta)//36t 20bits for reciprocal
{
return 0;
}
UINT OUR_Fast_division(FIXP16 y,FIXP16 x)
{
if(y<(0x01<<12)) //10t
{
return (y*OUR_Fast_reciprocal(x))>>20; //45t
}
else if(y<(0x01<<20)) //15t
{
if(x<(0x01<<4))
return (y*(OUR_Fast_reciprocal(x)>>8))>>12; //50t
else if(x<(0x01<<8))
return (y*(OUR_Fast_reciprocal(x)>>4))>>16; //55t
else
return (y*OUR_Fast_reciprocal(x))>>20; //60t
}
else if(y<(0x01<<26)) //20t
{
if(x<(0x01<<4))
return ((y>>6)*(OUR_Fast_reciprocal(x)>>8))>>6;//55t
else if(x<(0x01<<8))
return ((y>>6)*(OUR_Fast_reciprocal(x)>>4))>>10;//60t
else if(x<(0x01<<12))
return ((y>>6)*OUR_Fast_reciprocal(x))>>14; //65t
else if(x<(0x01<<16))
return ((y>>6)*OUR_Fast_reciprocal(x>>4))>>18; //70t
else
return ((y>>6)*OUR_Fast_reciprocal(x>>8))>>22; //75t
}
else //25t
{
if(x<(0x01<<4))
return ((y>>12)*(OUR_Fast_reciprocal(x)>>8)); //60t
else if(x<(0x01<<8))
return ((y>>12)*(OUR_Fast_reciprocal(x)>>4))>>4;//65t
else if(x<(0x01<<12))
return ((y>>12)*OUR_Fast_reciprocal(x))>>8;
else if(x<(0x01<<16))
return ((y>>12)*OUR_Fast_reciprocal(x>>4))>>12;
else //if(x<(0x01<<12))
return ((y>>12)*OUR_Fast_reciprocal(x>>8))>>16; //80t
}
return 0;
}
//MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
//MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
//*********************************************************************
//P1=P0 x M
//參數1:
//return:
//注意: va的所有值絕對值<0x8000=32768
// mb的所有值絕對值<0x8000
//*********************************************************************
void OUR_FIX_Mat_Mul_VECTOR3D_3X3( FIX_VECTOR3D_PTR va, //100t
FIX_MATRIX_3X3_PTR mb,
FIX_VECTOR3D_PTR vprod)
{
//有一個4舍5入的過程
FIXP16 x,y,z;
x=va->M[0];
y=va->M[1];
z=va->M[2];
vprod->M[0] = (x*mb->M[0][0] + y*mb->M[1][0] + z*mb->M[2][0] +(1<<(FIXP15_SHIFT-1)))>>FIXP15_SHIFT;
vprod->M[1] = (x*mb->M[0][1] + y*mb->M[1][1] + z*mb->M[2][1] +(1<<(FIXP15_SHIFT-1)))>>FIXP15_SHIFT;
vprod->M[2] = (x*mb->M[0][2] + y*mb->M[1][2] + z*mb->M[2][2] +(1<<(FIXP15_SHIFT-1)))>>FIXP15_SHIFT;
}
//------------------------------------------------------------------------
void OUR_FIX_VECTOR3D_SUB( FIX_VECTOR3D_PTR va, //20t
FIX_VECTOR3D_PTR vb,
FIX_VECTOR3D_PTR vprod)
{
vprod->M[0] = va->M[0]-vb->M[0];
vprod->M[1] = va->M[1]-vb->M[1];
vprod->M[2] = va->M[2]-vb->M[2];
}
//------------------------------------------------------------------------
void OUR_FIX_VECTOR3D_ADD( FIX_VECTOR3D_PTR va, //20t
FIX_VECTOR3D_PTR vb,
FIX_VECTOR3D_PTR vprod)
{
vprod->M[0] = va->M[0]+vb->M[0];
vprod->M[1] = va->M[1]+vb->M[1];
vprod->M[2] = va->M[2]+vb->M[2];
}
//------------------------------------------------------------------------
void OUR_VECTOR3D_SUB( OUR_3D_POINT_PTR va,
OUR_3D_POINT_PTR vb,
OUR_3D_POINT_PTR vprod)
{
// vprod->M[0] = va->M[0]-vb->M[0];
// vprod->M[1] = va->M[1]-vb->M[1];
// vprod->M[2] = va->M[2]-vb->M[2];
}
//*********************************************************************
//P1=P0 x M
//參數1:
//return:
//注意: ma的所有值絕對值<0x8000=32768
// mb的所有值絕對值<0x8000
//*********************************************************************
void OUR_FIX_Mat_Mul_3X3( FIX_MATRIX_3X3_PTR ma, //320t
FIX_MATRIX_3X3_PTR mb,
FIX_MATRIX_3X3_PTR mprod)
{
FIXP16 x,y,z;
int i;
for(i=0;i<3;i++)
{
x=ma->M[i][0];
y=ma->M[i][1];
z=ma->M[i][2];
mprod->M[i][0] = (x*mb->M[0][0] + y*mb->M[1][0] + z*mb->M[2][0]+(1<<(FIXP15_SHIFT-1)))>>FIXP15_SHIFT ;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -