注:此时我已经完成了一个演示版本,但是为了文章的渐进性,我将把开发过程一步步的写出来,用来记录。
本实验代码用到的图形学关系和算法列举如下:

基本计算机图形学关系和算法

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
关注上海,封何时止?

上一个今天做出的复原图,证明我确实是在写代码。

七巧板复原算法——计算机图形学基本算法之一, 点在多边形内部的判断相关推荐

  1. 七巧板复原算法——计算机图形学基本算法之二,线段相交判断

    判断线段相交,朴素的方法(初中直线方程的判断方法),就是先计算两条直线的交点,然后再判断交点是否在其中一条的线段上.这也是笔者能唯一想到的方法,后来抱着试试看有没有更好方法的想法,搜了一下网络.哦, ...

  2. GIS地图界面和计算机图形学填充算法

    一 GIS地图界面 GIS程序最常见的界面就是,不同区域被边界隔开,填充为不同的颜色: 如下三个:是超图iServer自带: 京津地区土地利用现状,京津地区人口分布,京津地区地貌分布:用于学习是很好资 ...

  3. 计算机图形学算法详解,计算机图形学裁剪算法详解

    <计算机图形学裁剪算法详解>由会员分享,可在线阅读,更多相关<计算机图形学裁剪算法详解(10页珍藏版)>请在人人文库网上搜索. 1.裁剪算法详解在使用计算机处理图形信息时,计算 ...

  4. 计算机图形学常见算法原理,计算机图形学常用算法及代码大全

    <计算机图形学常用算法及代码大全>由会员分享,可在线阅读,更多相关<计算机图形学常用算法及代码大全(41页珍藏版)>请在人人文库网上搜索. 1.2.1.1 生成直线的DDA算法 ...

  5. 计算机图形学要学什么语言,计算机图形学:算法与实现

    计算机图形学:算法与实现 语音 编辑 锁定 讨论 上传视频 <计算机图形学:算法与实现>一书的出版社是清华大学出版社,出版时间是第1版 (2012年1月1日). 书    名 计算机图形学 ...

  6. 计算机图形学直线算法论文,《计算机图形学》中直线生成算法的教学心得

    摘要:<计算机图形学>是计算机科学与技术专业一门重要的专业课,其中直线生成算法是教学重点之一.该文通过分析几种直线生成算法的特点,阐述了理论教学和实践教学的重点和难点,总结了教学的体会和心 ...

  7. 计算机图形学 裁剪算法源代码,OpenGL计算机图形学梁友栋裁剪算法实验代码及运行结果.doc...

    OpenGL计算机图形学梁友栋裁剪算法实验代码及运行结果.doc (10页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 14.9 积分  .<计算 ...

  8. 计算机图形学椭圆_椭圆算法| 计算机图形学

    计算机图形学椭圆 椭圆的性质 (Properties of ellipse) Ellipse is defined as the locus of a point in a plane which m ...

  9. 计算机图形学+简单算法实现,《计算机图形学》课程设计-简单几何体的消隐算法实现.doc...

    PAGE PAGE 18 PAGE 18 课程名称:<计算机图形学> 论文题目:简单几何体的消隐算法实现 教学部: 年 级: 班 级: 学 号: 姓 名: 简单几何体的消隐算法实现 摘 要 ...

最新文章

  1. 17综合案例之淘宝轮播图布局
  2. Win2003利用dfs(分布式文件系统)在负载均衡下的文件同步配置方案
  3. oracle DBA 常用表和视图
  4. 「PKUWC2018」Minimax
  5. golang中的collection
  6. Python 编程快速上手 第十五章 保持时间,计划任务和启动程序
  7. linux将bridge当做hub来用
  8. python_day10_并发编程
  9. JVM内存模型和类加载运行机制
  10. 思科 IP 电话被指包含严重的 RCE 缺陷
  11. GarsiaWachs算法:石子归并问题
  12. struts标签的使用
  13. OBS 电脑推流直播指南
  14. HTML5前端开发实战01-学生信息表
  15. Arduino 寻找IIC设备地址的代码
  16. python k线斜率计算公式_浅析K线上涨斜率
  17. python中.item()的讲解
  18. 判断质数、分解质因数
  19. 用SDK包开发K66FX18学习笔记(1)
  20. ocr文字识别软件:Readiris Corporate 17 Mac中文版

热门文章

  1. 修改系统默认安装软件的位置
  2. 【转】总结:2015这一年App Store审核指南都有哪些变化
  3. JavaScript前端中的伪类元素before和after使用详解
  4. xmind文件在线查看,编辑,保存,读取
  5. hog matlab,matlab hog+svm代码
  6. 什么是大数据,常见的大数据应用领域?
  7. 捣蛋导弹系统(狗头)
  8. 计算机在线给手机杀毒,如何用电脑给手机杀毒
  9. 深度分析《星际争霸2》
  10. 视听语言-8镜头创作的类型