判断一个点是否在一个多边形内部

1 原理

如下图所示, 四边形ABCD, P在四边形内部,Q在四边形外部。

在这里插入图片描述
通过观察可以发现, 当点在四边形内部时, 如果按顺时针方向的话, 点P在四条边AB, BC, CD, DA的右侧。 当然如果按逆时针的话, 点P在四条边的左侧。
点Q在AB,BC和CD的右侧, 但在DA的左侧。因此可以通过方向的一致性判断点是否位于多边形内部。

判断方向可以通过向量的叉积运算。

A B ⃗ \vec{AB} AB x A P ⃗ \vec{AP} AP , B C ⃗ \vec{BC} BC x B P ⃗ \vec{BP} BP , C D ⃗ \vec{CD} CD x C P ⃗ \vec{CP} CP , D A ⃗ \vec{DA} DA x D P ⃗ \vec{DP} DP 如果同方向, 那么P点就在多边形内部,否则就不在内部。

向量叉乘的结果是一个向量, 二维向量叉乘时, 结果向量的方向垂直于这2个向量。
其实不必要求是顺时针方向, 逆时针也可以, 逆时针顺序时4个向量叉积就都是小于0了。 因此只要4个向量叉乘是同时为正, 或同时为负就行。

2 向量叉积

假设有2个向量 a ⃗ = ( x 1 , y 1 ) \vec{a}=(x_1, y_1) a =(x1,y1), b ⃗ = ( x 2 , y 2 ) \vec{b}=(x_2,y_2) b =(x2,y2), a ⃗ \vec{a} a b ⃗ \vec{b} b 的叉积是一个向量,方向垂直于 a ⃗ \vec{a} a b ⃗ \vec{b} b 所在的平面, 遵循右手法则。

a ⃗ \vec{a} a x b ⃗ \vec{b} b = 0 i ⃗ + 0 j ⃗ + ( x 1 y 2 − x 2 y 1 ) k ⃗ 0\vec{i}+0\vec{j}+(x_1y_2-x_2y_1)\vec{k} 0i +0j +(x1y2x2y1)k

在这里插入图片描述

3 一些思考

其实最开始观察时, 发现了另外一个规律仿佛也奏效, 那就是 A B ⃗ \vec{AB} AB A P ⃗ \vec{AP} AP , B C ⃗ \vec{BC} BC B P ⃗ \vec{BP} BP , C D ⃗ \vec{CD} CD C P ⃗ \vec{CP} CP , D A ⃗ \vec{DA} DA D P ⃗ \vec{DP} DP 夹角都是小于90度的, 对Q点对应的向量夹角, 有些是小于90度, 有些是大于90度的, 那么通过向量的内积也可以判断。其实这个规律不是普世的, 可以举出反例, P点在多边形内部时, 也会出现同时有大于90度和小于90度的角。
如下图所示:
在这里插入图片描述
D A ⃗ \vec{DA} DA D P ⃗ \vec{DP} DP 夹角是大于90度的, 而其他向量夹角是小于90度的。

上面的判断方法(指的是根据向量外积), 只适用于任意的凸多边形, 对非凸多边形是不适用的。
在这里插入图片描述
如上图所示, 对于非凸多边形, C D ⃗ \vec{CD} CD x C P ⃗ \vec{CP} CP 的方向与其他向量就不同。

4 代码实现

import numpy as npdef isPointInArea(point, area):""":param point: [x,y]:param area: [[x1,y1],[x2,y2],[x3,y3],...]:return: if point is in area, return True, else False"""area_point_num = len(area)if area_point_num < 3:raise ValueError(f"the point number of the area must >=3, but get {area_point_num}")area.append(area[0])area = np.asarray(area)orientations = []xp, yp = point[0], point[1]for index in range(area_point_num):a = area[index + 1] - area[index]b = (xp - area[index, 0], yp - area[index, 1])ori = a[0] * b[1] - b[0] * a[1]orientations.append(ori)orientations = np.asarray(orientations)flags = orientations > 0if flags.sum() == area_point_num or flags.sum() == 0:return Trueelse:return Falseif __name__ == "__main__":point = [0.5, 1.5]area = [[0, 0], [0, 2], [2, 2], [2, 0]]flag = isPointInArea(point, area)print(flag)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/125152.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows10上使用llama-recipes(LoRA)来对llama-2-7b做fine-tune

刚刚在Windows10上搭建环境来对llama2做finetune&#xff0c;里面坑还是挺多的&#xff0c;这里把印象中的坑整理了一下以作备忘。 llama-recipes是meta的开源项目&#xff0c;Github地址为&#xff1a;GitHub - facebookresearch/llama-recipes: Examples and recipes for Ll…

C# OpenCvSharp 通道分离

效果 项目 代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using OpenCvSharp; using OpenCvSharp.Extensions;namespac…

CSS 学习指导

CSS&#xff08;Cascading Style Sheets&#xff09;是一种用于定义网页样式的标记语言。以下是一些基本的CSS知识&#xff0c;可以作为入门教程&#xff1a; CSS语法包括选择器、属性和值。选择器用于选择要样式化的元素&#xff0c;属性是要修改的属性&#xff08;例如&…

基于Matlab分析的电力系统可视化研究

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

SpringBoot 集成 Canal 实现监听MySQL表数据

SpringBoot 集成 Canal 准备工作什么是 CanalCanal 在 Spring Boot 中的作用和优势准备工作安装和配置 MySQL 数据库 安装Canal项目集成导入依赖添加配置信息创建监听类测试 准备工作 什么是 Canal Canal 是阿里巴巴开源的基于数据库增量日志解析的数据同步和订阅组件&#x…

Java 日志技术

所以说&#xff0c;要学Logback&#xff01; 配置文件 Logback提供了一个核心配置文件logback.xml&#xff0c;日志框架在记录日志时会读取配置文件中的配置信息&#xff0c;从而记录日志的形式。 可以配置日志输出的位置是文件还是控制台可以配置日志输出的格式还可以配置日…

PHP对接阿里云虚拟号的实现(号码隐私保护)

fastadmin 封装框架 实现功能&#xff1a;AXN隐私号绑定、解绑&#xff1b; 场景&#xff1a;为店铺手机号开通虚拟号&#xff0c;用户联系店铺展示虚拟号码&#xff1b; 官方开放文档地址&#xff1a;https://help.aliyun.com/document_detail/59655.html?spma2c4g.111742…

闪存芯片的冷知识

闪存芯片不带电存储数据的原理 闪存芯片是一种非易失性的存储器&#xff0c;即它可以在断电后保持数据不丢失。闪存芯片的核心部分是浮栅晶体管&#xff08;Floating Gate Transistor&#xff09;&#xff0c;它是一种特殊的MOSFET&#xff08;金属氧化物半导体场效应晶体管&a…

深度学习环境搭建笔记(二):mmdetection-CPU安装和训练

文章目录 第一步&#xff1a;安装anaconda第二步&#xff1a;安装虚拟环境第三步&#xff1a;安装torch和torchvision第四步: 安装mmcv-full第五步: 安装mmdetection第六步&#xff1a;测试环境第七步&#xff1a;训练-目标检测7.1 准备数据集7.2 检查数据集7.3 训练网络 第一步…

微服务[Nacos]

CAP 1&#xff09;一致性(Consistency) (所有节点在同一时间具有相同的数据) 2&#xff09;可用性(Availability)(保证每个请求不管成功或者失败都有响应) 3&#xff09;分区容错(Partition tolerance)(系统中任意信息的丢失或失败不会影响系统的继续运作) 一、虚拟机镜像准备 …

Tomcat 安装

1.关闭防火墙 2.安装JDK包 3. 4。添加环境变量 5.刷新配置文件 6.解压文件 7.启动tomcat 8. 9.编写tomcat.service文件 vim /etc/systemd/system/tomcat.service 10.刷新服务 11.打开浏览器访问&#xff1a;192.168.2.100:8080/&#xff0c;正常可以看到以下界面

Web3.0时代什么时候到来,Web3.0有什么机会?

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;CSDN领军人物&#xff0c;全栈领域优质创作者✌&#xff0c;CSDN博客专家&#xff0c;阿里云社区专家博主&#xff0c;2023年6月CSDN上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师…

cookies 设置过期时间

1.如何在浏览器中查看cookie过期时间 F12-Application-Cookies可以查看到网页所有设置cookie值&#xff0c; 如果设置了过期时间的cookie是可以看到过期时间的持久cookie&#xff08;persistent cookie&#xff09;&#xff0c; 没有设置过期时间的是会话cookie&#xff08;s…

智安网络|面临日益增长的安全威胁:云安全和零信任架构的重要性

随着云计算技术的快速发展和广泛应用&#xff0c;云安全和零信任架构变得愈发重要。在数字化时代&#xff0c;云计算技术得到了广泛的应用和推广。企业和组织借助云服务提供商的强大能力&#xff0c;实现了高效、灵活和可扩展的IT基础设施。然而&#xff0c;随着云环境的快速发…

继承和组合

C中&#xff0c;继承和组合是面向对象编程中的两种重要的代码复用方式。 继承is-a 通常用于描述父子的关系&#xff0c;比如植物-花。 组合has-a通常用于描述整体与部分的关系&#xff0c;比如一个汽车由引擎、轮胎等部件组成。 下面是一个简单的示例来说明继承和组合的使用…

OceanBase 4.1解读:读写兼备的DBLink让数据共享“零距离”

梁长青&#xff0c;OceanBase 高级研发工程师&#xff0c;从事 SQL 执行引擎相关工作&#xff0c;目前主要负责 DBLink、单机引擎优化等方面工作。 沈大川&#xff0c;OceanBase 高级研发工程师&#xff0c;从事 SQL 执行引擎相关工作&#xff0c;曾参与 TPC-H 项目攻坚&#x…

Windows安装单节点Zookeeper

刚学习Dubbo&#xff0c;在Centos7中docker安装的zookeeper3.7.1。然后在启动provider时一直报错&#xff0c;用尽办法也没有解决。然后zookeeper相关的知识虽然以前学习过&#xff0c;但是已经忘记的差不多了。现在学习dubbo只能先降低版本使用了&#xff0c;之后再复习zookee…

2023年高教社杯数学建模国赛C题详细版思路

C 题 蔬菜类商品的自动定价与补货决策 2023年国赛如期而至&#xff0c;为了方便大家尽快确定选题&#xff0c;这里将对C题进行解题思路说明&#xff0c;以分析C题的主要难点、出题思路以及选择之后可能遇到的难点进行说明&#xff0c;方便大家尽快找到C题的解题思路。 难度排…

Notepad++ 的安装及配置

由于电脑重装了Win11系统&#xff0c;干脆重头开始&#xff0c;重新安装每一个软件~~~ 很多博客或者博主都会推荐notepad的官网&#xff1a;https://notepad-plus-plus.org/ 但大家亲自点开就会发现是无响应&#xff0c;如下图 同时&#xff0c;也会有很多博主直接给网盘地址…

微信分账报错1908(请求中含有未在API文档中定义的参数)

开发指引-分账 | 微信支付合作伙伴平台文档中心 问题描述&#xff1a;根据微信分账文档&#xff0c;在下单接口添加是否分账参数后&#xff0c;报错如下 Client error: POST https://api.mch.weixin.qq.com/v3/pay/partner/transactions/jsapi 400 Bad Request {"code…