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

news2024/9/25 1:17:50

示例图 

        给定对应于线 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)/determinant
    y = (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.coloradmin.cn/o/2084164.html

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

相关文章

关于vue2运行时filemanager-webpack-plugin报错isFile is undefind

当我们在运行时报此错误时&#xff0c;在vue.config.js里找一下filemanager-webpack-plugin的配置路径。 new FileManagerPlugin({onEnd: {delete: [./dist.zip],archive: [{ source: ./dist, destination: ./dist.zip }]}}) 在对应的路径下建一个dist文件夹

scrapy--子类CrawlSpider中间件

免责声明:本文仅做分享参考~ 目录 CrawlSpider 介绍 xj.py 中间件 部分middlewares.py wyxw.py 完整的middlewares.py CrawlSpider 介绍 CrawlSpider类&#xff1a;定义了一些规则来做数据爬取&#xff0c;从爬取的网页中获取链接并进行继续爬取. 创建方式&#xff…

七年老玩家《王者荣耀》分析一:【市场与用户以及社交功能】

目录 市场与用户 王者荣耀在不同国家和地区的市场渗透率 王者荣耀的主要收入来源以及增长趋势 王者荣耀的用户活跃度和玩家留存率在最近几年的变化情况 王者荣耀面临的主要竞争对手以及如何在竞争中保持领先地位 《英雄联盟手游》&#xff08;LOL&#xff09; 《虚荣》&a…

手动安装Git,手动在右击菜单注册git运行程序

当我们有git的zip压缩包后&#xff0c;只将压缩包解压也是可以用的&#xff0c;但是每次使用时还得去git的安装包下启动git项目&#xff0c;这样就很麻烦。一般情况下都是右击就有git运行程序的选项&#xff0c;直接点击就好&#xff0c;这时用.exe文件安装就没问题&#xff0c…

智能报警物联网系统:使用MQTT和与Grafana集成的InfluxDB监控工地电梯流量和气象数据

这篇论文的标题是《Smart Alarm IoT System: Monitoring Elevator Traffic and Meteorological Data on Job Sites Using MQTT and InfluxDB integrated with Grafana》&#xff0c;作者们来自约旦大学的计算机工程系和机电工程系。以下是对论文主要内容的详细整理&#xff1a;…

LabVIEW波形图的多点触控实现方法

在LabVIEW中&#xff0c;如何实现波形图的多点触控功能&#xff0c;例如通过触控操作对波形进行放大和缩小&#xff1f; 解答&#xff1a; 在LabVIEW中&#xff0c;尽管原生支持的多点触控功能较为有限&#xff0c;但仍有多种方法可以实现波形图的触控操作、放大和缩小功能&am…

详解Asp.Net Core管道模型中的五种过滤器的适用场景与用法

1. 前言 在 ASP.NET Core 中&#xff0c;过滤器是一种用于对请求管道进行前置或后置处理的组件。它们可以在请求处理的不同阶段干预和修改请求和响应&#xff0c;以实现一些通用的处理逻辑或功能增强。 ASP.NET Core 的管道模型由多个中间件组成&#xff0c;而过滤器是这个模…

质量技术AI提效专题分享-得物技术沙龙

活动介绍 本次“质量技术&AI提效专题分享”沙龙聚焦于质量技术和AI效率领域&#xff0c;将为您带来四个令人期待的演讲话题&#xff1a; 1、《智能化提效实践》 2、《仿真自动化在饿了么金融实践分享》 3、《得物精准测试提效应用》 4、《广告算法灰度拦截实践》 相信这些…

入门Java编程的知识点—>IO流(day13)

重点掌握IO流作用是什么&#xff1f;重点掌握字节流的作用是什么?如何使用?重点掌握缓冲流的作用是什么?如何使用? IO简介 I (in)&#xff1a;输入指得就是从外界进入到程序的方向&#xff0c;通常我们是需要读取外界的数据&#xff0c;所以输入流就是用来读取数据的。 …

超越 CAPE 旧模式,P-CAPE 开创股市回报预测新局面

作者:老余捞鱼 原创不易,转载请标明出处及原作者。 写在前面的话: 本文主要介绍的是周期性调整市盈率(CAPE)及其倒数 CAEY 常用于评估股市长期回报,但原始 CAPE 有局限,未充分考虑未分配收益。未分配收益可再投资或回购股票影响收益。应调整周期性调整后的收益为…

【基础】Three.js中添加操作面板,GUI可视化调试(附案例代码)

1.先引入GUI库&#xff1a; import { GUI } from "three/addons/libs/lil-gui.module.min.js";2.实例化gui对象&#xff0c;并添加需要显示的参数: // 实例化一个gui对象const gui new GUI();//设置操作面板位置gui.domElement.style.right "0px";gui.d…

阿里云私有镜像仓库配置及使用

1 登录阿里云 阿里云访问地址&#xff1a;https://www.aliyun.com/ 右上角选择“控制台” 2 创建个人实例 搜索框搜索“容器镜像服务” 新建“个人实例” 选择“创建个人版” 同意协议&#xff0c;点击确定 3 个人实例配置 设置Registry登录密码 密码要求&#xff1…

【卷起来】VUE3.0教程-01-环境搭建与安装

​分享不易&#xff0c;耗时耗力&#xff0c;麻烦给个不要钱的关注和赞吧 &#x1f332; 什么是VUE Vue 是一个框架&#xff0c;也是一个生态。其功能覆盖了大部分前端开发常见的需求。但 Web 世界是十分多样化的&#xff0c;不同的开发者在 Web 上构建的东西可能在形式和规模…

扑捉一只耿鬼(HTML文件)

图例&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><title>耿鬼</title><style>body {background: #fff;font-family: Comfortaa, sans-serif;}* {box-sizing:…

【动图效果概览】自动化建链后,Exata调用STK更新卫星位置

如下图所示&#xff0c;动画遵循 时间前进方向&#xff0c;划分截取为5段 &#xff08;因为每张照片限制大小5MB&#xff0c;不够应该够看清个大概意思了&#xff09;&#xff1a;

BIO、NIO编程与直接内存、零拷贝详解

目录 一、网络通信编程基本常识 什么是 Socket&#xff1f; 短连接 长连接 什么时候用长连接&#xff0c;短连接&#xff1f; 网络编程里通用常识 二、Java 原生网络编程-BIO 原生 JDK 网络编程 BIO 原生 JDK 网络编程 NIO 什么是 NIO&#xff1f; 和BIO 的主要区别 NI…

C语言中的运算符

一,算数运算符 基本算术运算符&#xff1a; 加法&#xff08;&#xff09;&#xff1a;用于两个数相加。例如 int a 3 5;&#xff0c;结果 a 的值为 8。 减法&#xff08;-&#xff09;&#xff1a;两个数相减。如 int b 7 - 4;&#xff0c;b 的值为 3。 乘法&#xff08;*…

使用推测解码提高 LLM 推理速度

使用尖端优化技术加速推理的实用指南 欢迎来到雲闪世界。大型语言模型非常耗电&#xff0c;需要大量 GPU 资源才能发挥良好性能。然而&#xff0c;Transformer 架构并没有充分利用 GPU。 从设计上讲&#xff0c;GPU 可以并行处理&#xff0c;但 Transformer 架构是自回归的。为…

哈希表两数求和

leetcode题目链接 这道题思路可以说easy 首先想到的就是两层for循环 代码如下 class Solution { public:vector<int> twoSum(vector<int>& nums, int target) {vector<int>result;int lengthnums.size();for(int i0;i<length;i){for(int ji1;j<…

【drools】电影推荐搭建

同步用了很久很久 反复了很多了次,最终: drools用的都是9.*** Y9KP 代码 D:\Future\06_movie-recommendation-system-springboot-drools-rule-engine\recommendation\src\main\resources\com.recommendation.movie.rules\medicine_symptoms.drl在spring boot 中集成drools做电…