Java 如何检查两个给定的线段是否相交(How to check if two given line segments intersect)

news2024/9/21 8:03:53

给定两条线段(p1, q1)和(p2, q2),判断给定的线段是否相交。
在讨论解决方案之前,让我们先定义方向的概念。平面中有序点三元组的方向可以是 
–逆时针 
–顺时针 
–共线 

下图显示了(a,b,c) 的不同可能方向

 方向在这里有什么用处? 
两条线段(p1,q1)和(p2,q2)相交,当且仅当以下两个条件之一得到验证时

1. 一般情况: 
– ( p1 , q1 , p2 ) 和 ( p1 , q1 , q2 ) 具有不同的方向,并且 
– ( p2 , q2 ,  p1 ) 和 ( p2 , q2 ,  q1 ) 具有不同的方向。

例子:  

2.特殊情况 
– ( p1 , q1 , p2 )、( p1 , q1 , q2 )、( p2 , q2 , p1 ) 和 ( p2 , q2 , q1 ) 均为共线,且 – ( p1 , q1 ) 和 ( p2 , q2 ) 
的 x 投影相交 – ( p1 , q1 ) 和 ( p2 , q2 )的 y 投影相交

例子:  

以下是基于上述想法的实现:

// Java program to check if two given line segments intersect 
class GFG  

  
static class Point 

    int x; 
    int y; 
  
        public Point(int x, int y)  
        { 
            this.x = x; 
            this.y = y; 
        } 
      
}; 
  
// Given three collinear points p, q, r, the function checks if 
// point q lies on line segment 'pr' 
static boolean onSegment(Point p, Point q, Point r) 

    if (q.x <= Math.max(p.x, r.x) && q.x >= Math.min(p.x, r.x) && 
        q.y <= Math.max(p.y, r.y) && q.y >= Math.min(p.y, r.y)) 
    return true; 
  
    return false; 

  
// To find orientation of ordered triplet (p, q, r). 
// The function returns following values 
// 0 --> p, q and r are collinear 
// 1 --> Clockwise 
// 2 --> Counterclockwise 
static int orientation(Point p, Point q, Point r) 

    // See https://www.geeksforgeeks.org/orientation-3-ordered-points/ 
    // for details of below formula. 
    int val = (q.y - p.y) * (r.x - q.x) - 
            (q.x - p.x) * (r.y - q.y); 
  
    if (val == 0) return 0; // collinear 
  
    return (val > 0)? 1: 2; // clock or counterclock wise 

  
// The main function that returns true if line segment 'p1q1' 
// and 'p2q2' intersect. 
static boolean doIntersect(Point p1, Point q1, Point p2, Point q2) 

    // Find the four orientations needed for general and 
    // special cases 
    int o1 = orientation(p1, q1, p2); 
    int o2 = orientation(p1, q1, q2); 
    int o3 = orientation(p2, q2, p1); 
    int o4 = orientation(p2, q2, q1); 
  
    // General case 
    if (o1 != o2 && o3 != o4) 
        return true; 
  
    // Special Cases 
    // p1, q1 and p2 are collinear and p2 lies on segment p1q1 
    if (o1 == 0 && onSegment(p1, p2, q1)) return true; 
  
    // p1, q1 and q2 are collinear and q2 lies on segment p1q1 
    if (o2 == 0 && onSegment(p1, q2, q1)) return true; 
  
    // p2, q2 and p1 are collinear and p1 lies on segment p2q2 
    if (o3 == 0 && onSegment(p2, p1, q2)) return true; 
  
    // p2, q2 and q1 are collinear and q1 lies on segment p2q2 
    if (o4 == 0 && onSegment(p2, q1, q2)) return true; 
  
    return false; // Doesn't fall in any of the above cases 

  
// Driver code 
public static void main(String[] args)  

    Point p1 = new Point(1, 1); 
    Point q1 = new Point(10, 1); 
    Point p2 = new Point(1, 2); 
    Point q2 = new Point(10, 2); 
  
    if(doIntersect(p1, q1, p2, q2)) 
        System.out.println("Yes"); 
    else
        System.out.println("No"); 
  
    p1 = new Point(10, 1); q1 = new Point(0, 10); 
    p2 = new Point(0, 0); q2 = new Point(10, 10); 
    if(doIntersect(p1, q1, p2, q2)) 
            System.out.println("Yes"); 
    else
        System.out.println("No"); 
  
    p1 = new Point(-5, -5); q1 = new Point(0, 0); 
    p2 = new Point(1, 1); q2 = new Point(10, 10);; 
    if(doIntersect(p1, q1, p2, q2)) 
        System.out.println("Yes"); 
    else
        System.out.println("No"); 


  
// This code is contributed by Princi Singh  

输出: 

No
Yes
No

时间复杂度: O(1)

空间复杂度:O(1)

资料来源: 
http://www.dcs.gla.ac.uk/~pat/52233/slides/Geometry1x1.pdf   

《算法导论》第三版,作者:Clifford Stein、Thomas H. Cormen、Charles E. Leiserson、Ronald L. Rivest

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

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

相关文章

linux下使用Mail命令发送邮件的配置、快速实现以及sed命令的一些补充:行结合模式匹配取内容及sed命令显示配置文件中的有效内容

一、linux下使用Mail命令发送邮件的配置及快速实现 之前在服务器上增加了一些日志统计shell脚本并且每周进行一次日志分析统计自动在周一早上发到我的邮箱&#xff0c;最近服务器进行了迁移收缩&#xff0c;又得做点重复的事情&#xff0c;首先是让服务器支持邮件发送。 1&am…

Java语言程序设计基础篇_编程练习题*18.19 (思瑞平斯基三角形)

题目&#xff1a;*18.19 (思瑞平斯基三角形) 修改程序清单18-9, 开发一个程序让用户使用 “” 和 "-” 按钮将当前阶数增1或减1&#xff0c;如图 18 -12a 所示。初始阶数为0。如果当前阶数为0&#xff0c;就忽略按钮。 代码示例 编程练习题18_19SierpinskiTriangle.java…

WEBSERVICE报错逻辑端口不存在问题

例如如下的报错 打开你的SOA 修改这个位置的代码

JavaScript ES6特性(var let const、function=>、增强表达赋值、类与对象)

一、var let const 1、var var明明定义在for里面的但是外部能够访问这个变量,说明var可以跨域访问。 2、let let明明定义在for里面的但是外部不能够访问这个变量,说明let不可以跨域访问。 3、const const foo = {}; // 为 foo 添加一个属性,可以成功 foo.prop = 123; fo…

【mechine learning-六-supervise learning之线性回归模型】

监督学习之线性回归模型 线性回归模型线性模型回归模型 如何使用线性模型实现智能化预测呢寻找数据训练模型输入、特征、目标、预测值、模型代价函数 线性模型是人工智能监督学习中最广泛的应用&#xff0c;所以有必要先学习一下这个基础模型&#xff0c;做好基石。 线性回归模…

商业体育馆的未来之选:气膜馆引领新赛道—轻空间

随着城市化进程的加快&#xff0c;土地资源日益紧张&#xff0c;商业体育馆的建设需求也日渐增多。传统建筑在用地、成本、周期等方面存在诸多限制&#xff0c;而气膜馆的出现&#xff0c;为体育场馆建设提供了一条全新的解决方案。在未来十年&#xff0c;气膜体育馆将成为商业…

【系统方案】ERP管理系统总体建设方案(Word)

第一部分 概述 第二部分 方案介绍 第三部分 系统业务流程 3.1 关键需求概括分析 3.1.1 销售管理方面 3.1.2 采购管理方面 3.1.3 仓库管理方面 3.1.4 财务管理方面 3.1.5 人力资源方面 3.2 关键需求具体分析 3.2.1 财务管理 3.2.1.1会计凭证解决 3.2.1.2钞票流量预算管理 3.2.1.…

C语言15--联合体与枚举

联合体&#xff08;共同体&#xff09;基本概念 联合体的外在形式跟结构体非常类似&#xff0c;但它们有一个本质的区别&#xff1a;结构体中的各个成员是各自独立的内存空间&#xff0c;而联合体中的各个成员却共用同一块内存&#xff0c;因此联合体也称为共用体。 联合体各成…

[苍穹外卖]-09Spring Task定时任务

Spring Task spring Task是spring框架提供的任务调度工具,可以按照约定的时间自动执行某个代码逻辑 只要是需要定时处理的场景都可以使用Spring Task定时任务框架 cron表达式就是一个字符串,可以定义任务触发的时间 构成规则: 分为6或7个域, 由空格隔开,每个域代表一个含义每…

即插即用篇 | YOLOv8 引入并行的分块注意力 | 北京大学 2024 | 微小目标

本改进已同步到YOLO-Magic框架! 摘要:红外小目标检测是一项重要的计算机视觉任务,涉及在红外图像中识别和定位通常仅包含少量像素的微小目标。然而,由于目标体积小且红外图像背景通常复杂,这一任务面临诸多挑战。本文提出了一种深度学习方法,HCF-Net,通过多个实用模块显…

客厅适合用什么灯?客厅落地台灯款式分享

客厅适合用什么灯&#xff1f;客厅落地台灯具备着提供舒适、宽广光线的作用&#xff0c;非常受广大学生、家长们的欢迎。然而&#xff0c;市面上有些品质低劣的产品不仅难以达到预期的照明效果&#xff0c;更有可能导致眼睛受到二次伤害&#xff0c;甚至潜藏安全隐患。作为一名…

云端与 IDE 智能体整合:解决工具碎片化,实现 AI 全流程自动编码

在那篇《2024 年 AI 辅助研发趋势》里&#xff0c;我们谈及了未来的趋势是&#xff1a;从辅助开发人员发展到涵盖软件开发的 整个生命周期。而软件研发本身也是一个复杂的流程&#xff0c;涉及到需求分析、设计、开发、测试、部署等等。在开源的《AI 辅助软件工程&#xff1a;实…

SpringCloud Alibaba入门简介

1、诞生 2018.10.31&#xff0c;Spring Cloud Alibaba 正式入驻了 Spring Cloud 官方孵化器&#xff0c;并在 Maven 中央库发布了第一个版本。 2、是什么&#xff0c;去哪下 官网&#xff1a;Spring Cloud Alibaba官网_基于Springboot的微服务教程-阿里云-阿里云Spring Cloud …

蓄电池制造5G智能工厂物联数字孪生平台,推进制造业数字化转型

蓄电池制造5G智能工厂物联数字孪生平台&#xff0c;推进制造业数字化转型。5G智能工厂&#xff0c;作为“5G工业互联网”深度融合的产物&#xff0c;将5G技术广泛应用于工厂生产现场&#xff0c;实现了生产单元的广泛连接、IT与OT的深度融合以及数据要素的充分利用。随着5G技术…

健身房|基于springboot的健身房管理系统设计与实现(附项目源码+论文+数据库)

私信或留言即免费送开题报告和任务书&#xff08;可指定任意题目&#xff09; 目录 一、摘要 二、相关技术 三、系统设计 四、数据库设计 五、核心代码 六、论文参考 七、源码获取 一、摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理…

【ROS2】地平线RDK X3Pi系统由1.x升级到3.0.0

1、硬件说明 1.1 硬件版本 截止2024.9.11,地平线RDK X3的硬件有四个版本:V1.0、V1.1、V1.2和V2.1 1.2 外观区别 1)V1.x版本外观 2)V2.X版本外观 1.3 配置区别 RDK X3 2.0 主要特性包括四核 Cortex A53 处理器、5Tops BPU 算力、最高 4GB 内存、支持 4K@60 帧视频编…

腾讯混元首个多模态模型——hunyuan-vision

腾讯混元系列升级&#xff1a; 腾讯混元发布多模态模型hunyuan-vision&#xff0c;具有4K的上下文&#xff0c;成本为18元/百万tokens。 感谢您的阅读&#xff0c;在智匠AI&#xff08;MindCraft AI&#xff09;上体验最新更新的模型。

人工智能+数字孪生技术在智慧型项目中的应用研究(Word原件)

1 基于BIM的智慧社区运维管理信息系统构建 1.1 数据存储 1.2 数据交换 1.3 BIM模型的数据整合及轻量化 1.运维BIM模型 2.BIM模型的数据整合 3.BIM模型的轻量化处理 2 GIS与BIM融合数字孪生技术应用 2.1 BIM模型在实景三维GIS平台上分析 2.2 BIM与GIS数据交互 …

【C++登堂入室】类与对象(上)

目录 一、面向过程和面向对象初步认识 二、类的引入 三、类的定义 四、类的访问限定符及封装 4.1 访问限定符 4.2 封装 五、类的作用域 六、类的实例化 七、类对象模型 7.1如何计算类对象的大小 7.2 类对象的存储方式猜测 7.3 结构体内存对齐规则 八、this指针 …

git:恢复纯版本库

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…