七巧板复原算法——计算机图形学基本算法之一, 点在多边形内部的判断
注:此时我已经完成了一个演示版本,但是为了文章的渐进性,我将把开发过程一步步的写出来,用来记录。
本实验代码用到的图形学关系和算法列举如下:
基本计算机图形学关系和算法
1.点在多边形内部的
点在多边形内部的判断方法的原理非常简单:由该点发出的射线如果和多边形的交点数是奇数,则该点在多边形的内部,如果是偶数,则在外部。简单说明如图示:
对于一个凸多边形,这个结论是显然的,因为该点在多边内部的话,经过该点的射线只能和凸多边形有一个交点;而在外面的点,如果和多边形的一条边相交,子必然经过其 内部的一个点,这样根据上面的结论,则该射线在射出时,必然还会和另一边有一个交点,这样交点数就是两个。这样对于图多边形是成立的。
对于凹多边形,有两种情况,即A点和B点 的情况,这两种情况和凸多边形是一致的。下面讨论C点。C点在凸多边形内部,发出的射线如果从某一条边射出,则有一个交点, 再再进入内部再射出时,必然是两个交点(可利用凸多边形的结论),交点数是1+2*n, 是个奇数。D点则必然是偶数。
需要说明的是,为了计算的简便,会选择和X轴平行的直线进行计算,这样就会可能出现下图的情景。
A射线过一个顶点,B射线经过一条边和一个顶点,C射线和某一边二重合。为了遵循上面的判断方法,需要做出几个规定。
对于A,如果射线经过顶点,且不是顶点,则在外部,或者认为是有两个交点。其实这个从微观的角度讲,就是两个交点。对于射线B,和一条边相交,过一个顶点,规定这种顶点算一个交点。射线C其实和A是一样的,和某线段重合,不算有交点。经过这样处理,上面的判断方法就一致了。
判断点在多边形内部的代码如下:
注:代码参考了 https://www.cnblogs.com/soundcode/p/7727893.html
public bool PointInsidePolygon(PointF pnt){int j = 0, cnt = 0;//点在多边形某条边上的判断if (PntOnPlgSeg(pnt, this, out _, true)){return true;}else{for (int i = 0; i < m_OrgPointArr.Length; i++){j = (i == m_OrgPointArr.Length - 1) ? 0 : j + 1;if ((m_OrgPointArr[i].Y != m_OrgPointArr[j].Y) && (((pnt.Y >= m_OrgPointArr[i].Y) && (pnt.Y < m_OrgPointArr[j].Y)) || ((pnt.Y >= m_OrgPointArr[j].Y) && (pnt.Y < m_OrgPointArr[i].Y))) && (pnt.X < (m_OrgPointArr[j].X - m_OrgPointArr[i].X) * (pnt.Y - m_OrgPointArr[i].Y) / (m_OrgPointArr[j].Y - m_OrgPointArr[i].Y) + m_OrgPointArr[i].X)) cnt++;}}return (cnt % 2 > 0);}
上述代码在点在多边形的边上的判断有问题,因此笔者增加了点在边上的判断。函数代码如下:
private bool PntOnPlgSeg(PointF pnt, TangramPolygon plg, out int outBoxIdx, bool bPositiveOrder){bool bOnPlg = false;outBoxIdx = -1;int idx = 0;if (!bPositiveOrder){idx = plg.Count() - 1;}for (int i = 0; i < plg.Count(); i++){PointF pnt1, pnt2;pnt1 = plg.GetVertexPoint(idx);pnt2 = plg.GetNextVertexPoint(idx);if (!bPositiveOrder){pnt2 = plg.GetVertexPoint(idx);pnt1 = plg.GetNextVertexPoint(idx);}if (PointOnSegment(pnt, pnt1, pnt2)){bOnPlg = true;outBoxIdx = idx;break;}if (bPositiveOrder){idx = plg.GetVertex(idx).next_idx;}else{idx = plg.GetVertex(idx).last_idx;}}return bOnPlg;}
说明:上述判断的原理应该是使用率线段相交判断的方法,即跨立实验法,本人并没有研究代码的原理和准确性。但是经过检验,大体是对的。
后面将陆续给出各个使用函数,待续。
maraSun 2022-04-20 BJFWDQ
关注上海,封何时止?
上一个今天做出的复原图,证明我确实是在写代码。
七巧板复原算法——计算机图形学基本算法之一, 点在多边形内部的判断相关推荐
- 七巧板复原算法——计算机图形学基本算法之二,线段相交判断
判断线段相交,朴素的方法(初中直线方程的判断方法),就是先计算两条直线的交点,然后再判断交点是否在其中一条的线段上.这也是笔者能唯一想到的方法,后来抱着试试看有没有更好方法的想法,搜了一下网络.哦, ...
- GIS地图界面和计算机图形学填充算法
一 GIS地图界面 GIS程序最常见的界面就是,不同区域被边界隔开,填充为不同的颜色: 如下三个:是超图iServer自带: 京津地区土地利用现状,京津地区人口分布,京津地区地貌分布:用于学习是很好资 ...
- 计算机图形学算法详解,计算机图形学裁剪算法详解
<计算机图形学裁剪算法详解>由会员分享,可在线阅读,更多相关<计算机图形学裁剪算法详解(10页珍藏版)>请在人人文库网上搜索. 1.裁剪算法详解在使用计算机处理图形信息时,计算 ...
- 计算机图形学常见算法原理,计算机图形学常用算法及代码大全
<计算机图形学常用算法及代码大全>由会员分享,可在线阅读,更多相关<计算机图形学常用算法及代码大全(41页珍藏版)>请在人人文库网上搜索. 1.2.1.1 生成直线的DDA算法 ...
- 计算机图形学要学什么语言,计算机图形学:算法与实现
计算机图形学:算法与实现 语音 编辑 锁定 讨论 上传视频 <计算机图形学:算法与实现>一书的出版社是清华大学出版社,出版时间是第1版 (2012年1月1日). 书 名 计算机图形学 ...
- 计算机图形学直线算法论文,《计算机图形学》中直线生成算法的教学心得
摘要:<计算机图形学>是计算机科学与技术专业一门重要的专业课,其中直线生成算法是教学重点之一.该文通过分析几种直线生成算法的特点,阐述了理论教学和实践教学的重点和难点,总结了教学的体会和心 ...
- 计算机图形学 裁剪算法源代码,OpenGL计算机图形学梁友栋裁剪算法实验代码及运行结果.doc...
OpenGL计算机图形学梁友栋裁剪算法实验代码及运行结果.doc (10页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 14.9 积分 .<计算 ...
- 计算机图形学椭圆_椭圆算法| 计算机图形学
计算机图形学椭圆 椭圆的性质 (Properties of ellipse) Ellipse is defined as the locus of a point in a plane which m ...
- 计算机图形学+简单算法实现,《计算机图形学》课程设计-简单几何体的消隐算法实现.doc...
PAGE PAGE 18 PAGE 18 课程名称:<计算机图形学> 论文题目:简单几何体的消隐算法实现 教学部: 年 级: 班 级: 学 号: 姓 名: 简单几何体的消隐算法实现 摘 要 ...
最新文章
- 17综合案例之淘宝轮播图布局
- Win2003利用dfs(分布式文件系统)在负载均衡下的文件同步配置方案
- oracle DBA 常用表和视图
- 「PKUWC2018」Minimax
- golang中的collection
- Python 编程快速上手 第十五章 保持时间,计划任务和启动程序
- linux将bridge当做hub来用
- python_day10_并发编程
- JVM内存模型和类加载运行机制
- 思科 IP 电话被指包含严重的 RCE 缺陷
- GarsiaWachs算法:石子归并问题
- struts标签的使用
- OBS 电脑推流直播指南
- HTML5前端开发实战01-学生信息表
- Arduino 寻找IIC设备地址的代码
- python k线斜率计算公式_浅析K线上涨斜率
- python中.item()的讲解
- 判断质数、分解质因数
- 用SDK包开发K66FX18学习笔记(1)
- ocr文字识别软件:Readiris Corporate 17 Mac中文版