资源预览内容
第1页 / 共11页
第2页 / 共11页
第3页 / 共11页
第4页 / 共11页
第5页 / 共11页
第6页 / 共11页
第7页 / 共11页
第8页 / 共11页
第9页 / 共11页
第10页 / 共11页
亲,该文档总共11页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
C语言判断点面位置关系系统一:程序/*此程序适用于任意复杂程度的单连通和复连通多边形区域*/#include#include#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;i0)return n;else return (-n);float Min(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;iM-1;i+)t=(Xi-xp)*(Yi+1-yp)-(Yi-yp)*(Xi+1-xp)/2; t=func(t); sn=sn+t; if(i=M-2) sn=sn+func(X0-xp)*(YM-1-yp)-(Y0-yp)*(XM-1-xp)/2); /*求出凸多边形的总面积并输出*/ printf(sn=%fn,sn); for(i=0;iXi+1&xXi+1&xXi)|(XiXi&xXi+1)sp=0; /*如果给定点的横坐标在相邻两点横坐标之间, 则给定点与各个相邻顶点依次围成的面积之和sp赋值为0,并跳出循环*/ break;else if(Xi=Xi+1)&(YiYi+1&yYi)|(YiYi+1&yYi+1)sp=0; /*如果给定点的纵坐标在相邻两点纵坐标之间,并且相邻两点横坐标相等 则sp=0,并跳出循环*/ break;else if(x=Xi&y=Yi|x=Xi+1&y=Yi+1)sp=0; /*如果给定点的坐标等于相邻两点任意一点的坐标,则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(X0XM-1&xXM-1&xX0)|(X0X0&xXM-1) sp=0; break; else if(X0=XM-1)&(Y0YM-1&yY0)|(Y0YM-1&yYM-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(spsn) printf(This point (%f,%f) is out of the regionn,x,y);else if(sp=sn)printf(This 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:);scanf(%s,ch);if(strcmp(ch,y)=0) /*若输入的字符串为y,则递归调用自身,并将sn,sp赋0,清楚以前的记录重新开始。 区域保持不变,然后又重新输入一个点。若不为y,则不执行递归调用*/sn=0;/*变量初始化*/ sp=0;/*变量初始化*/printf(Please continue to input one point:); scanf(%f,%f,&x,&y); simplefun(); void onfun() /*定义判断任意给定点与任意复杂程度的单连通域是否在边上、顶点的函数*/for(i=0;iXi+1&(xXi+1&xXi)|(XiXi&xXi+1)printf(The point is on the edge of the regionn);k=0;/*给定点横坐标x在相邻两点横坐标之间,则将k赋值为0,并跳出循环*/break;else if(Xi=Xi+1)&(YiYi+1&yYi)|(YiYi+1&yYi+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,并跳出循环*/break;if(i=M-2)/*最后一点的情况要单独讨论,与上面同理*/t=(XM-1-x)*(Y0-y)-(YM-1-y)*(X0-x)/2;s=func(t);if(s=0) if(X0XM-1&(xXM-1&xX0)|(X0X0&xXM-1) printf(The point is on the edge of the regionn); k=0; break;else if(X0=XM-1)&(Y0YM-1&yY0)|(Y0YM-1&yYM-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_incarefulfun()/*定义判断给定一点是否在任意单连通区域内、外的函数*/Ymin=Y0;Ymax=Y0;for(i=1;iM;i+)Ymin=Min(Ymin,Yi);/*找出构成区域的点中的最大和最小的纵坐标*/Ymax=Max(Ymax,Yi);if(k)/*k为1则执行*/for(i=0;iM-1;i+)if(Yiy|Yiy&Yi+10)/*过给定点(x,y)的水平线与相邻
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号