



全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
本文是采用射线法判断点是否在多边形内的C语言程序。多年前,我自己实现了这样一个算法。但是随着时间的推移,我决定重写这个代码。参考周培德的计算几何一书,结合我的实践和经验,我相信,在这个算法的实现上,这是你迄今为止遇到的最优的代码。 这是个C语言的小算法的实现程序,本来不想放到这里。可是,当我自己要实现这样一个算法的时候,想在网上找个现成的,考察下来竟然一个符合需要的也没有。我对自己大学读书时写的代码没有信心,所以,决定重新写一个,并把它放到这里,以飨读者。也增加一下BLOG的点击量。 首先定义点结构如下: 以下是引用片段: Copy code /* Vertex structure */ typedef struct double x, y; vertex_t; 本算法里所指的多边形,是指由一系列点序列组成的封闭简单多边形。它的首尾点可以是或不是同一个点(不强制要求首尾点是同一个点)。这样的多边形可以是任意形状的,包括多条边在一条绝对直线上。因此,定义多边形结构如下: 以下是引用片段: Copy code /* Vertex list structure polygon */ typedef struct int num_vertices; /* Number of vertices in list */ vertex_t *vertex; /* Vertex array pointer */ vertexlist_t; 为加快判别速度,首先计算多边形的外包矩形(rect_t),判断点是否落在外包矩形内,只有满足落在外包矩形内的条件的点,才进入下一步的计算。为此,引入外包矩形结构rect_t和求点集合的外包矩形内的方法vertices_get_extent,代码如下: 以下是引用片段: Copy code /* bounding rectangle type */ typedef struct double min_x, min_y, max_x, max_y; rect_t; /外包矩形(rect_t) /* gets extent of vertices */ void vertices_get_extent (const vertex_t* vl, int np, /* in vertices */ rect_t* rc /* out extent*/ ) int i; if (np 0) rc-min_x = rc-max_x = vl0.x; rc-min_y = rc-max_y = vl0.y; else rc-min_x = rc-min_y = rc-max_x = rc-max_y = 0; /* =0 ? no vertices at all */ for(i=1; i if(vli.x min_x) rc-min_x = vli.x; if(vli.y min_y) rc-min_y = vli.y; if(vli.x rc-max_x) rc-max_x = vli.x; if(vli.y rc-max_y) rc-max_y = vli.y; 当点满足落在多边形外包矩形内的条件,要进一步判断点(v)是否在多边形(vl:np)内。本程序采用射线法,由待测试点(v)水平引出一条射线B(v,w),计算B与vl边线的交点数目,记为c,根据奇内偶外原则(c为奇数说明v在vl内,否则v不在vl内)判断点是否在多边形内。 具体原理就不多说。为计算线段间是否存在交点,引入下面的函数: (1)is_same判断2(p、q)个点是(1)否(0)在直线l(l_start,l_end)的同侧; (2)is_intersect用来判断2条线段(不是直线)s1、s2是(1)否(0)相交; 以下是引用片段: Copy code /* p, q is on the same of line l */ static int is_same(const vertex_t* l_start, const vertex_t* l_end, /* line l */ const vertex_t* p, const vertex_t* q) double dx = l_end-x - l_start-x; double dy = l_end-y - l_start-y; double dx1= p-x - l_start-x; double dy1= p-y - l_start-y; double dx2= q-x - l_end-x; double dy2= q-y - l_end-y; return (dx*dy1-dy*dx1)*(dx*dy2-dy*dx2) 0? 1 : 0); /* 2 line segments (s1, s2) are intersect? */ static int is_intersect(const vertex_t* s1_start, const vertex_t* s1_end, const vertex_t* s2_start, const vertex_t* s2_end) return (is_same(s1_start, s1_end, s2_start, s2_end)=0 & is_same(s2_start, s2_end, s1_start, s1_end)=0)? 1: 0; 下面的函数pt_in_poly就是判断点(v)是(1)否(0)在多边形(vl:np)内的程序: 以下是引用片段: Copy code int pt_in_poly ( const vertex_t* vl, int np, /* polygon vl with np vertices */ const vertex_t* v) int i, j, k1, k2, c; rect_t rc; vertex_t w; if (np x x rc.max_x | v-y y rc.max_y) return 0; /* Set a horizontal beam l(*v, w) from v to the ultra right */ w.x = rc.max_x + 5; w.y = v-y; c = 0; /* Intersection points counter */ for(i=0; i j = (i+1) % np; if(is_intersect(vl+i, vl+j, v, &w) c+; else if(vli.y=w.y) k1 = (np+i-1)%np; while(k1!=i & vlk1.y=w.y) k1 = (np+k1-1)%np;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年机关事务管理局机关服务中心招聘笔试题库附答案
- 军工网络安全等级保护应聘面试经典题及答案
- Unit2We'reFamily!SectionB1a-1d课件人教版英语七年级上册
- 2025企业设备抵押借款合同样本简单版
- 商务合同标准化条款与模板手册
- 2025年发展对象考试试题库与答案
- 小车辆运输合同
- 2025年国家电网县公司“充电桩+便利店+直播”运营经理竞聘笔试专项练习含答案
- 产品经销分销独家合作推广协议
- 2025年高级育婴师实操考试试题及答案
- 管道吊装方案范本
- 人事经理工作汇报
- 水质分析 题库及答案
- 2025年小学英语教师业务理论考试试题及答案
- 2025-2030中国消费电子产业创新趋势及市场需求与投资回报分析报告
- 2025年广东省中考物理真题(含答案解析)
- 四川省自贡市2024-2025学年八年级下学期期末物理试题(含答案)
- 2025年土木工程建筑技能考试-工程造价技能大赛历年参考题库含答案解析(5套典型题)
- 2025年初中物理教师教材教法考试测试卷及参考答案(共三套)
- 2025年有限空间作业专项安全培训试题及答案
- 基于人工智能的产前诊断技术应用探索-洞察及研究
评论
0/150
提交评论