//算法描述:
//凸四邊形任壹邊的兩個頂點位於另兩個頂點所在直線的同壹側。
//有兩條邊的凹四邊形的兩個頂點位於另兩個頂點所在直線的兩側。
//四個點(0,1,2,3)組成壹個四邊形有三種可能的序列:0123 0213 0132。
//
#包括
#包括
#定義ESP (1e-6)
double x[4]={0.0},y[4]= { 0.0 };
雙A[6],B[6],C[6];//線性方程Ax+By+C=0
雙D[6],E[6];//D和E存儲另外兩點帶入線性方程的值,其中零表示點在直線上,同號表示在直線的同側。
int pos[6][4]={{0,1,2,3},{0,2,1,3},{0,3,1,2},{1,2,0,3},{1,3,0,2},{2,3,0,1 };//用於數組ABCDEF
char str[6][8]={"0,1,2,3 "," 0,2,1,3 "," 1,2,0,3 "," 1,2,0,3 "," 1,3,0,2 "," 2,3,0,1 " };//用於打印輸出。
void TriangleArea(int a,int b,int c,int d)
{
雙S;
if(((x[a]-x[b])*(x[a]-x[c])& lt;0)| |((y[a]-y[b])*(y[a]-y[c])& lt;0))
{
s = fabs(x[b]* y[c]-y[b]* x[c]+x[c]* y[d]-x[d]* y[c]+x[d]* y[b]-x[b]* y[d]);
Printf("三點(%5.2lf,% 5.2lf) (%5.2lf,% 5.2lf) * *直線,三角形(% 5.2lf,% 5.2lf) (%)
x[a],y[a],x[b],y[b],x[c],y[c],x[b],y[b],x[c],y[c],x[d],y[d],S);
}
else if(((x[b]-x[a])*(x[b]-x[c])& lt;0)| |((y[b]-y[a])*(y[b]-y[c])& lt;0))
{
s = fabs(x[a]* y[c]-y[a]* x[c]+x[c]* y[d]-x[d]* y[c]+x[d]* y[a]-x[a]* y[d]);
Printf("三點(%5.2lf,% 5.2lf) (%5.2lf,% 5.2lf) * *直線,三角形(% 5.2lf,% 5.2lf) (%)
x[a],y[a],x[b],y[b],x[c],y[c],x[a],y[a],x[c],y[c],x[d],y[d],S);
}
else if(((x[c]-x[a])*(x[c]-x[b])& lt;0)| |((y[c]-y[a])*(y[c]-y[b])& lt;0))
{
s = fabs(x[a]* y[c]-y[a]* x[c]+x[c]* y[d]-x[d]* y[c]+x[d]* y[a]-x[a]* y[d]);
Printf("三點(%5.2lf,% 5.2lf) (%5.2lf,% 5.2lf) * *直線,三角形(% 5.2lf,% 5.2lf) (%)
x[a],y[a],x[b],y[b],x[c],y[c],x[a],y[a],x[b],y[b],x[d],y[d],S);
}
}
//凹四邊形
void AoArea01122330()
{
double S = fabs(x[0]* y[1]-x[1]* y[0]+x[1]* y[2]-x[2]* y[3]-x[3]* y[2]+x[3]* y[0]-x[0]* y[3])/2;
Printf("凹四邊形\ t (%5.2lf,% 5.2lf) \ t (%5.2lf,% 5.2lf) \ t (%5.2lf,% 5.2 lf)\ n面積s =% lf \
x[0],y[0],x[1],y[1],x[2],y[2],x[3],y[3],S);
}
void AoArea01133220()
{
double S = fabs(x[0]* y[1]-x[1]* y[0]+x[1]* y[3]-x[3]* y[2]-x[2]* y[3]+x[2]* y[0]-x[0]* y[2])/2;
Printf("凹四邊形\ t (%5.2lf,% 5.2lf) \ t (%5.2lf,% 5.2lf) \ t (%5.2lf,% 5.2 lf)\ n面積s =% lf \
x[0],y[0],x[1],y[1],x[3],y[3],x[2],y[2],S);
}
void AoArea02211330()
{
double S = fabs(x[0]* y[2]-x[2]* y[0]+x[2]* y[1]-x[1]* y[2]+x[1]* y[3]-x[3]* y[1]+x[3]* y[0]-x[0]* y[3])/2;
Printf("凹四邊形\ t (%5.2lf,% 5.2lf) \ t (%5.2lf,% 5.2lf) \ t (%5.2lf,% 5.2 lf)\ n面積s =% lf \
x[0],y[0],x[2],y[2],x[1],y[1],x[3],y[3],S);
}
//凸四邊形
空區域01122330()
{
double S = fabs(x[0]* y[1]-x[1]* y[0]+x[1]* y[2]-x[2]* y[3]-x[3]* y[2]+x[3]* y[0]-x[0]* y[3])/2;
Printf("凸四邊形\ t (%5.2lf,% 5.2lf) \ t (%5.2lf,% 5.2lf) \ t (%5.2lf,% 5.2lf) \ nArea s =% lf \
x[0],y[0],x[1],y[1],x[2],y[2],x[3],y[3],S);
}
空區域01133220()
{
double S = fabs(x[0]* y[1]-x[1]* y[0]+x[1]* y[3]-x[3]* y[2]-x[2]* y[3]+x[2]* y[0]-x[0]* y[2])/2;
Printf("凸四邊形\ t (%5.2lf,% 5.2lf) \ t (%5.2lf,% 5.2lf) \ t (%5.2lf,% 5.2lf) \ nArea s =% lf \
x[0],y[0],x[1],y[1],x[3],y[3],x[2],y[2],S);
}
空區域02211330()
{
double S = fabs(x[0]* y[2]-x[2]* y[0]+x[2]* y[1]-x[1]* y[2]+x[1]* y[3]-x[3]* y[1]+x[3]* y[0]-x[0]* y[3])/2;
Printf("凸四邊形\ t (%5.2lf,% 5.2lf) \ t (%5.2lf,% 5.2lf) \ t (%5.2lf,% 5.2lf) \ nArea s =% lf \
x[0],y[0],x[2],y[2],x[1],y[1],x[3],y[3],S);
}
int CheckInput()
{
//判斷四點輸入不同。
if((fabs(x[0]-x[1])& lt;ESP & amp& ampfabs(y[0]-y[1])& lt;ESP) ||
(fabs(x[0]-x[2])& lt;ESP & amp& ampfabs(y[0]-y[2])& lt;ESP) ||
(fabs(x[0]-x[3])& lt;ESP & amp& ampfabs(y[0]-y[3])& lt;ESP) ||
(fabs(x[1]-x[2])& lt;ESP & amp& ampfabs(y[1]-y[2])& lt;ESP) ||
(fabs(x[1]-x[3])& lt;ESP & amp& ampfabs(y[1]-y[3])& lt;ESP) ||
(fabs(x[2]-x[3])& lt;ESP & amp& ampfabs(y[2]-y[3])& lt;ESP))
返回0;
返回1;
}
//判斷是否是凸四邊形0123。
int Check01122330(雙*D,雙*E)
{
if(D[0]* E[0]& gt;0 & amp& ampD[2]*E[2]>0 & amp& ampD[3]*E[3]>0 & amp& ampD[5]*E[5]>0)
返回1;
其他
返回0;
}
//判斷是否是凸四邊形0132。
int Check01133220(雙*D,雙*E)
{
if(D[0]* E[0]& gt;0 & amp& ampD[1]*E[1]>0 & amp& ampD[4]*E[4]>0 & amp& ampD[5]*E[5]>0)
返回1;
其他
返回0;
}
//判斷是否是凸四邊形0213。
int Check02211330(雙*D,雙*E)
{
if(D[1]*E[1]>0 & amp& ampD[2]*E[2]>0 & amp& ampD[3]*E[3]>0 & amp& ampD[4]*E[4]>0)
返回1;
其他
返回0;
}
void Calculate(int p,double *A,double *B,double *C,double *D,double *E)
{
int p 1 = pos[p][0];
int p2 = pos[p][1];
int P3 = pos[p][2];
int P4 = pos[p][3];
if(fabs(y[p2]-y[p 1])& lt;ESP)
{
* A = 0.0
* B = 1.0;
* C =-y[p 1];
}
else if(fabs(x[p2]-x[p 1])& lt;ESP)
{
* A = 1.0;
* B = 0.0
* C =-x[p 1];
}
其他
{
double t =(x[p2]-x[p 1])/(y[p2]-y[p 1]);
* A = 1.0;
* B =-t;
* C = t * y[p 1]-x[p 1];
}
* D = * A * x[P3]+* B * y[P3]+* C;
* E = * A * x[P4]+* B * y[P4]+* C;
}
int main()
{
雙t;
int i,ii;
做
{
for(I = 0;我& lt4;i++)
{
printf("請輸入點%d(x,y):",I+1);
scanf("%lf,%lf ",& ampx[i],& ampy[I]);
}
} while(check input()= = 0);//檢查是否輸入了四個不同的點。
for(I = 0;我& lt6;i++)
{
計算(我,& ampA[i],& ampB[i],& ampC[i],& ampD[i],& ampe[I]);
printf("(% s)\ tA = % 5.2 lf \ tB = % 5.2 lf \ tC = % 5.2 lf \ tD = % 5.2 lf \ tE = % 5.2 lf \ n ",str[i],A[i],B[i],C[i],D[i],E[I]);
}
//判斷4點* * *線
if(fabs(D[0])& lt;ESP & amp& ampfabs(E[0])& lt;ESP)
{
Printf("四點* * *零面積線\ n ");
返回0;
}
//判斷三分線* * *線
if(fabs(D[0])& lt;ESP)
{
//0,1,2三點式* * *線
TriangleArea(0,1,2,3);
返回0;
}
else if(fabs(E[0])& lt;ESP)
{
//0,1,3三點式* * *線
TriangleArea(0,1,3,2);
返回0;
}
else if(fabs(E[1])& lt;ESP)
{
//0,2,3三點式* * *線
TriangleArea(0,2,3,1);
返回0;
}
else if(fabs(E[3])& lt;ESP)
{
//1,2,3三點式* * *線
三角形面積(1,2,3,0);
返回0;
}
//四邊形
if(Check01122330(D,E)= = 0 & amp;& ampCheck01133220(D,E)==0。& ampCheck02211330(D,E)==0)
{
//凹四邊形
aoarea 01122330();
aoarea 01133220();
aoarea 02211330();
}
else if(check 01122330(D,E)==1)
{
//凸四邊形
area 01122330();
}
else if(check 01133220(D,E)==1)
{
//凸四邊形
area 01133220();
}
else if(check 02211330(D,E)==1)
{
//凸四邊形
area 02211330();
}
返回0;
}