【C/C++学习笔记】判断一个点是否在多边形内部的例子

2024-04-14 06:18

本文主要是介绍【C/C++学习笔记】判断一个点是否在多边形内部的例子,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 一、多边形电子围栏
    • 二、实现代码

一、多边形电子围栏

在绘制电子围栏时,会有各种各样的围栏形状,如何判断GPS的点在不在多边形内部呢?
图示如下:

图示

二、实现代码

/* 原理: 将测试点的Y坐标与多边形的每一个点进行比较,
**		 会得到测试点所在的行与多边形边的所有交点。
**		 如果测试点的两边点的个数都是奇数个,
**		 则该测试点在多边形内,否则在多边形外。 */#include <stdio.h>/* 函数功能: 判断点(x, y)是否在有ploy_sides个顶点的多边形内 */
/* 参数: poly_sides	测试多边形的顶点数
**		 poly_x	测试多边形的各个顶点的X轴坐标
**		 poly_y	测试多边形的各个顶点的Y轴坐标
**		 x	测试点的X轴坐标
**		 Y 	测试点的Y轴坐标 */
/* 返回值: 返回0 表示不在多边形内部,返回1 表示在多边形内部 */
/* 说明: 在多边形各边上的点默认不在多边形内部 */
int inOrNot(int poly_sides, float *poly_X, float *poly_Y, float x, float y) 
{int i, j;j = poly_sides-1;int res = 0;for (i = 0; i<poly_sides; i++) {if((poly_Y[i]<y && poly_Y[j]>=y || poly_Y[j]<y && poly_Y[i]>=y) && (poly_X[i]<=x || poly_X[j]<=x)){res ^= ((poly_X[i] + (y-poly_Y[i])/(poly_Y[j]-poly_Y[i])*(poly_X[j]-poly_X[i])) < x);}j=i;}return res; 
}int main(void)
{int poly_sides = 5;					// 多边形顶点数float poly_X[5] = {1, 1, 3, 4, 3};	// 多边形各顶点的X轴坐标float poly_Y[5] = {1, 2, 3, 2, 1};	// 多边形各顶点的Y轴坐标float x = 399;						// 测试点的X轴坐标float y = 2; 						// 测试点的Y轴坐标int ret;ret = inOrNot(poly_sides, poly_X, poly_Y, x, y);if(1 == ret){printf("the point (%f, %f), in the poly\n", x, y);}else{printf("the point (%f, %f), not in the poly\n", x, y);}return 0;
}

—— 2018-11-29 ——

这篇关于【C/C++学习笔记】判断一个点是否在多边形内部的例子的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/902290

相关文章

利用c++判断水仙花数并输出示例代码

《利用c++判断水仙花数并输出示例代码》水仙花数是指一个三位数,其各位数字的立方和恰好等于该数本身,:本文主要介绍利用c++判断水仙花数并输出的相关资料,文中通过代码介绍的非常详细,需要的朋友可以... 以下是使用C++实现的相同逻辑代码:#include <IOStream>#include <vec

基于C++的UDP网络通信系统设计与实现详解

《基于C++的UDP网络通信系统设计与实现详解》在网络编程领域,UDP作为一种无连接的传输层协议,以其高效、低延迟的特性在实时性要求高的应用场景中占据重要地位,下面我们就来看看如何从零开始构建一个完整... 目录前言一、UDP服务器UdpServer.hpp1.1 基本框架设计1.2 初始化函数Init详解

C++ 右值引用(rvalue references)与移动语义(move semantics)深度解析

《C++右值引用(rvaluereferences)与移动语义(movesemantics)深度解析》文章主要介绍了C++右值引用和移动语义的设计动机、基本概念、实现方式以及在实际编程中的应用,... 目录一、右值引用(rvalue references)与移动语义(move semantics)设计动机1

检查 Nginx 是否启动的几种方法

《检查Nginx是否启动的几种方法》本文主要介绍了检查Nginx是否启动的几种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录1. 使用 systemctl 命令(推荐)2. 使用 service 命令3. 检查进程是否存在4

C++ move 的作用详解及陷阱最佳实践

《C++move的作用详解及陷阱最佳实践》文章详细介绍了C++中的`std::move`函数的作用,包括为什么需要它、它的本质、典型使用场景、以及一些常见陷阱和最佳实践,感兴趣的朋友跟随小编一起看... 目录C++ move 的作用详解一、一句话总结二、为什么需要 move?C++98/03 的痛点⚡C++

详解C++ 存储二进制数据容器的几种方法

《详解C++存储二进制数据容器的几种方法》本文主要介绍了详解C++存储二进制数据容器,包括std::vector、std::array、std::string、std::bitset和std::ve... 目录1.std::vector<uint8_t>(最常用)特点:适用场景:示例:2.std::arra

C++构造函数中explicit详解

《C++构造函数中explicit详解》explicit关键字用于修饰单参数构造函数或可以看作单参数的构造函数,阻止编译器进行隐式类型转换或拷贝初始化,本文就来介绍explicit的使用,感兴趣的可以... 目录1. 什么是explicit2. 隐式转换的问题3.explicit的使用示例基本用法多参数构造

C++,C#,Rust,Go,Java,Python,JavaScript的性能对比全面讲解

《C++,C#,Rust,Go,Java,Python,JavaScript的性能对比全面讲解》:本文主要介绍C++,C#,Rust,Go,Java,Python,JavaScript性能对比全面... 目录编程语言性能对比、核心优势与最佳使用场景性能对比表格C++C#RustGoJavapythonjav

C++打印 vector的几种方法小结

《C++打印vector的几种方法小结》本文介绍了C++中遍历vector的几种方法,包括使用迭代器、auto关键字、typedef、计数器以及C++11引入的范围基础循环,具有一定的参考价值,感兴... 目录1. 使用迭代器2. 使用 auto (C++11) / typedef / type alias

C++ scoped_ptr 和 unique_ptr对比分析

《C++scoped_ptr和unique_ptr对比分析》本文介绍了C++中的`scoped_ptr`和`unique_ptr`,详细比较了它们的特性、使用场景以及现代C++推荐的使用`uni... 目录1. scoped_ptr基本特性主要特点2. unique_ptr基本用法3. 主要区别对比4. u