先给出结论

以点为端点,朝两侧发射射线(两根射线平行),如果任意一侧的交点个数为偶数个,那么这个点就不在几何体的内部,反之在几何体的内部。

以上图为例,红色的点为需要判断的点,射线组合p,n,q都是合法的检测线(图上的p,n,q代表的是同时两侧的射线,同时我们称图中字母所在的一侧为正,例:p正射线)

采用p,n,q甚至任意两根平行射线,这个条件都是满足的。(上图中p,n,q和边缘的交点个数都为1,所以在几何体内部)

还有几种特殊情况需要处理如下图

如上图,共有五种情况,五种情况的特点如下

1. 五种情况都有一个共同点,射线穿过了线段的端点。

2.与射线平行的线段不参与讨论。

3. (4)(5),可视为同一种情况,都处于射线的同一侧,同时经过一个平行于射线的线段。

4. (4)(5)忽略平行线,可视为与(2)一样的情况,有两根线段处于射线的同一侧。

5. 同上理,(3) 可视为(1)一样的情况,有两根线段,且两根线段分别处理射线的一侧。

结论:

(1)如果射线穿过了端点,则寻找这个端点的上下各一根,且不与射线平行的线段。

(2)如果这两根线段的同时处于射线一端,那么数量+2,反之两根线段分别处于线段的一侧,那么数量+1。(如何判断一个线段在另外一个线段的那一侧)

注意事项:

(1)选用的射线,最好使用Y轴或者X轴方向的射线,原因在于选用这根射线的时候,计算量非常少,假设线段由A,B点构成,测试点P,选用Y轴方向的射线判断,判断相交只需要判断P.x在没在A.x和B.x之间。如果在之间一定相交,然后利用P.x在A.x,B.x之间的百分比,可以求出交点的y值,最后,如果交点的y值大于P.y 则在一侧,小于P.y在另外一侧。

PS:

在特殊情况中我们得到了,如果这两根线段的同时处于射线一端,那么数量+2,反之两根线段分别处于线段的一侧,那么数量+1。

那是因为如果在同一侧,代表路径前进的方向已经掉头了,所以我们穿过了两个路径,如果分别在一侧,代表路径的方向还是没有回头,所以我们只是穿越了一个路径。

多线段几何图形—— 简单几何图形(判断一个点是否在图形的内部)相关推荐

  1. 6-1 判断一个点是否在一个圆的内部 (20 分)

    创建一个表示点的类Point,运用组合的方式创建圆形类. 圆形有个成员函数isPointIn用于判断一个点是否在该圆形的内部. 完成对应类代码,使得主函数可以正确运行. 注意类的数值型数据成员类型为浮 ...

  2. 判断一个点是否在多边形的内部(包括边)

    传说世上有一支丘比特的箭,凡是被这支箭射到的人,就会深深的爱上射箭的人.  世上无数人都曾经梦想得到这支箭.Lele当然也不例外.不过他想,在得到这支箭前,他总得先学会射箭.  日子一天天地过,Lel ...

  3. 如何判断一个点是否在空间三维物体内部

    从该点出发,作任意方向的一根射线, 考察此射线与三维物体各面的交点数, 如果总数=0或其它偶数,则在三维物体之外, 如果总数为奇,则在三维物体之内. 为了减少时间,如果点的位置很有可能在三维物体之外时 ...

  4. [转]如何判断一个点是否在一个多边形内部

    原文地址:http://hi.baidu.com/wayright/item/ad18e4c0c5446b2dee4665c9 在多边性的存储中,每一个多边形都是由一系列连续的点组成,例如保存为数组P ...

  5. java pnpoly算法_PNPoly算法代码例子,判断一个点是否在多边形里面

    写C语言的实验用到的一个算法,判断一个点是否在多边形的内部.C的代码如下: int pnpoly(int nvert, float *vertx, float *verty, float testx, ...

  6. Direct2D教程(三)简单几何图形

    从本章开始,我们介绍D2D几何图形. D2D图形分类 Direct2D支持多种类型的几何图形,包括 Simple Geometry(简单几何图形) 矩形 圆角矩形 椭圆 Path Geometry(路 ...

  7. Android中绘制简单几何图形和路径Path

    背景 我的博客:http://zhangsunyucong.top 马上就到2018年过年了,然后我又刚好有兴致,就来玩玩Android中的简单几何图形的绘制和使用Path类来绘制路径. Path和C ...

  8. java如何判断一个点在一条线段上

    第一步:数学思路思考: 首先肯定是要先证明该点是在一条直线上,我在上篇文章有介绍,可以去看一下,证明一个点在一条直线上,然后去想如何证明一个点在一条线段上,学数学的时候我们知道,如果一个点在一条线段上 ...

  9. java判断整数是奇数还是偶数_没那么简单:Java中应该怎样判断一个整数是偶数还是奇数...

    环境:jdk 1.7. 一般用模2运算判断一个整数是偶数还是奇数.但是对于奇数,不能简单的用x%2==1来判断,原因如下: package hellojava; public class HelloJ ...

  10. 简单几何图形的识别与标记(opencv)

    一.实现目标 手绘简单几何图形,拍照后处理可识别并标记图形相应关键点. 直线:识别并标记始末点 三角形:识别并标记三个角点 矩形:识别并标记四个角点 二.实现流程 通过Python与OpenCV进行编 ...

最新文章

  1. gcc-linux6.3,[环境配置]Ubuntu16.04下编译安装gcc6.3.0
  2. mapgis明码文件转为点线面文件_干货|MAPGIS的二十一个实用方法及技巧
  3. mysql 没有mysql库_MySQL安装之后没有MySQL数据库的原因
  4. 20080823-jsp中include指令与动作的不同
  5. IDEA 搭建 SpringBoot + Maven + Oracle + Hibernate 项目框架
  6. 若有下列共用体定义_危险品运输包装定义有哪些?你需要了解的在这里
  7. I/O复用模型之select学习
  8. L2-012 关于堆的判断(模拟堆+字符串处理)
  9. 【习题 6-5 UVA-1600】Patrol Robot
  10. Looking for pthread_create - not found
  11. [elixir! #0024] 引擎盖下, `Channel.push` 如何运作
  12. 3mx转osgb_OSGB格式的三维倾斜摄影文件转化成ARCGIS栅格文件
  13. iOS 自定义视频播放器
  14. C# Emoji在Web端显示
  15. C#实现压缩文件及解压文件
  16. 你做过哪些事情让你女朋友感动到哭,这个100%可以做到!
  17. OMAP3630_usb驱动
  18. 麒麟芯片配上鸿蒙系统有多快,麒麟芯片和鸿蒙系统靠边站,纯国产飞腾芯片和麒麟系统早已大规模使用...
  19. 【python】matplotlib.pyplot介绍
  20. 使命召唤8联机找不到服务器,使命召唤8怎么联机 使命召唤8联机方法简介

热门文章

  1. CAD.net二次开发之图层,文字样式,标注样式,标注封装,引线的封装
  2. 优麒麟使用教程第三期:Windows 平台 U 盘启动盘制作(建议收藏)
  3. O2O供应链系统架构设计
  4. python grpc基于流式传输实现长连接
  5. iOS - iOS6 越狱及必装源、软件
  6. redis mset是否具有原子性
  7. Android开发----MaterialDesign设计下material-dialogs用法
  8. 爬sobooks电子书并把电子书的信息记录到mysql中
  9. c4d渲染测试软件,C4D常用的4大主流渲染器
  10. 我的世界java追踪光影_探索MC的光线追踪 真实光影下的马赛克世界