java判断点是否在多边形内(射线法)

embedded/2024/11/18 12:44:38/

1、我是使用的数组记录点的坐标,索引0为x坐标,1为y坐标

2、也可以使用结构体来记录点x,y,再用List管理点集合。

java">import java.util.Arrays;
import java.util.Objects;/*** @Author 宇颀休闲* @Date 2024/11/10 11:03* @Description*/public class PointInOrOuter {/*** 判断点是否在顶点上* @param boundaryPoints*/public static Boolean isVertex(double[][] boundaryPoints, double[] point){for (double[] boundaryPoint : boundaryPoints) {if (Objects.equals(boundaryPoint[0], point[0]) && Objects.equals(boundaryPoint[1], point[1])) {return true;}}return false;}/*** 用光影法解决点是否在多边形内的问题* @param boundaryPoints* @param point* @return*/public static Boolean isInside(double[][] boundaryPoints, double[] point) {//交点数量int crossCount = 0;//结果Boolean result = true;//精度double precision = 0.0000001;//1、如果测试点刚好在多边形的顶点,直接返回trueBoolean vertex = isVertex(boundaryPoints, point);if (vertex){System.out.println(Arrays.toString(point) + "在顶点上");return result;}double[] p1 = boundaryPoints[0];int length = boundaryPoints.length;for (int i = 1; i <= length; i++) {double[] p2 = boundaryPoints[i % length];//2、判断点是否在两个点的x坐标围成的区域内if (point[0] < Math.min(p1[0], p2[0]) || point[0] > Math.max(p1[0], p2[0])) {//不在区域内p1 = p2;continue;}if (point[0] > Math.min(p1[0], p2[0]) && point[0] < Math.max(p1[0], p2[0])) {//在区域内//提交的这里错了,应该是math.max,而不是math.minif (point[1] <= Math.max(p1[1], p2[1])) {//两点连成的线与y轴平行if (p1[0] == p2[0] && point[1] >= Math.min(p1[1], p2[1])) {//在线上return result;}//两点连成的线与x轴平行if (p1[1] == p2[1]) {if (point[1] == p1[1]) {//在线上return result;}else {//在矩形内部++crossCount;}}else {//计算交点double k = (p2[1] - p1[1]) / (p2[0] - p1[0]);//斜率double x0 = k * (point[0] - p1[0]) + point[1];//交点x坐标if (Math.abs(point[1] - x0) < precision) {//在线上return result;}if (point[1] < x0) {//在线内部++crossCount;}}}}else {//必定与其中一个点的x坐标相同if (point[0] == p2[0] && point[1] <= p2[1]) {//下一个点double[] p3 = boundaryPoints[(i + 1) % length];//在p1,p3之间if (point[0] >= Math.min(p1[0], p3[0]) && point[0] <= Math.max(p1[0], p3[0])) {++crossCount;}else {//不在内部crossCount += 2;}}}p1 = p2;}System.out.println(Arrays.toString(point) + ", crossCount = " + crossCount);//如果交点数量为奇数,则点在多边形内,否则在多边形外if (crossCount % 2 == 1) {result = true;} else {result = false;}return result;}public static void main(String[] args) {//多边形的各个坐标double[][] boundaryPoints = {{1, 1}, {3, 2}, {4, 2}, {4, 4}, {3, 3}};//测试坐标double[][] testPoints = {{2, 2}, {4, 3}, {4, 5}, {4, 2}, {3, 2.5}, {1, 2}, {2, 3}};//判断点是否在多边形内Boolean[] resultList = new Boolean[testPoints.length];for (int i = 0; i < testPoints.length; i++) {Boolean result = isInside(boundaryPoints, testPoints[i]);resultList[i] = result;}//打印结果System.out.println("resultList = " + Arrays.toString(resultList));
//下面是读取文件的例子,读取点坐标,再根据测试点判断
//        //多边形的各个坐标
//        JsonReader jsonReader = new JsonReader();
//        double[][] boundaryPoints = jsonReader.readJsonFile("latlon.json");
//        //测试坐标
//        double[][] testPoints = {{119.037089, 32.259867}, {118.821489, 32.077388}, {118.80657099, 32.0353893}, {118.894173, 32.077862}};
//        //判断点是否在多边形内
//        Boolean[] resultList = new Boolean[testPoints.length];
//        for (int i = 0; i < testPoints.length; i++) {
//            Boolean result = isInside(boundaryPoints, testPoints[i]);
//            resultList[i] = result;
//        }
//        //打印结果
//        System.out.println("\n\n最终结果=" + Arrays.toString(resultList));//        Integer a = 128;
//        Integer b = 128;
//        System.out.println(a.intValue() == b.intValue());
//        System.out.println();}}


http://www.ppmy.cn/embedded/138540.html

相关文章

HTTP/2新型DDoS攻击:技术深度剖析与防御指南

在智能化演进和互联网技术高速发展的背景下&#xff0c;黑客攻击手段不断翻新&#xff0c;DDoS攻击的强度、频率和复杂度也随之持续攀升。金融、政务、互联网等多个领域及其关键基础设施正面临着前所未有的DDoS攻击威胁。 一、大流量攻击&#xff1a;秒级加速的威胁 近年来&a…

Rust 语言学习笔记(五)

终于来到了 Rust 的精髓所在了&#xff0c;那就是使之不依赖于垃圾回收又能保障内存安全且高效运行的所有权系统(Ownership System)。想要用 Rust 做一个稍显规模项目必定绕不过它&#xff0c;所有权系统包括所有权(Ownership), 借用(Borrowing), 生命周期(Lifetimes)。 以下概…

CSS Modules中的 :global

最近写需求遇到如下代码&#xff0c;我们来分析一番&#xff1a; .medicine-bot {:global(.cosd-site-vcard-card) {margin-top: -3px;}:global(.cosd-site-vcard-title-text) {font-size: var(--cos-text-headline-sm);}:global(.cosd-site-vcard-button) {background-color: …

快速上手:Docker 安装详细教程(适用于 Windows、macOS、Linux)

### 快速上手&#xff1a;Docker 安装详细教程&#xff08;适用于 Windows、macOS、Linux&#xff09; --- Docker 是一款开源容器化平台&#xff0c;广泛应用于开发、测试和部署。本文将为您提供分步骤的 Docker 安装教程&#xff0c;涵盖 Windows、macOS 和 Linux 系统。 …

JMeter与大模型融合应用之JMeter日志分析服务化实战应用

JMeter与大模型融合应用之JMeter日志分析服务化 引言 在当今的互联网时代,网站和应用程序的性能直接影响到用户的体验和业务的成功。为了保证系统的稳定性和高效性,性能测试成为了软件开发过程中的一个重要环节。在这其中,Apache JMeter作为一款开源的性能测试工具,凭借其…

ISP是什么?

isp全称为Internet Service Provider&#xff0c;即互联网服务提供商&#xff0c;是一种向用户提供互联网接入服务的公司或组织&#xff0c;它们提供的服务包括互联网接入、域名注册、网站托管等等。 ISP的应用场景非常广泛&#xff0c;几乎所有的互联网用户都需要通过ISP来接…

如何让手机ip变成动态

在数字化浪潮中&#xff0c;手机已成为我们日常生活中不可或缺的一部分。无论是浏览网页、使用社交媒体还是进行在线购物&#xff0c;手机都扮演着举足轻重的角色。然而&#xff0c;在享受网络带来的便利时&#xff0c;我们也需要关注网络安全和隐私保护。静态IP地址可能让手机…

【混沌测试】ChaosBlade:从安装到实战

ChaosBlade&#xff1a;从安装到实战 1.工具介绍2.安装步骤2.1 准备2.2 安装 3.实战3.1 模拟 CPU 负载实验3.2 模拟内存占用实验3.3 模拟磁盘 IO 负载实验 1.工具介绍 &#x1f680; GitHub 地址&#xff1a;https://github.com/chaosblade-io/chaosblade ChaosBlade 是阿里巴…