C++ | 计算几何:判断点与多边形的关系

news2024/12/29 17:27:45

在屏幕坐标上有一个多边形,给定一个点,判断该点和多边形的关系。
例如在下图中,点A位于多边形内,点B位于多边形外,点C位于多边形上。

注意:
1.屏幕坐标系中,x轴从左往右为正方向,y轴从上到下为正方向,如示例中的坐标轴:
输入:
第一行为多边形数据,第一个数为整数,表示顶点个数,之后是顶点坐标,依次为各个点的x、y坐标的浮点数值。
例如 3 3.7 5 2 4 2.5 1.5 ,则表示有三个点组成的三角形。第二行表示待判断的点坐标,例如1.5 8.3

输出:
如果点在多边形内部,则返回0,如果在多边形上则返回1,如果在多边形外面则返回2

代码:

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
struct Point{
    double x;
    double y;
};
bool PointInPolygon2D(Point p, vector<Point>& Polygon){//判断点与多边形的关系
    int nPointNumber = Polygon.size();
    if (nPointNumber == 0)
        return false;
    int nSideNumber = nPointNumber;
    if (Polygon[0].x == Polygon[nPointNumber - 1].x && Polygon[0].y == Polygon[nPointNumber - 1].y)
        nSideNumber--;
    double epsilon = 0.000001;
    int nCross = 0;
    for (int i = 0; i < nSideNumber; i++){
        Point p1 = Polygon[i];
        Point p2 = Polygon[(i + 1) % nSideNumber];
        if (p1.y == p2.y)
            continue;
        if (p.y < min(p1.y, p2.y) || p.y >= max(p1.y, p2.y))
            continue; 
        double x = (double)(p.y - p1.y) * (double)(p2.x - p1.x) / (double)(p2.y - p1.y) + p1.x;
        if ((x - p.x) >= epsilon)
            nCross++;
    }
    if ((nCross % 2) == 1)
        return true;
    else
        return false;
}
bool isEqual(double a, double b) {//判断两个double是否相等
    return std::fabs(a - b) < 1e-6;
}
bool isPointOnSegment(Point A, Point B, Point C) {//判断点是否在线段上
    if ((C.x >= min(A.x, B.x) && C.x <= max(A.x, B.x)) &&(C.y >= min(A.y, B.y) && C.y <= max(A.y, B.y))) {
        double crossProduct = (B.y - A.y) * (C.x - A.x) - (B.x - A.x) * (C.y - A.y);
        if (isEqual(crossProduct, 0.0)) {
            return true;
        }
    }
    return false;
}
int main(){
    int n;
    double x, y;
    cin >> n;
    vector<Point> p(n);
    for(int i =0;i<n;i++){
        cin >> x >> y;
        p[i].x = x;
        p[i].y = y;
    }
    struct Point target;

    cin >> target.x >> target.y;
    for (int i = 0; i < n - 1;i++){
        if(isPointOnSegment(p[i],p[i+1],target)){
            cout << "1" << endl;
            return 0;
        }
    }
    if (PointInPolygon2D(target, p)){
        cout << "0" << endl;
        return 0;
    }
    else{
        cout << "2" << endl;
        return 0;
    }
    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

10分钟巩固多线程基础

10分钟巩固多线程基础 前言 多线程是并发编程的基础&#xff0c;本篇文章就来聊聊多线程 我们先聊聊概念&#xff0c;比如进程与线程&#xff0c;串行、并行与并发 再去聊聊线程的状态、优先级、同步、通信、终止等知识 进程与线程 什么是进程&#xff1f; 操作系统将资…

外汇天眼:假投资平台COINPAYEX非法吸金2158万,项目小组循线破获诈团据点

近年来加密货币投资愈来愈普及&#xff0c;许多人们开始关注并投入这个市场&#xff0c;期望能够获得高额报酬&#xff0c;甚至达到财务自由的目标。 但需要注意的是&#xff0c;市面上充斥各种黑平台&#xff0c;一不小心恐怕蒙受极大的损失。 9/12&#xff0c;警政署刑事警察…

c语言 - 实现每隔1秒向文件中写入当前系统时间

实现思路 主要是通过库函数和结构体获取当前系统时间&#xff08;年月日和时分秒&#xff09;保存到变量里&#xff0c;然后通过格式化输出函数将当前系统时间输出到文件中去。 但是需要注意的是题目要求每隔 1 s对系统时间进行输出&#xff0c;所以需要加入 sleep()函数进行调…

windows 环境变量设置

方法一&#xff1a;打开环境变量设置窗口&#xff08;或者cmd 执行sysdm.cpl命令&#xff09; 方法二&#xff1a; powershell执行如下命令&#xff0c;注意修改<要增加的环境变量值>值为要设置的环境变量值 [Environment]::SetEnvironmentVariable("PATH", $E…

2023最新团购社群小程序源码 社区商城小程序源码开源版 带完整后台+部署教程

随着互联网的不断发展&#xff0c;社群团购成为了一种新型的商业模式。在这种模式下&#xff0c;通过社群分享和团购折扣&#xff0c;消费者可以享受到更优惠的价格和更便捷的购物体验。给大家分享一个2023最新团购社群小程序源码&#xff0c;包含社区商城小程序源码开源版和完…

openGauss学习笔记-83 openGauss 数据库管理-内存优化表MOT管理-内存表特性-MOT使用内存和存储规划

文章目录 openGauss学习笔记-83 openGauss 数据库管理-内存优化表MOT管理-内存表特性-MOT使用内存和存储规划83.1 MOT内存规划83.2 存储IO83.3 容量需求 openGauss学习笔记-83 openGauss 数据库管理-内存优化表MOT管理-内存表特性-MOT使用内存和存储规划 本节描述了为满足特定…

No132.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

基于python的智慧城市社区服务平台及养老服务子系统的设计与实现

文章目录 导文摘要前言绪论课题背景国内外现状与趋势国内现状:国外现状:趋势:课题内容相关技术与方法介绍系统分析系统设计系统实现导文 基于python的智慧城市社区服务平台及养老服务子系统的设计与实现 摘要 本文基于Python开发了一款智慧城市社区服务平台及养老服务子系统…

ant-design-pro的可编辑表格editprotable的遇到的一些小问题

需求&#xff1a;1、使用可编辑表格实现对某一行表格的数据进行编辑&#xff0c;对输入内容控制必须低于同行某一数据 2、解决搜索数据和列名展示不同&#xff0c;和不可编辑的列不展示在搜索框 实现效果 解决搜索和readonly之间的问题 因为本次需求只要求修改一个数据&…

ElementPlus· tab切换/标签切换 + 分页

tab切换 ---> <el-tabs><el-tab-pane>... 分页 --------> <el-pagination> tab切换 // tab标签切换 // v-model双向绑定选项中的name&#xff0c;tab-change事件在 activeName改变时触发 <script setup> const tabChange (tab, event)>{…

【JAVA】飞机大战

代码和图片放在这个地址了&#xff1a; https://gitee.com/r77683962/fighting/tree/master 最新的代码运行&#xff0c;可以有两架飞机&#xff0c;分别通过WASD&#xff08;方向&#xff09;&#xff0c;F&#xff08;发子弹&#xff09;&#xff1b;上下左右&#xff08;控…

大型企业网如何部署NAT实现需求

1.企业中堕胎电脑如何共享上网&#xff1f; 2.NAT地址转换原理讲解&#xff1b; 3.企业机房如何用NAT让服务器更安全&#xff1f; - NAT - 网络地址转换 - 什么式网络地址 IP地址 -通信时候的设备标识 - 为什么要把IP地址做转换呢&#xff1f; -- 公网IP&#xff…

迷你无人车 Navigation 导航(5)— 基础框架学习

迷你无人车 Navigation 导航&#xff08;5&#xff09;— 基础框架学习 整个功能包整个功能包集合以move_base为核心&#xff0c;将里程计信息、传感器信息、定位信息、地图以及目标点输入给move_base&#xff0c;move_base经过规划后会输出速度指令 move_base包括三个关键部分…

如何像人类一样写HTML之第一个HTML、标签的关系与注释

文章目录 前言一、创建第一个HTML文档创建方式1创建方式2 二、标签的关系三、注释的使用总结 前言 在现代数字化社会中&#xff0c;网页是我们获取信息、与他人交流以及展示自己的重要工具之一。要了解如何创建网页&#xff0c;HTML&#xff08;Hypertext Markup Language&…

给网站引入各大搜索引擎的关键字提示,白给的接口薅他羊毛

属于是导航网站必要的了 因为网站是个导航网站&#xff0c;有一个搜索框&#xff0c;用户搜索时需要像百度一样有个搜索提示关键词列表。 之前只是用百度&#xff0c;现在给增加了好几个&#xff0c;想换那个就换那个了&#xff0c;直接上图片 可以配置属于是想选哪个选哪个&…

树莓派4B使用Docker部署SpringBoot项目——(二)使用docker安装mysql

树莓派4B使用docker安装mysql 使用的树莓派4B为8GB版本&#xff0c;使用docker pull命令拉取MySQL镜像&#xff1a; docker pull --platformarm64 mysql/mysql-server等待拉取完成 使用docker images查看镜像 创建MySQL容器 docker run -di --namemysql -p 3306:3306 -e MY…

(vue3)create-vue 组合式API

优势&#xff1a; 更易维护&#xff1a;组合式api&#xff0c;更好的TS支持 之前是选项式api&#xff0c;现在是组合式&#xff0c;把同功能的api集合式管理 复用功能封装成一整个函数 更快的速度 更小的体积 更优的数据响应式&#xff1a;Proxy create-vue 新的脚手架工…

批量剪辑视频的秘密武器,添加SRT字幕并提升你的视频品质,高效剪辑的艺术

在如今的数字时代&#xff0c;视频内容的制作和分享变得越来越普遍。如果你是一个视频创作者&#xff0c;或者经常需要编辑和分享视频内容&#xff0c;那么我们为你带来了一款视频批量剪辑工具&#xff0c;让你轻松在固定位置添加字幕&#xff0c;打造专业级剪辑效果&#xff0…

五金零售批发商城小程序的作用是什么

五金产品在人们生活中不可或缺&#xff0c;无论需求高低&#xff0c;总归会购买&#xff0c;而每个城市的五金店也非常多&#xff0c;市场高应用度也促进了各个品牌商们增长&#xff0c;而在实际销售中&#xff0c;无论厂家还是门店商家都会面临一些痛点&#xff0c;如品牌宣传…

Spine Web Player教程

官方文档教程&#xff1a; Spine Web Player 报错&#xff1a; 1、Q:报Animation bounds are invalid XX错误&#xff1f; A:请校对cdn或者npm install的版本号是否与json资源内版本号一致。