輸入n個點的坐標,判斷這n個點能否形成凸多邊形。
2.問題分析。
根據兩點確定壹條直線的原理,即y-y 1/x-x 1 = y2-y 1/x2-x 1;X(Y2-Y 1)+Y(X 1-X2)-X 1 Y2+x2y 1,設t = X (Y2-Y1)+Y (X1-X2)。
從任何壹點出發,都能找到能與之形成壹條邊的點。如果能依次找到n個點,就是凸多邊形。
反之,則不能。
3.設計思路。
輸入n個點,用二維數組存儲這n個點,定義壹個實函數來判斷這n個點是否能形成凸多邊形,從第壹個點開始尋找滿足函數tt的n條邊為圖形多邊形。tt是判斷兩個點是否能形成圖形多邊形的邊的函數。
4.流程圖。
5.源程序。
# include & ltstdio.h & gt
#定義N 4
int tt(int p[][2],int a,int b)
{
int temp[N],k = 0;
int t;
int I;
int j;
for(I = 0;我& ltn;i++)
{
如果(i==a||i==b)
{
繼續;
}
t = p[I][0]*(p[b][1]-p[a][1])+(p[a][0]-p[b][0])* p[I][1]-p[a][0]* p[b][1]+p[b][0]* p[a][1];
如果(t==0)
返回0;
其他
if(t & gt;0)
temp[k++]= 1;
其他
temp[k++]=-1;
}
for(j = 1;j & ltk;j++)
{
if(temp[0]!=temp[j])返回0;
}
返回1;
}
int real(int p[][2])
{
int flag[N],m = 0;
int i,j;
for(I = 0;我& ltn;i++)
{
flag[I]= 0;
}
for(I = 0;我& ltn;i++)
{
for(j = 1;j & ltn;j++)
{
if(flag[j])繼續;
如果(tt)
{
flag[m]= 1;
m = j;
打破;
}
}
}
flag[m]= 1;
for(I = 0;我& ltn;i++)
{
if(flag[i]==0)
返回0;
}
if(tt(p,0,m))返回1;
返回0;
}
void main()
{
int p[N][2];
int I;
Printf("請輸入這n個點的坐標:\ n ");
for(I = 0;我& ltn;i++)
{
Printf("點%d的坐標:",I+1);
scanf("%d,%d ",& ampp[i][0],& ampp[I][1]);
printf("%d,%d\n ",p[i][0],p[I][1]);
}
if(實數(p))
printf(" can ");
其他
Printf("不能");
}