C++ 两线交点程序(Program for Point of Intersection of Two Lines)

news/2024/9/20 7:23:15/ 标签: 算法, c++

示例图 

        给定对应于线 AB 的点 A 和 B 以及对应于线 PQ 的点 P 和 Q,找到这些线的交点。这些点在 2D 平面中给出,并带有其 X 和 Y 坐标。示例:

输入:A = (1, 1), B = (4, 4) 
        C = (1, 8), D = (2, 4)

输出:给定直线 AB 和 CD 的交点
         是:(2.4, 2.4)

输入:A = (0, 1), B = (0, 4) 
        C = (1, 8), D = (1, 4)

输出:给定直线 AB 和 CD 平行。

        首先,假设我们有两个点 (x 1 , y 1 ) 和 (x 2 , y 2 )。现在,我们找到由这些点形成的直线方程。假设给定的直线为:

  1. a1x + b1y = c1​
  2. a2x + b2y = c2

        现在我们必须解这两个方程来找到交点。 为了求解,我们将 1 乘以 b 2并将 2 乘以 b 1这样我们得到 a 1 b 2 x + b 1 b 2 y = c 1 b 2 a 2 b 1 x + b 2 b 1 y = c 2 b 1减去这些我们得到 (a 1 b 2 – a 2 b 1 ) x = c 1 b 2 – c 2 b 1这样我们得到了 x 的值。 类似地,我们可以找到 y 的值。 (x, y) 给出了交点。注意:这给出了两条线的交点,但如果我们给出的是线段而不是直线,我们还必须重新检查这样计算出的点是否实际上位于两条线段上。如果线段由点 (x 1 , y 1 ) 和 (x 2 , y 2 ) 指定,那么要检查 (x, y) 是否在线段上,我们只需检查

  • 最小值 (x 1 , x 2 ) <= x <= 最大值 (x 1 , x 2 )
  • 最小值 (y 1 , y 2 ) <= y <= 最大值 (y 1 , y 2 )

上述实现的伪代码: 

determinant = a1 b2 - a2 b1
if (determinant == 0)
{// Lines are parallel
}
else
{x = (c1b2 - c2b1)/determinanty = (a1c2 - a2c1)/determinant
}

这些可以通过首先直接获得斜率,然后找到直线的截距来推导出来。  

// C++ Implementation. To find the point of
// intersection of two lines
#include <bits/stdc++.h>
using namespace std;
 
// This pair is used to store the X and Y
// coordinates of a point respectively
#define pdd pair<double, double>
 
// Function used to display X and Y coordinates
// of a point
void displayPoint(pdd P)
{
    cout << "(" << P.first << ", " << P.second
         << ")" << endl;
}
 
pdd lineLineIntersection(pdd A, pdd B, pdd C, pdd D)
{
    // Line AB represented as a1x + b1y = c1
    double a1 = B.second - A.second;
    
    double b1 = A.first - B.first;
    
    double c1 = a1*(A.first) + b1*(A.second);
 
    // Line CD represented as a2x + b2y = c2
    double a2 = D.second - C.second;
    
    double b2 = C.first - D.first;
    
    double c2 = a2*(C.first)+ b2*(C.second);
 
    double determinant = a1*b2 - a2*b1;
 
    if (determinant == 0)
    {
        // The lines are parallel. This is simplified
        // by returning a pair of FLT_MAX
        return make_pair(FLT_MAX, FLT_MAX);
    }
    else
    {
        double x = (b2*c1 - b1*c2)/determinant;
        
        double y = (a1*c2 - a2*c1)/determinant;
        
        return make_pair(x, y);
    }
}
 
// Driver code
int main()
{
    pdd A = make_pair(1, 1);
    
    pdd B = make_pair(4, 4);
    
    pdd C = make_pair(1, 8);
    
    pdd D = make_pair(2, 4);
 
    pdd intersection = lineLineIntersection(A, B, C, D);
 
    if (intersection.first == FLT_MAX &&
        intersection.second==FLT_MAX)
    {
        cout << "The given lines AB and CD are parallel.\n";
    }
 
    else
    {
        // NOTE: Further check can be applied in case
        // of line segments. Here, we have considered AB
        // and CD as lines
        cout << "The intersection of the given lines AB "
                "and CD is: ";
        displayPoint(intersection);
    }
 
    return 0;
}


输出:

给定直线 AB 和 CD 的交点为:(2.4,2.4)

时间复杂度: O(1) 

辅助空间: O(1)


http://www.ppmy.cn/news/1519111.html

相关文章

百度文库文章-暂存下-------题 目: 链式简单选择排序

题 目: 链式简单选择排序 初始条件&#xff1a; 理论&#xff1a;学习了《数据结构》课程&#xff0c;掌握了基本的数据结构和常用的算法&#xff1b; 实践&#xff1a;计算机技术系实验室提供计算机及软件开发环境。 要求完成的主要任务: &#xff08;包括课程设计工作量…

点儿企业规范

常见命名风格介绍 大驼峰&#xff1a;所有单词首字母都需要大写&#xff0c;UserController小驼峰&#xff1a;除了第一个单词&#xff0c;其他单词首字母大写&#xff0c;userController蛇形&#xff1a;用下划线 _ 作为单词间的分隔符&#xff0c;一般小写&#xff0c;user_…

阿里云Ubuntu系统安装/简单使用Kafka

一、安装kafka 1.下载安装包 1.1下载地址 https://kafka.apache.org/downloads 注意&#xff1a; 版本可以随意选择&#xff0c;我们选择版本为2.4.1 2.压缩文件上传/解压 2.1上传 2.2解压文件 #解压文件指令 tar -zxvf kafka_2.12-2.4.1.tgz -C /export/server/ #创建软…

Linux网络:TCP UDP socket

Linux网络&#xff1a;TCP & UDP socket socket 套接字sockaddr网络字节序IP地址转换bzero UDP socketsocketbindrecvfromsendto TCP socketsocketbindlistenconnectacceptsendrecv 本博客讲解 Linux 下的 TCP 和 UDP 套接字编程。无论是创建套接字、绑定地址&#xff0c;还…

【算法基础实验】图论-Dijkstra最短路径

理论知识 边的放松 边的放松&#xff08;Edge Relaxation&#xff09;是图算法中的一个关键操作&#xff0c;主要用于解决最短路径问题。它的核心思想是在遍历图的过程中&#xff0c;通过比较和更新路径的长度&#xff0c;逐步找到从起点到每个顶点的最短路径。 边的放松过程…

使用 Pandas 进行数据可视化:全面指南(六)

在数据分析的过程中,数据的可视化是一个至关重要的环节。通过图形展示数据,不仅能够帮助我们直观地理解数据,还能够揭示数据背后的规律和趋势。Pandas 作为 Python 生态系统中强大的数据分析库,不仅提供了数据处理和分析的功能,还内置了方便易用的可视化方法。本文将详细介…

AD19基础应用技巧:捕捉对象功能的讲解鼠标”绿色十字”大光标、小光标切换

AD PCB 中心点捕捉功能&#xff1a; 线段、圆、边框中心点捕捉。 有时候不想要鼠标自动捕捉中心点怎么办&#xff1f; 关于Altium Designer 20 的捕抓功能的讲解&#xff08;https://blog.csdn.net/weixin_44599693/article/details/126177841&#xff09; ——- AD PCB画板…

服务器上部署Wordpress:Docker技术教程

今天在三丰云免费服务器上进行部署测试&#xff0c;这款不错的免费服务器配置为1核CPU、1G内存、10G硬盘、5M带宽&#xff0c;给人惊喜。三丰云免费服务器的性能稳定&#xff0c;让我可以尽情发挥技术的魔力。 Docker是一种轻量级容器技术&#xff0c;而Wordpress则是广受欢迎…

C++国密SM2算法加解密的使用

目录 效果 在线校验 代码实现参考 项目 下载 效果 加密字符串:lxw 123abcD 2024-09-01:12:00加密后信息:042E82EE8ACE2BD56FA71DC6A0C34190627AA365F8EEE6261903BEE327A85EB5E1D6E78F2D79AD6F6DC9E45C0829625DC3165BB78BD897F99044A640F930653747939CF9D5A10C8216F945A559…

【Leetcode 2357 】 使数组中所有元素都等于零 —— 哈希表

给你一个非负整数数组 nums 。在一步操作中&#xff0c;你必须&#xff1a; 选出一个正整数 x &#xff0c;x 需要小于或等于 nums 中 最小 的 非零 元素。nums 中的每个正整数都减去 x。 返回使 nums 中所有元素都等于 0 需要的 最少 操作数。 示例 1&#xff1a; 输入&am…

【手撕数据结构】二叉树oj题

目录 单值二叉树题目描述题目思路及代码 相同的树题目描述题目思路及代码 对称二叉树题目描述题目思路及代码 另一棵树的子树题目描述题目思路及代码 二叉树的前序遍历题目描述题目思路及代码 二叉树的构建与遍历题目描述题目思路及代码 单值二叉树 题目描述 题目思路及代码 …

10、Flink 动态表之表到流的转换详解

表到流的转换 动态表可以像普通数据库表一样通过 INSERT、UPDATE 和 DELETE 来不断修改,它可能是一个只有一行、不断更新的表,也可能是一个 insert-only 的表,没有 UPDATE 和 DELETE 修改,或者介于两者之间的其他表。 在将动态表转换为流或将其写入外部系统时,需要对这些…

JVM GC 调优

文章目录 引言I 调整JVM的默认堆内存配置1.1 java命令启动jar包时配置JVM 的内存参数1.2 基于Tomcat服务器部署的java应用,配置JVM 的内存参数II JVM GC 调优基本概念: 应用程序的响应时间(RT)和吞吐量(QPS)JVM调优原理调优思路调优方法JVM调优技巧建议引言 内存参数:ht…

为Ubuntu换颗“心”

对于现在的Linux发行版操作系统,都默认配置好相应的Kernel,但其版本远比最新的要旧,而最新的Kernel除了会修复已发现的BUG,有时还会更新部分框架以及新增功能模块代码,为了确保系统的稳定,还有体验下新功能,我们只好对操作系统的进行换“心”手术,这手术可不简单,首先…

Go 语言版本管理——Goenv

Go 语言版本管理——Goenv 命令安装 goenv安装和切换 Go 版本 goenv 是一个专门管理 Go 语言版本的工具。 命令 安装 goenv github-goenv git clone https://github.com/go-nv/goenv.git ~/.goenv echo export GOENV_ROOT"$HOME/.goenv" >> ~/.bash_profile…

字符编码简介

目录 1. ASCLL 2. GB2312 3. GBK/gbk 4. GB18030 5. Unicode 6. 总结 1. ASCLL 在计算机刚开始被美国人发明的时候&#xff0c;需要将字符存储到计算机进行运算或打印&#xff0c;于是选取了95 个可见字符&#xff08;数字0-9&#xff0c;英文字母&#xff0c;标点符号&…

超详细Git基本命令使用(二)

&#x1f600;前言 本篇博文是关于 Git基本命令的使用&#xff0c;希望你能够喜欢 &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章可以帮助到大家&#xff0c;您的满意是我的动力&#x1f6…

SprinBoot+Vue实验室考勤管理小程序的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue3.6 uniapp代码 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平…

【0-1背包变种】力扣2787. 将一个数字表示成幂的和的方案数

给你两个 正 整数 n 和 x 。 请你返回将 n 表示成一些 互不相同 正整数的 x 次幂之和的方案数。换句话说&#xff0c;你需要返回互不相同整数 [n1, n2, …, nk] 的集合数目&#xff0c;满足 n n1x n2x … nkx 。 由于答案可能非常大&#xff0c;请你将它对 109 7 取余后…

深度学习100问35:如何避免梯度爆炸发生

嘿&#xff0c;想避免梯度爆炸这个麻烦家伙&#xff0c;有好多招儿呢。 首先说说权重初始化&#xff0c;这就好比给游戏里的角色分配初始能力值。得合理安排神经网络的权重初始化哦&#xff0c;不然一开始就可能出问题。可以用像 Xavier 初始化或者 He 初始化这些方法&#x…