首页 > 其他分享 >判断点在封闭多边形内部

判断点在封闭多边形内部

时间:2024-03-01 18:33:05浏览次数:21  
标签:origin 判断 多边形 double 封闭 射线 Line 向量

判断点在一个面域的内部

前言

作者在学习工作中,经常需要和几何相关内容打交道,因此分享自己在编程过程中遇到的一些问题和解决方法,也十分欢迎各位私信与我交流,另外如有不懂得地方也可以找我,在下会积极回复。

问题分析

通常来说,人眼能一眼就看出一个点是否处于面内,但是如何让计算机知道呢?

奇偶判断法

通过待判断点向任意方向发射一条射线,射线与面域相交的交点个数若为奇数,则判断该点在内部,反之则在外部。

相交判断

那么另一个问题来了,如何判断射线和一条直线是否相交呢

1.直线两端点应在射线两侧


如上图,第一步应保证端点a,b分别在射线两侧,而判断点在线的方位,常用叉积的办法。这可以通过分别计算向量a、b与射线方向向量的叉积,若两叉积异号则证明在两侧。

2.一条向量与射线向量在另一向量的同侧


通过第一步操作,我们能把射线区域限定在上述斜线区域,但是明显能观察到,只有在绿色区域才会与直线相交,因此我们需要继续增加约束,排除棕色区域。
例如上图绿色区域,向量b和射线向量都在向量a的下侧。

代码实现

C#

public static bool IsInterected(Point origin,Vector rayDirection,Line line)
{
    Point pointA = Line.FirstPoint;
    Point pointB = Line.LastPoint;
    //计算向量a,b
    Vector vectorA = pointA - origin;
    Vector vectorB = pointB - origin;
    //判断两端点在射线两侧
    double crossValueA = vectorA.crossProduct(rayDirection).Z;
    double crossValueB = vectorB.crossProduct(rayDirection).Z;
    if(crossValueA*crossValueB>0)
        return false;
    //判断B向量与射线向量是否在A向量的同侧
    double crossValueAB = vectorA.crossProduct(vectorB).Z;
    if(crossValueA*crossValueAB<0)
        return false;
    return true;
}
public static bool IsPointIn(Line[] face,Point point)
{
    //任取一个射线方向向量
    Vector rayDir = new Vector(1,1.21,0);
    //记录交点个数
    int intersectCount = 0;
    foreach(var item in face)
    {
        if(IsInterected)
            intersectCount++;

    }

    //奇偶判断
    if(intersectCount%2==0)
         return false;
    return true;
}

标签:origin,判断,多边形,double,封闭,射线,Line,向量
From: https://www.cnblogs.com/hardworkingR/p/18047708

相关文章

  • 小程序开发:app.vue检测更新时判断是否是朋友圈进入
    因为如果从朋友圈点进小程序来的,有些功能就用不了,所以需要判断下是否从朋友圈点进来的。检查代码如下:checkScene(){//判断场景值如果是从分享到朋友圈再打开就会有一些功能无法使用//详见https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/share......
  • 编码层判断帧类型H264
    由于靠起始码判断帧类型无法严谨区分I,P,B;所以需要到slice层去判断;以下是代码(转载)/*仅用于精准判断帧类型*//*----https://blog.csdn.net/zhuweigangzwg/article/details/44152239-----------*/#include<stdio.h>#include<stdlib.h>#include<string.h>//H264一帧数......
  • createRange表示文档中的一个范围——用于js判断文字添加省略号情况
    document.createRange()是JavaScript中的一个方法,用于创建一个Range对象,表示文档中的一个范围。Range对象通常用于选择文档中的一部分内容,然后对其进行操作。它可以:设置选中文本范围:可以使用document.createRange()方法创建一个Range对象,并使用setStart()和setEnd(......
  • 电脑系统判断函数
    系统判断函数不多讲,代码含注释voidwhichxitong(){ typedefvoid(__stdcall*NTPROC)(DWORD*,DWORD*,DWORD*); HINSTANCEhinst=LoadLibrary("ntdll.dll"); DWORDdwMajor,dwMinor,dwBuildNumber; NTPROCproc=(NTPROC)GetProcAddress(hinst,"RtlGetNtVersio......
  • 判断闰年
    解析两种方法来计算:如果这一年的三月前一天只有29天则为闰年,否则不是非闰年通过最经典的方法去计算:能被4整除的大多是闰年,但能被100整除而不能被400整除的年份不是闰年,如1900年是平年,2000年是闰年。使用datetime模块点击查看代码importdatetimeyears=int(......
  • 教你如何判断Java代码中异步操作是否完成
    本文分享自华为云社区《java代码实现异步返回结果如何判断异步执行完成》,作者:皮牙子抓饭。在许多应用程序中,我们经常使用异步操作来提高性能和响应度。在Java中,我们可以使用多线程或者异步任务来执行耗时操作,并且在后台处理过程完成后获取结果。但是,在使用异步操作时,我们通常需......
  • c#判断代码是否执行超时的几种方式
    c#判断代码是否执行超时的几种方式第一种,使用委托:第二种,使用Task:第三种,使用Timer:第四种,使用Thread:转载:https://blog.csdn.net/Learn_change_myself/article/details/105199967?utm_medium=distribute.pc_relevant_download.none-task-blog-baidujs-2.nonecase&depth_1-......
  • [几何算法]任意多边形求面积
    求任意平面多边形的面积通过鞋带定理,在已知多边形各顶点的情况下,可以快速计算出其面积问题分析设一个多边形顶点按逆时针或顺时针顺序为$$P_1(x_1,y_1),P_2(x_2,y_2),\ldots,P_n(x_n,y_n)$$,其中$$P_1=P_{n+1}$$(首尾相连形成闭合多边形)。根据鞋带定理,该多边形的......
  • CreateHolesInImage说明文档-对于遥感影像的空洞创建多边形矢量数据
    提取遥感影像的空洞地理处理工具箱特点:通用地理处理工具,支持任何遥感影像,包括无人机,卫星遥感,普通图片和gdb,mdb数据库等。速度快,极致效率,效率高,支持对多个文件夹下的任意多数据进行批处理使用简单,全自动话,无人工干预功能:提取空洞提取空洞和非空洞默认临时文件夹,结果文件夹默认临时......
  • 代码随想录 day58 判断子序列 不同的子序列
    判断子序列dp[i][j]表示以下标i-1为结尾的字符串s,和以下标j-1为结尾的字符串t,相同子序列的长度为dp[i][j]。if(s[i-1]==t[j-1])t中找到了一个字符在s中也出现了if(s[i-1]!=t[j-1])相当于t要删除元素,继续匹配不同的子序列dp[i][j]:以i-1为结尾的s子序列中......