多边形电子围栏算法

     在日常生活工作中,我们经常接触到电子围栏,大部分的电子围栏基本上都是圆形的,想要知道某一个点是否在圆形区域内,算法很简单,只需要知道这个圆形区域的圆心坐标和被测点的坐标的距离是否小于半径即可。两点的距离小于半径,说明被测点在圆形区域内,反之则在圆形区域外。那如果围栏的区域形状不是圆形,而是一个不规则的多边形呢,那我们怎么知道被测点是否在多边形区域内。其实很简单,整体思想如下:

    从目标被测点引发一条竖直向上的射线,看这条射线和多边形所有线段的交点数目。如果有奇数个交点,则说明目标点在多边形内部,如果有偶数个交点,则说明目标点在多边形外部。此思路在特殊处理后适用于凸多边形,凹多边形,不规则多边形。但有几个特殊的情况需要处理。

1 当射线与线段的左边顶点相交时,我们认为射线与线段相交。当射线与线段的右边顶点相交时,我们认为射线与线段不相交。如下图所示:

2 当有竖直向上的线段时,我们认为该线段不与射线相交(包括射线和线段重叠的情况)。如:

示列代码如下:

#include <stdio.h>
#include <math.h>struct Point_t{
double x_value;
double y_value;
};//给定坐标围成多边形
struct Point_t p_tab[4]={
{10.0, 20.0}, //第0个点
{20.0, 30.0},
{30.0, 20.0},
{20.0, 10.0},
};//被测点的坐标
struct Point_t testaaa = {
.x_value = 21.0,
.y_value = 19.0,
};int equal(double a, double b)
{if((fabs(a-b)) <= (1E-6)){return 1;}return 0;
}int Polygon_fence_check(struct Point_t Test, struct Point_t *refer, int point_num)
{int i;int next_i;int crossings_count = 0;double slope;unsigned char cond;if(refer = NULL){return -1;
}for(i = 0; i < point_num; i++){if((i+1)>= point_num){next_i = 0;}else{next_i = i+1;}//线段的横坐标一样,表示线段竖直。这种情况,我们认为被测点引发的竖直射线不会和此类线段相、交。包括射线和线段重叠。if(equal(refer[i].x_value, refer[next_i].x_value) == 1){	   	   printf("point %d and point %d x_value is same\r\n", i, next_i);continue;		       }cond = 0;//判断被测点的横坐标是否在某线段两顶点的横坐标区间内。注意:当线段左边顶点的横坐标与被测点的横坐标一样时,我们以为//被测点的横坐标在线段两顶点的横坐标区间内;当线段右边顶点的横坐标与被测点的横坐标一样时,我们以为被测点的横//坐标在线段两顶点的横坐标区间外。if(((refer[i].x_value <= Test.x_value)&&(Test.x_value < refer[next_i].x_value))||((refer[next_i].x_value <= Test.x_value)&&(Test.x_value < refer[i].x_value))){cond = 0x01;}if(cond == 0x01){   //当被测点的横坐标在两顶点的横坐标区间内时,计算线段上对应被测点横坐标的纵坐标。当这个纵坐标大于被测点的纵坐标时,//我们以为射线与线段相交。slope = (refer[next_i].y_value - refer[i].y_value)/(refer[next_i].x_value - refer[i].x_value);if(Test.y_value < (slope*(Test.x_value - refer[i].x_value)+refer[i].y_value)){printf("crossing line num = %d\r\n", i);crossings_count++;	  }}}printf("crossings count = %d\r\n",crossings_count);return ((crossings_count%2) != 0);
}int main(void)
{int flag;flag = Polygon_fence_check(testaaa, p_tab, 4);printf("flag = %d\r\n", flag);return 0;
}

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

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

相关文章

柯桥学日语J.TEST考试是什么?J.TEST考试报名

J.TEST考试是什么&#xff1f; J.TEST全称为实用日本语鉴定考试&#xff0c;在2007年获得了国家劳动和社会保障部的认可&#xff0c;作为面对母语为非日本语的人员进行的日本语能力测试&#xff0c;J.TEST被越来越多的日本企业所认可&#xff0c;由于其对日语的实际运用能力具有…

谈谈ssh-keygen进行多host配置及使用

背景 传统的Telnet、FTP协议都是使用明文传输数据&#xff0c;存在一定的安全风险&#xff0c;如果传输数据被截取&#xff0c;可能造成数据泄露风险&#xff0c;尤其对于敏感数据&#xff0c;泄露造成的损失无法估计。最近公司、github等平台都不再支持http方式进行代码下载工…

谷粒商城-高级篇-认证服务

1、环境搭建 1、创建gulimall-auth-server模块 2、导入依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schem…

独显装完ubuntu后启动黑屏显示/dev/sda:clean files blocks的解决方案

解决方案如下&#xff1a; 选中Ubuntu按E键 在编辑界面倒数第2行的linux那行&#xff08;后面有quiet splash选项&#xff09;的最后添加nomodeset 然后按F10保存重启 然后管理员权限打开/etc/modprobe.d/blacklist.conf&#xff0c;在文件末尾添加&#xff1a; blacklist…

ArcGIS 地理信息系统 任意文件读取漏洞复现

0x01 产品简介 ArcGIS是由美国Esri公司研发的地理信息系统(GIS)软件,它整合了数据库、软件工程、人工智能、网络技术、云计算等主流的IT技术,旨在为用户提供一套完整的、开放的企业级GIS解决方案,它包含了一套带有用户界面组件的Windows桌面应用。可以实现从简单到复杂的…

Linux 系统结构

Linux系统一般有4个主要部分&#xff1a;内核、shell、文件系统和应用程序。内核、shell和文件系统一起形成了基本的操作系统结构&#xff0c;它们使得用户可以运行程序、管理文件并使用系统。 1. linux内核 内核是操作系统的核心&#xff0c;具有很多最基本功能&#xff0c;它…

SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder”

SLF4J常见问题 1、SLF4J简介2、SLF4J实现原理3、SLF4J常见问题 1、SLF4J简介 SLF4J&#xff08;Simple Logging Facade for Java&#xff09;是一个为Java程序提供日志输出的统一接口&#xff0c;并不具备具体的日志实现方案&#xff0c;类似JDBC&#xff0c;SLF4J只做两件事&a…

使用ThorUi

摘要&#xff1a; 官网 今天遇到一个老项目&#xff0c;使用的是ThorUi组件库&#xff01;之前没有用过这组件库&#xff0c;所以记录一下不同框架是使用情况&#xff01; ThorUI 是一个基于 Thorium 的 UI 框架&#xff0c;用于构建跨平台的桌面应用程序。如果你打算使用 Thor…

OceanBase中,如何解读 obdiag 收集的火焰图 【DBA早下班系列】

1. 前言 在之前的文章 遇到性能问题&#xff0c;如何给OceanBase“拍CT“&#xff08;火焰图与扁鹊图&#xff09;中&#xff0c;分享了obdiag 快速收集火焰图的方法&#xff0c;那么&#xff0c;紧接着的问题便是&#xff1a;收集到火焰图和扁鹊图之后&#xff0c;该如何解读…

Day41 | 动态规划 :完全背包应用 完全平方数单词拆分(类比爬楼梯)

Day41 | 动态规划 &#xff1a;完全背包应用 完全平方数&&单词拆分&#xff08;类比爬楼梯&#xff09; 动态规划应该如何学习&#xff1f;-CSDN博客 01背包模板 | 学习总结-CSDN博客 完全背包模板总结-CSDN博客 难点&#xff1a; 代码都不难写&#xff0c;如何想…

《 C++ 修炼全景指南:十九 》想懂数据库?深入 B 树的世界,揭示高效存储背后的逻辑

摘要 本文深入探讨了 B 树的原理、操作、性能优化及其实际应用。B 树作为一种平衡多路树结构&#xff0c;因其高效的查找、插入和删除操作广泛应用于数据库与文件系统中。文章首先介绍了 B 树的定义与性质&#xff0c;并详细阐述了节点分裂、合并等核心操作的实现方法。接着&a…

选择小练习

条件语句 if 条件语句&#xff0c;也叫作选择语句、判断语句。根绝特定条件判断是否成立&#xff0c;执行不同的语句段。简单来说&#xff0c;满足条件执行&#xff0c;不满足不执行。 条件语句是使用关键字 if 做判断&#xff0c;根据不同情况结合不同的关键字else 或者 eli…

单片机串口接收状态机STM32

单片机串口接收状态机stm32 前言 项目的芯片stm32转国产&#xff0c;国产芯片的串口DMA接收功能测试不通过&#xff0c;所以要由原本很容易配置的串口空闲中断触发DMA接收数据的方式转为串口逐字节接收的状态机接收数据 两种方式各有优劣&#xff0c;不过我的芯片已经主频跑…

BAAI 的 Aquila-VL-2B-llava-qwen: 促进视觉语言理解

简介 在人工智能领域&#xff0c;北京人工智能学会&#xff08;BAAI&#xff09;做出了重要贡献&#xff1a; 在人工智能领域&#xff0c;北京人工智能研究所&#xff08;BAAI&#xff09;开发的 Aquila-VL-2B-llava-qwen 模型做出了重大贡献。这一创新模型建立在 LLava-one-v…

测试实项中的偶必现难测bug--短信触发H5拒绝行为

问题描述: 企业邀请其他人加入团队,发送邀请短信给对方,对方通过短信链接跳转到H5页面,输入手机后,点击发送验证码,前提是短信通知验证弹窗需要打开,收到短信验证码后,点击一键代入,会触发拒绝加入行为。 需求: 由于我们的邀请链接是一次性的,一旦有用户确认加入或…

MCU的OTA升级(未完-持续更新)

1.术语 ISP : In-System Programming 在系统编程&#xff0c;是一种通过MCU&#xff08;微控制器单元&#xff09;上的内置引导程序&#xff08;BootLoader&#xff09;来实现对芯片内部存储器&#xff08;如Flash&#xff09;进行编程的技术。 华大目前对应的ISP IAP&…

即将盛大启幕“2025南京软件产业博览会·南京软博会”

在今年的南京软博会上&#xff0c;科技创新的浪潮再次席卷了整个会展现场&#xff0c;来自全球的软件产业精英们汇聚一堂&#xff0c;共同见证了软件产业的最新成果与未来趋势。随着云计算、大数据、人工智能等新兴技术的蓬勃发展&#xff0c;软件产业正站在一个前所未有的历史…

npm : 无法加载文件 C:\Program Files\nodejs\npm.ps1,因为在此系统上禁止运行脚本。

npm : 无法加载文件 C:\Program Files\nodejs\npm.ps1&#xff0c;因为在此系统上禁止运行脚本。有关详细信息&#xff0c;请参阅 https:/go.microsoft.com/fwlink/?LinkID135170 中的 about_Exe cution_Policies。 所在位置 行:1 字符: 1 npm install ~~~ CategoryInf…

网管平台(进阶篇):如何正确的管理网络设备?

网络设备作为构建计算机网络的重要基石&#xff0c;扮演着数据传输、连接和管理的关键角色。从交换机、路由器到防火墙、网关&#xff0c;各类网络设备共同协作&#xff0c;形成了高效、稳定的网络系统。本文将详细介绍网络设备的种类&#xff0c;并探讨如何正确管理这些设备&a…

【Linux】【Vim】多文件编辑与分屏

多文件编辑 编辑另一个文件文件列表分屏vimdiff文件跳转 编辑另一个文件 除了为每一个要编辑的文件运行一次 Vim 之外&#xff0c;还可以在当前 Vim 中开始编辑另一个文件。 :edit foo.txtVim 会关闭当前正在编辑的文件打开指定的新文件进行编辑。如果当前文件还有未存盘的内容…