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

news2024/11/22 17:10:15

 给定两条线段(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 投影相交

例子:  

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

// C# program to check if two given line segments intersect 
using System; 
using System.Collections.Generic;  
  
class GFG  

  
public class Point 

    public int x; 
    public 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)) 
        Console.WriteLine("Yes"); 
    else
        Console.WriteLine("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)) 
            Console.WriteLine("Yes"); 
    else
        Console.WriteLine("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)) 
        Console.WriteLine("Yes"); 
    else
        Console.WriteLine("No"); 


  
/* This code contributed by PrinciRaj1992 */ 

 输出: 

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/2124525.html

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

相关文章

多进程批量下载era5再分析数据

1.配置key https://cds.climate.copernicus.eu/api-how-to 获取key 修改配置文件&#xff0c;把url和key复制进行 vim $HOME/.cdsapirc2.下载 根据要求修改年和月份等变量 import cdsapi import calendar import concurrent.futures import osdef download_month_data(year,…

KEIL编译生成.bin文件的简单方法

fromelf --bin -o "$LL.bin" "#L" 如图 如果不行请尝试其他方法

大模型算法入行转行?我建议你这样做!

最近私信问我关于入行、转行方面的问题比较多&#xff0c;就专门写一篇讲讲我的理解。 首先说明一下个人的背景和现状&#xff0c;我本人是本科学历&#xff0c;有互联网大厂搜推方向经验&#xff0c;后来跳到中厂继续做推荐&#xff0c;去年开始做大模型。现在是个小组长&…

c中 int 和 unsigned int

c语言中&#xff0c;char、short、int、int64以及unsigned char、unsigned short、unsigned int、unsigned int64等等类型都可以表示整数。但是他们表示整数的位数不同&#xff0c;比如&#xff1a;char/unisigned char表示8位整数&#xff1b; short/unsigned short表示16位整…

桂林自闭症寄宿学校:用关爱点亮未来

在桂林这座风景如画的城市中&#xff0c;隐藏着一所特别的学校&#xff0c;它以无尽的关爱与专业&#xff0c;为自闭症儿童撑起了一片希望的天空&#xff0c;这就是星贝育园自闭症儿童寄宿制学校。在这里&#xff0c;每一个孩子都是独一无二的&#xff0c;他们被温柔以待&#…

仪器计量校准的设备保养方法有哪些?

仪器校准、检定&#xff0c;是对设备和仪器进行校正和校验。与规范所再现的相应值相关联的一组检测&#xff0c;以规定精确测量仪器或检测系统所指示的值&#xff0c;及产品测量仪器和对照化学物质所隐含的值&#xff0c;是否符合所要求的标准。 仪器校准可能包括以下过程&…

postgresql|数据库|pg_repack和idle_in_transaction_session_timeout参数的关系

一、问题描述 在使用pg_repack这个工具做数据库的表膨胀清理过程中&#xff0c;经常会遇到类似这样的警告&#xff1a; 这里的警告表明在膨胀治理的时候&#xff0c;此表遇到了事务阻塞&#xff0c;而此时我们有三种选择&#xff0c;第一个选择是等待该事务结束&#xff0c;第…

在Excel里制作简单游戏界面

生成随机激活码 找工具箱 插入按钮 建宏 方法一&#xff1a;新建按钮的时候创建宏 方法二&#xff1a;右键->指定宏 VBA VBA代码界面 调整字体 VBA代码 Public str As String 存储激活码显示的字符 Public st As String 中间变量&#xff0c;用来替代随机数 Public ot…

[实践应用] 深度学习之激活函数

文章总览&#xff1a;YuanDaiMa2048博客文章总览 深度学习之激活函数 激活函数基本概念分类常见的激活函数2. Tanh/双曲正切激活函数3. ReLU激活函数4. Softmax激活函数 PyTorch中如何使用1. 线性激活函数2. 非线性激活函数SigmoidTanhReLULeaky ReLUParametric ReLU (PReLU) 使…

ThinkPHP Email功能如何配置才能发送邮件?

ThinkPHP Email发送流程&#xff1f;使用ThinkPHP发Email方法&#xff1f; ThinkPHP作为一款流行的PHP框架&#xff0c;提供了强大的Email功能&#xff0c;使得开发者能够轻松实现邮件发送。AokSend将详细介绍如何配置ThinkPHP Email功能&#xff0c;以确保邮件能够顺利发送。…

基于多种智能优化算法优化BP神经网络的数据时序预测

基于多种智能优化算法优化BP神经网络进行数据时序预测的研究&#xff0c;旨在通过引入多种优化算法来提高传统BP神经网络&#xff08;Backpropagation Neural Network&#xff09;的预测精度与泛化能力。 代码原理及流程 1. BP神经网络简介 BP神经网络是一种常见的前馈神经网…

别找了!包含gpt在内的国内可以使用的Ai网站都在这了【最新可用】

在当今人工智能迅速发展的时代&#xff0c;智能创作与对话平台为用户提供了多样化的功能支持。以下是一些国内代表性的GPT平台&#xff0c;涵盖了从个人到企业的广泛需求&#xff0c;您可以根据自己的需求灵活选择。我们还为您整理了这些平台的链接&#xff0c;方便直接体验。&…

谷歌对抗司法部:为什么谷歌的“数百个竞争对手”说法站不住脚

随着谷歌反垄断陪审团审判的进行&#xff0c;谷歌声称美国司法部对广告技术市场的看法狭隘&#xff0c;并且广告商和出版商有很多替代选择。然而&#xff0c;证据并不支持这一说法。 谷歌误导性地声称有“数百个竞争对手。” 虽然存在许多广告技术提供商&#xff0c;但谷歌在…

【Petri网导论学习笔记】Petri网导论入门学习(二)

Petri 网导论学习笔记&#xff08;二&#xff09; 如需学习转载请注明原作者并附本帖链接&#xff01;&#xff01;&#xff01; 如需学习转载请注明原作者并附本帖链接&#xff01;&#xff01;&#xff01; 如需学习转载请注明原作者并附本帖链接&#xff01;&#xff01;&am…

如何进行DAP-seq的数据挖掘,筛选验证位点

从样本准备到寄送公司&#xff0c;每一天都在“祈祷”有个心仪的分析结果&#xff0c;终于在这天随着邮件提示音的响起&#xff0c;收到了分析结果...... 分析前工作 爱基在进行数据分析之前&#xff0c;会有两次质控报告反馈给老师们。第一个&#xff0c;基因组DNA的提取质控…

线上找工作求职招聘小程序源码系统 带完整的安装代码包以及搭建部署教程

系统概述 在当今这个数字化时代&#xff0c;互联网已经渗透到我们生活的方方面面&#xff0c;其中就业市场也不例外。随着移动互联网的普及&#xff0c;线上找工作已成为许多求职者的首选方式。为了满足这一市场需求&#xff0c;我们精心打造了一款“线上找工作求职招聘小程序…

SpringMVC中的前置调用

这两天在看一个老项目&#xff0c;用的SpringMVCJSP。因为很久没看SpringMVC&#xff0c;在看一个Controller的时候竟然看不懂了哈哈哈哈~ Controller&#xff1a; Controller RequestMapping("example") FunctionId("F001") public class ExampleContro…

安全团队需要了解的六大最危险的新威胁

人工智能的崛起为网络安全带来了非凡的机遇和令人生畏的挑战。 虽然人工智能可以轻松识别和利用漏洞&#xff0c;但如果没有强大的安全措施&#xff0c;部署人工智能会带来重大风险。 随着技术的发展&#xff0c;许多组织优先考虑人工智能创新&#xff0c;却忽视了安全性&#…

《黑神话悟空》有情众生三十四难成就指南

在《黑神话悟空》的丰富世界中&#xff0c;解锁“有情众生三十四难”成就是一项颇具挑战性的任务。这个成就要求玩家完成一系列精细的支线任务&#xff0c;并在小雷音寺击败不白。以下是详细的成就解锁步骤&#xff0c;助你在这款动作角色扮演游戏中取得新的进展。 如果需要一个…

苹果手机铃声怎么设置自己的歌?3个方法自定义手机铃声

苹果手机内部的手机铃声库只有固定的几首铃声&#xff0c;且都是纯音乐&#xff0c;比较单调&#xff0c;并不是所有用户都喜欢这些铃声。那么&#xff0c;苹果手机铃声怎么设置自己的歌呢&#xff1f;小编这里有3个方法&#xff0c;可以教大家如何将手机铃声设置成自己喜欢的歌…