语言判断点面位置关系系统_第1页
语言判断点面位置关系系统_第2页
语言判断点面位置关系系统_第3页
语言判断点面位置关系系统_第4页
语言判断点面位置关系系统_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、C语言判断点面位置关系系统一:程序/*此程序适用于任意复杂程度的单连通和复连通多边形区域*/#include<stdio.h>#include<string.h>#define M 36 /*给定多边形边数*/float XM,YM;float x,y,t,s,Ymin,Ymax,C,D,sn=0,sp=0,xp,yp,l;int i,j=0,k=1;char ch2;void input() /*定义输入坐标函数*/printf("Please input points made of area: n");for(i=0;i<M;i+) sc

2、anf("%f,%f",&Xi,&Yi); /*从键盘输入围成多边形的顶点坐标*/printf("Please input one point: ");scanf("%f,%f",&x,&y); /*从键盘任意输入一点*/float func(float n) /*定义求绝对值的函数*/ if(n>0)return n;else return (-n);float Min(float m,float n) /*定义求最小值的函数*/if(m<=n)return m;elsereturn n;

3、float Max(float m,float n) /*定义求最大值的函数*/if(m>=n)return m;elsereturn n;void simplefun() /*定义判断点是否在凸多边形上、内、外函数*/ xp=(X0+X2)/2; /*起点与第三点的中点横坐标*/yp=(Y0+Y2)/2; /*起点与第三点的中点纵坐标*/printf("xp=%ftyp=%fn",xp,yp); for(i=0;i<M-1;i+)t=(Xi-xp)*(Yi+1-yp)-(Yi-yp)*(Xi+1-xp)/2; t=func(t); sn=sn+t; if(i=

4、M-2) sn=sn+func(X0-xp)*(YM-1-yp)-(Y0-yp)*(XM-1-xp)/2); /*求出凸多边形的总面积并输出*/ printf("sn=%fn",sn); for(i=0;i<M-1;i+)t=(Xi-x)*(Yi+1-y)-(Yi-y)*(Xi+1-x)/2;t=func(t);if(t=0) if(Xi>Xi+1&&x>Xi+1&&x<Xi)|(Xi<Xi+1&&x>Xi&&x<Xi+1)sp=0; /*如果给定点的横坐标在相邻两点横

5、坐标之间, 则给定点与各个相邻顶点依次围成的面积之和sp赋值为0,并跳出循环*/ break;else if(Xi=Xi+1)&&(Yi<Yi+1&&y<Yi+1&&y>Yi)|(Yi>Yi+1&&y<Yi&&y>Yi+1)sp=0; /*如果给定点的纵坐标在相邻两点纵坐标之间,并且相邻两点横坐标相等 则sp=0,并跳出循环*/ break;else if(x=Xi&&y=Yi|x=Xi+1&&y=Yi+1)sp=0; /*如果给定点的坐标等于相邻

6、两点任意一点的坐标,则sp=0,并跳出循环*/ break;sp=sp+t;if(i=M-2) /*最后一点的情况必须单独讨论,同上*/l=func(X0-x)*(YM-1-y)-(Y0-y)*(XM-1-x)/2);if(l=0) if(X0>XM-1&&x>XM-1&&x<X0)|(X0<XM-1&&x>X0&&x<XM-1) sp=0; break; else if(X0=XM-1)&&(Y0<YM-1&&y<YM-1&&y>

7、;Y0)|(Y0>YM-1&&y<Y0&&y>YM-1) sp=0; break; else if(x=X0&&y=Y0|x=XM-1&&y=YM-1) sp=0; break; sp=sp+l; /*若前面的if都不执行,则sp就是给定点与各个相邻顶点依次围成的真实的面积之和*/*最终得出结论*/if(sp>sn) printf("This point (%f,%f) is out of the regionn",x,y);else if(sp=sn)printf("This

8、 point (%f,%f) is in the regionn",x,y);elseprintf("This point (%f,%f) is on the edge of the regionn",x,y); printf("Whether to continue to input one point<y/n>:");scanf("%s",ch);if(strcmp(ch,"y")=0) /*若输入的字符串为y,则递归调用自身,并将sn,sp赋0,清楚以前的记录重新开始。 区域保持不变,然

9、后又重新输入一个点。若不为y,则不执行递归调用*/sn=0;/*变量初始化*/ sp=0;/*变量初始化*/printf("Please continue to input one point:"); scanf("%f,%f",&x,&y); simplefun(); void onfun() /*定义判断任意给定点与任意复杂程度的单连通域是否在边上、顶点的函数*/for(i=0;i<M-1;i+)t=(Xi-x)*(Yi+1-y)-(Yi-y)*(Xi+1-x)/2;s=func(t);if(s=0)/*给定点与相邻两点围成的面

10、积为0*/if(Xi>Xi+1&&(x>Xi+1&&x<Xi)|(Xi<Xi+1&&(x>Xi&&x<Xi+1)printf("The point is on the edge of the regionn");k=0;/*给定点横坐标x在相邻两点横坐标之间,则将k赋值为0,并跳出循环*/break;else if(Xi=Xi+1)&&(Yi<Yi+1&&y<Yi+1&&y>Yi)|(Yi>Yi+1&am

11、p;&y<Yi&&y>Yi+1)printf("The point is on the edge of the regionn");k=0;/*相邻两点横坐标相等,并且给定点纵坐标y在相邻两点纵坐标之间,则将k赋值为0,并跳出循环*/break;else if(x=Xi&&y=Yi|x=Xi+1&&y=Yi+1)printf("The point is on the point of the regionn");k=0;/*给定点坐标与相邻两点任意一点坐标相同,则将k赋值为0,并跳出循环

12、*/break;if(i=M-2)/*最后一点的情况要单独讨论,与上面同理*/t=(XM-1-x)*(Y0-y)-(YM-1-y)*(X0-x)/2;s=func(t);if(s=0) if(X0>XM-1&&(x>XM-1&&x<X0)|(X0<XM-1&&(x>X0&&x<XM-1) printf("The point is on the edge of the regionn"); k=0; break;else if(X0=XM-1)&&(Y0<

13、YM-1&&y<YM-1&&y>Y0)|(Y0>YM-1&&y<Y0&&y>YM-1) printf("The point is on the edge of the regionn"); k=0; break; else if(x=X0&&y=Y0|x=XM-1&&y=YM-1) printf("The point is on the point of the regionn"); k=0; break;void out_inc

14、arefulfun()/*定义判断给定一点是否在任意单连通区域内、外的函数*/Ymin=Y0;Ymax=Y0;for(i=1;i<M;i+)Ymin=Min(Ymin,Yi);/*找出构成区域的点中的最大和最小的纵坐标*/Ymax=Max(Ymax,Yi);if(k)/*k为1则执行*/for(i=0;i<M-1;i+)if(Yi<y&&Yi+1>y|Yi>y&&Yi+1<y)C=(Yi+1-y)*Xi-(Yi-y)*Xi+1;D=Yi+1-Yi;if(D*(C-D*x)>0)/*过给定点(x,y)的水平线与相邻两点连线

15、的交点横坐标在x的右侧,下同*/j+;else if(i>0&&Yi=y&&Xi>x&&(Yi!=Ymin&&Yi!=Ymax)&&(Yi-1<y&&Yi+1>y|Yi-1>y&&Yi+1<y)j+;/*过给定点(x,y)的水平线与相邻两点连线的交点就为顶点,并且上相邻点与下相邻点在顶点的两侧,则j=j+1*/else if(i>0&&i<M-2&&Yi=y&&Xi>x&&a

16、mp;(Yi!=Ymin&&Yi!=Ymax)&&Yi+1=y)/*给定点与相邻两点三点一线的情况*/if(Yi-1>Yi&&Yi+1>Yi+2|Yi-1<Yi&&Yi+1<Yi+2)j+;else if(Ymin=y|Ymax=y)/*y为最大纵坐标或最小纵坐标则在面外,直接break*/printf("The point is out of the regionn");break;if(i=M-2)/*最后一点的情况要单独讨论,与上面同理*/if(Y0=y&&X0&g

17、t;x&&(Y0!=Ymin&&Y0!=Ymax)&&(Y1<y&&YM-1>y|Y1>y&&YM-1<y)j+;/*1中i=M-1的情况单独讨论*/if(Y0=y&&X0>x&&(Y0!=Ymin&&Y0!=Ymax)&&Y1=y)if(YM-1>Y0&&Y1>Y2|YM-1<Y0&&Y1<Y2)j+;/*4,5中i=0的情况单独讨论*/if(Y0<y&

18、;&YM-1>y|Y0>y&&YM-1<y)C=(YM-1-y)*X0-(Y0-y)*XM-1; D=YM-1-Y0;if(D*(C-D*x)>0)j+;/*1中i=M-1的情况单独讨论*/else if(YM-1=y&&XM-1>x&&(YM-1!=Ymin&&YM-1!=Ymax)&&(YM-2<y&&Y0>y|YM-2>y&&Y0<y) j+;/*2,3中i=M-1的情况单独讨论*/ else if(YM-2=y&a

19、mp;&XM-2>x&&(YM-2!=Ymin&&YM-2!=Ymax)&&YM-1=y)if(YM-3>YM-2&&YM-1>Y0|YM-3<YM-2&&YM-1<Y0)j+;/*4,5中i=M-2的情况单独讨论*/else if(YM-1=y&&XM-1>x&&(YM-1!=Ymin&&YM-1!=Ymax)&&Y0=y)if(YM-2>YM-1&&Y0>Y1|YM-2<

20、YM-1&&Y0<Y1)j+;/*4,5中i=M-1的情况单独讨论*/printf("j=%dn",j);if(j%2=0)/*判断j是否为奇数*/printf("The point is out of the regionn");elseprintf("The point is in the regionn");void continue_fun()/*定义询问是否循环判断不同给定点的函数*/onfun();out_incarefulfun();printf("Whether to continue

21、to input one point<y/n>:");scanf("%s",ch); if(strcmp(ch,"y")=0)/*若输入y则递归调用,否则不执行*/j=0,k=1;/*变量初始化*/printf("Please continue to input one point:"); scanf("%f,%f",&x,&y); continue_fun();void menu()/*定义菜单界面函数*/printf("nnnnn"); printf(&

22、quot;tt|-POSITION-|n"); printf("tt|t 0. exit |n"); printf("tt|t |n"); printf("tt|t 1. simple polygon |n"); printf("tt|t |n"); printf("tt|t 2. complex polygon |n"); printf("tt|-|nn"); printf("tttchoose(0-2):");/*输入0则结束程序并退出;输入1则选择凸多边形区域;输入2则选择任意单连通区域*/void main()int n;menu();scanf("%d",&n);while(n)switch(n) case 1:/*1则判断凸多边形区域*/ input(); simplefun(); break; case 2:/*2则判断任意单连通区域*/ input(); continue_fun(); break;sn=0;/*变量初始化。下同*/sp=0;j=0;k=1;menu();/*调用菜单界面函数*/scanf("%i",&n);/*输入n重新确定图形类型*/

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论