📄 2dmath.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 + -