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

📄 2dmath.c

📁 通过c语言编写的坦克大战游戏
💻 C
字号:
/*2D数学函数*/
#define PI 3.1415


int Round(float x)  /*四舍五入*/
{
 return((int)(x+0.5));
}



double DZ(double X1,double Y1,double X2,double Y2)  /*两点距离*/
{
 double D;
 D=sqrt(fabs((X2-X1)*(X2-X1)+(Y2-Y1)*(Y2-Y1)));

 return (D);
}




void ASK_ABC(float x1,float y1,float x2,float y2,float *A,float *B,float *C)  /*求点ABC*/
{


 /*直线的一般方程式 AX+BY+C=0 */
 *A=y2-y1;
 *B=x1-x2;
 *C=y1*(x2-x1)-x1*(y2-y1);

}




void ASK_Q(double x1,double y1,double x2,double y2,double px,double py,float *Qx,float *Qy)  /*求点到直线的垂足坐标*/
{
 double A,B,C;

 /*直线的一般方程式 AX+BY+C=0 */
 A=y2-y1;
 B=x1-x2;
 C=y1*(x2-x1)-x1*(y2-y1);

 *Qx=(B*B*px-A*B*py-A*C)/(A*A+B*B);
 *Qy=(-A*B*px+A*A*py-B*C)/(A*A+B*B);

}





int ASK_PLD(double x1,double y1,double x2,double y2,double px,double py)  /*求点到直线的距离*/
{
 float A,B,C;
 double d;

 ASK_ABC(x1,y1,x2,y2,&A,&B,&C);

 /*直线的一般方程式 AX+BY+C=0 */


 d=fabs( (A*px+B*py+C) / sqrt(A*A+B*B) );   /*点到直线的距离*/

 Round(d);

 return(d);

}









int InterLine(float fAx,float fAy,float fBx,float fBy,float fCx,float fCy,float fDx,float fDy) /*判断两直线相交*/
{


float x,y; /*交点*/


float fLineAMinx;
float fLineAMiny;
float fLineAMaxx;
float fLineAMaxy;

float fLineBMinx;
float fLineBMiny;
float fLineBMaxx;
float fLineBMaxy;

float A1,B1,C1, A2,B2,C2;




ASK_ABC(fAx,fAy,fBx,fBy,&A1,&B1,&C1);
ASK_ABC(fCx,fCy,fDx,fDy,&A2,&B2,&C2);


if(A1*B2-A2*B1==0)
return 0;



x=-((C1*B2-C2*B1)/(A1*B2-A2*B1));
y=-((A1*C2-A2*C1)/(A1*B2-A2*B1));





fLineAMinx = fAx;
fLineAMiny = fAy;
fLineAMaxx = fAx;
fLineAMaxy = fAy;

if( fBx < fLineAMinx)
fLineAMinx = fBx;
if( fBy < fLineAMiny)
fLineAMiny = fBy;
if( fBx > fLineAMaxx)
fLineAMaxx = fBx;
if( fBy > fLineAMaxy)
fLineAMaxy = fBy;

fLineBMinx = fCx;
fLineBMiny = fCy;
fLineBMaxx = fCx;
fLineBMaxy = fCy;

if( fDx < fLineBMinx)
fLineBMinx = fDx;
if( fDy < fLineBMiny)
fLineBMiny = fDy;
if( fDx > fLineBMaxx)
fLineBMaxx = fDx;
if( fDy > fLineBMaxy)
fLineBMaxy = fDy;

if(x <= fLineAMaxx && x >= fLineAMinx && x <= fLineBMaxx && x >= fLineBMinx &&
y <= fLineAMaxy && y >= fLineAMiny && y <= fLineBMaxy && y >= fLineBMiny)
return 1;

return 0;
} 




int PLDX(int Ax,int Ay,int Bx,int By,int Px,int Py,int d)   /*检查是否有障碍*/   /*判断点是否靠近直线d的距离处*/
{


 float Cx,Cy; /*垂足坐标*/

 int CP,CA,CB,AB;


 if(DZ(Px,Py,Ax,Ay)<=d) return (1);   /*有障碍*/

 if(DZ(Px,Py,Bx,By)<=d) return (1);   /*有障碍*/




 CP=ASK_PLD(Ax,Ay,Bx,By,Px,Py);  /*点到直线的距离*/


 if( CP <= d ) 
   {

    ASK_Q(Ax,Ay,Bx,By,Px,Py,&Cx,&Cy); /*求出垂足坐标*/

    CA=DZ(Cx,Cy,Ax,Ay);
    CB=DZ(Cx,Cy,Bx,By);
    AB=DZ(Ax,Ay,Bx,By);

    if( -2 <= AB-(CA+CB) && AB-(CA+CB) <= 2 )  /*检查垂足是否在线内 误差值2*/
      {
       return (1);   /*有障碍*/
      }
    
     
   }

 
 return(0); /*无障碍*/


}




int ASK_a(int X1,int Y1,int X2,int Y2)   /*得到中心点到目标点的角度*/
{
   double duibian,xiebian;
   double k;
   double m=0;

   if(X1==X2&&Y1==Y2){return(-1);}

   if(Y2>Y1)
   duibian=Y2-Y1;
   else
   duibian=Y1-Y2;

   xiebian=DZ(X1,Y1,X2,Y2);

   k=duibian/xiebian;


   if(k>=-1&&k<=1){      /*防止asin()出错*/

   m=asin(k)/3.1415*180;

        if(X1>X2&&Y1>Y2) {m=180+m;}

   else if(X1<X2&&Y1>Y2) {m=360-m;}

   else if(X1>X2&&Y1<Y2) {m=180-m;}

   else if(X1>X2&&Y1<Y2) {;}

   else if(X1<X2&&Y1==Y2) {m=0;}

   else if(X1==X2&&Y1<Y2) {m=90;}

   else if(X1>X2&&Y1==Y2) {m=180;}

   else if(X1==X2&&Y1>Y2) {m=270;}

   return(m);
                  }

   else return(-1);


}





int int_fiexed(int i) /*int型转fixed型*/
{
 i=i/1.40625;
 return(i);
}

⌨️ 快捷键说明

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