点在多边形问题程序报告.doc
《点在多边形问题程序报告.doc》由会员分享,可在线阅读,更多相关《点在多边形问题程序报告.doc(4页珍藏版)》请在冰豆网上搜索。
点在多边形问题程序报告
--------护城小兵
.问题描述
给定n个点的坐标,这n个点依次围成一闭合多边形,再给一点(x,y),判断它是否再多边形中。
2.课题分析
点在多边形内
要解决的问题
相交次数相交的角度相加的和
3.数据结构的设计
inttt(doublep[][2],inta,intb):
一点坐标
if(t==0)return0:
定义0
if(t>0)temp[k++]=1:
定义1
temp[k++]=-1:
定义-1
4.处理结构的设计
输入点P(X,Y)
以P为起点作任意射线L
算L与线段AB,BC,CD,……,KA相交的次数
线段关于P是逆时针的算+1,顺时针的算-1,不相交的算0
加起來不等于0的就是在多边形內
5.源程序
#include
constintN=4;
inttt(doublep[][2],inta,intb)
{
inttemp[N],k=0;doublet;
for(inti=0;i{if(i==a||i==b)
{continue;}
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];
if(t==0)return0;
elseif(t>0)temp[k++]=1;
elsetemp[k++]=-1;}
for(intj=1;j{if(temp[0]!
=temp[j])return0;}
return1;}
intreal(doublep[][2])
{intflag[N],m=0;for(inti=0;ifor(i=0;i{for(intj=1;j{if(flag[j])continue;if(tt(p,m,j))
{flag[m]=1;m=j;break;}}}
flag[m]=1;
for(i=0;i{if(flag[i]==0)return0;}
if(tt(p,0,m))return1;return0;}
voidmain()
{doublep[N][2];
charch='y';
while(ch=='y'||ch=='Y')
{cout<<"请输入点的坐标:
"<for(inti=0;i{cout<<"下一个点坐标:
";cin>>p[i][0]>>p[i][1];cout<
if(real(p))cout<<"能构成";elsecout<<"不能构成";cout<(继续请输入y&Y)";cin>>ch;}}
6.调试记录
八,课程设计总结:
在调试程序的过程中,我明白程序不是写出来的,而是调出来的,这次的设计课是人生一次真正的自己动手的程序设计!
自己发现问题、解决问题,其中不仅对C和C++的操作有了进一步的掌握,还了解到了程序设计的书写风格及其注释的格式。