




已阅读5页,还剩7页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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)的水平线与相邻两点连线的交点横坐标在x的右侧,下同*/j+;else if(i0&Yi=y&Xix&(Yi!=Ymin&Yi!=Ymax)&(Yi-1y|Yi-1y&Yi+10&ix&(Yi!=Ymin&Yi!=Ymax)&Yi+1=y)/*给定点与相邻两点三点一线的情况*/if(Yi-1Yi&Yi+1Yi+2|Yi-1Yi&Yi+1x&(Y0!=Ymin&Y0!=Ymax)&(Y1y|Y1y&YM-1x&(Y0!=Ymin&Y0!=Ymax)&Y1=y)if(YM-1Y0&Y1Y2|YM-1Y0&Y1Y2)j+;/*4,5中i=0的情况单独讨论*/if(Y0y|Y0y&YM-10)j+;/*1中i=M-1的情况单独讨论*/else if(YM-1=y&XM-1x&(YM-1!=Ymin&YM-1!=Ymax)&(YM-2y|YM-2y&Y0x&(YM-2!=Ymin&YM-2!=Ymax)&YM-1=y)if(YM-3YM-2&YM-1Y0|YM-3YM-2&YM-1x&(YM-1!=Ymin&YM-1!=Ymax)&Y0=y)if(YM-2YM-1&Y0Y1|YM-2YM-1&Y0Y1)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 to input one point:);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(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重新确定图形类型*/二:点面位置关系系统使用说明书使用说明运行程序时,首先进入到菜单部分,菜单部分提供了菜单显示和输入功能部分。其运行效果如图下图所示。在主界面上输入02内的数字,实现相应的功能。图1 点面位置关系系统主界面主界面输入1时,进入凸多边形类型区域的界面,主界面输入2时,进入任意复杂程度的单连通和复连通类型区域(当然包含凸多边形和凹多边形)的界面。选择好类型后则提示请输入构成多边形的各个顶点坐标,完成后回车,继续输入判断点回车,给出点面关系。运行效果如下。图2 输入点、面信息判断完成后会询问是否继续输入一点进行判断,若输入是则执行刚才的程序;若不是,则返回菜单主界面重新选择区域类型。运行效果如图。图3 选择是否继续进行执行完后,输入0结束程序并退出系统。运行效果如图。图4 退出系统系统原理1.判断点与凸多边形的位置关系方法较多,这里我用的是三角形面积法。如图(这里以7边形为例)。点在边上或顶点最好判断,只要有一个小三角形面积为零并且给定点坐标x在相邻两点之间或y在相邻两点之间即可。先计算多边形的面积,方法是找到第一点与低三点连线中点,而后化为多个小三角形求面积之和即可。再用给定点用同样的方法求面积,若相等则在面内,大于真实面积则在面外
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026届山东省菏泽市王浩屯中学英语九年级第一学期期末检测试题含解析
- 2026届贵州省黔东南州剑河县化学九上期中学业质量监测试题含解析
- 河南省郑州市桐柏一中学2026届九上化学期中调研模拟试题含解析
- 大兴安岭市重点中学2026届九年级英语第一学期期末学业水平测试模拟试题含解析
- 2026届陕西省宝鸡市渭滨区九年级英语第一学期期末经典模拟试题含解析
- 2026届山西省临汾市襄汾县九上化学期中达标测试试题含解析
- 信托资金借贷合同范文6篇
- 离婚协议中关于共同财产分割及人寿保险权益保障协议
- 离婚协议书(涉及跨境财产分割与法律适用)
- 猪场租赁合同(含饲料供应与养殖技术支持)
- 平凉市崆峒区大寨乡柳沟村地热水矿产资源开发利用方案
- 推广普通话课件
- 隧道安全质量培训课件
- 六年级上册语文期末复习句子专项训练及答案
- 2019人教版高中英语选择性必修一UNIT 1 People of Achievement 单词表
- 电力变压器基础知识课件
- JJG 373-1997四球摩擦试验机
- GB/T 37785-2019烟气脱硫石膏
- GB/T 29343-2012木薯淀粉
- GB/T 16714-2007连续式粮食干燥机
- 班组长能力提升培训讲义课件
评论
0/150
提交评论