【C#】计算两条直线的交点坐标

问题描述

计算两条直线的交点坐标,可以理解为给定坐标P1、P2、P3、P4,形成两条线,返回这两条直线的交点坐标?

注意区分:这两条线是否垂直、是否平行。

 

代码实现

斜率解释

斜率是数学中的一个概念,特别是在解析几何和平面直角坐标系中,用来描述一条直线倾斜程度的量。它定义为直线上任意两点之间的垂直变化量(即纵坐标的变化量,通常称为“上升”或“Δy”)与水平变化量(即横坐标的变化量,通常称为“运行”或“Δx”)之比。斜率通常用字母 m 表示。

6af594287d3649baa8746d1254c040a5.png

需要注意的是,对于垂直线,由于水平变化量“Δx” 为零,所以斜率无法定义,因为这会导致分母为零,我们说垂直线的斜率是无穷大或未定义。

斜率的概念在许多数学和物理问题中都有应用,例如在微积分中,导数可以看作是曲线在某一点处的瞬时斜率;在物理学中,斜率可以表示速度、加速度等随时间的变化率。

在实际应用中,斜率也可以帮助我们理解数据的趋势,比如在统计学中,通过计算散点图中数据点的斜率,我们可以了解变量间的关系是正相关还是负相关。

 

方法1:两条线不一定垂直

using System;

class Program
{
    struct Point
    {
        public double X;
        public double Y;

        public Point(double x, double y)
        {
            X = x;
            Y = y;
        }
    }

    static Point FindIntersection(Point p1, Point p2, Point p3, Point p4)
    {
        double a1 = p2.Y - p1.Y;
        double b1 = p1.X - p2.X;
        double c1 = a1 * p1.X + b1 * p1.Y;

        double a2 = p4.Y - p3.Y;
        double b2 = p3.X - p4.X;
        double c2 = a2 * p3.X + b2 * p3.Y;

        double det = a1 * b2 - a2 * b1;

        if (det == 0)
        {
            // 两条直线平行或重合,无交点或有无穷多个交点
            return new Point(double.NaN, double.NaN);
        }

        double x = (b2 * c1 - b1 * c2) / det;
        double y = (a1 * c2 - a2 * c1) / det;

        return new Point(x, y);
    }

    static void Main()
    {
        Point p1 = new Point(1, 1);
        Point p2 = new Point(3, 3);
        Point p3 = new Point(1, 3);
        Point p4 = new Point(3, 1);

        Point intersection = FindIntersection(p1, p2, p3, p4);

        if (double.IsNaN(intersection.X) && double.IsNaN(intersection.Y))
        {
            Console.WriteLine("两条直线平行或重合,无交点或有无穷多个交点");
        }
        else
        {
            Console.WriteLine($"交点坐标为 ({intersection.X}, {intersection.Y})");
        }
    }
}

例如,如果 P1(1, 1)P2(3, 3) 代表一条直线,P3(1, 3)P4(3, 1) 代表另一条直线,通过上述代码就能计算出它们的交点坐标。如果两条直线平行,如 P1(1, 1)P2(2, 2) 和 P3(1, 2)P4(2, 1),则返回 (NaN, NaN) 表示无交点。

方法2:两条线垂直

using System;

class Program
{
    struct Point
    {
        public double X;
        public double Y;

        public Point(double x, double y)
        {
            X = x;
            Y = y;
        }
    }

    static Point FindPerpendicularIntersection(Point p1, Point p2, Point p3, Point p4)
    {
        // 计算两条直线的斜率
        double slope1 = (p2.Y - p1.Y) / (p2.X - p1.X);
        double slope2 = (p4.Y - p3.Y) / (p4.X - p3.X);

        // 如果两条直线中有一条斜率不存在(即垂直于 x 轴)
        if (double.IsInfinity(slope1))
        {
            double x = p1.X;
            double y = slope2 * (x - p3.X) + p3.Y;
            return new Point(x, y);
        }
        else if (double.IsInfinity(slope2))
        {
            double x = p3.X;
            double y = slope1 * (x - p1.X) + p1.Y;
            return new Point(x, y);
        }

        // 两条直线斜率都存在时
        double perpendicularSlope1 = -1 / slope1;
        double perpendicularSlope2 = -1 / slope2;

        // 计算直线的方程
        double intercept1 = p1.Y - perpendicularSlope1 * p1.X;
        double intercept2 = p3.Y - perpendicularSlope2 * p3.X;

        // 计算交点坐标
        double x = (intercept2 - intercept1) / (perpendicularSlope1 - perpendicularSlope2);
        double y = perpendicularSlope1 * x + intercept1;

        return new Point(x, y);
    }

    static void Main()
    {
        Point p1 = new Point(1, 1);
        Point p2 = new Point(3, 3);
        Point p3 = new Point(1, 3);
        Point p4 = new Point(3, 1);

        Point intersection = FindPerpendicularIntersection(p1, p2, p3, p4);

        if (double.IsNaN(intersection.X) && double.IsNaN(intersection.Y))
        {
            Console.WriteLine("两条直线平行或重合,无垂直交点或有无穷多个垂直交点");
        }
        else
        {
            Console.WriteLine($"垂直交点坐标为 ({intersection.X}, {intersection.Y})");
        }
    }
}

例如,对于 P1(1, 1)P2(3, 3) 和 P3(1, 3)P4(3, 1) 这组坐标,通过上述代码可以计算出它们的垂直交点坐标。

再比如,如果两条直线平行,如 P1(1, 1)P2(2, 2) 和 P3(1, 2)P4(2, 1),那么将返回 (NaN, NaN) 表示无垂直交点。

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

TiDB实践—索引加速+分布式执行框架创建索引提升70+倍

作者: 数据源的TiDB学习之路 原文来源: https://tidb.net/blog/92d348c2 背景介绍 TiDB 采用在线异步变更的方式执行 DDL 语句,从而实现 DDL 语句的执行不会阻塞其他会话中的 DML 语句。按照是否需要操作 DDL 目标对象所包括的数据来划分…

QT样式美化 之 qss入门

样例一 *{font-size:13px;color:white;font-family:"宋体"; }CallWidget QLineEdit#telEdt {font-size:24px;}QMainWindow,QDialog{background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,stop: 0 #1B2534, stop: 0.4 #010101,stop: 0.5 #000101, stop: 1.0 #1F2B…

springboot项目中,yml文件乱码

项目场景: 在springboot项目的resource目录,新建yml文件,并且输入了中文,但是关闭idea,再打开,里面的中文乱码了 问题描述 原因分析: 编码设置相关 解决方案: 方案1&#xff0…

使用 XPath 定位 HTML 中的 img 标签

引言 随着互联网内容的日益丰富,网页数据的自动化处理变得愈发重要。图片作为网页中的重要组成部分,其获取和处理在许多应用场景中都显得至关重要。例如,在社交媒体分析、内容聚合平台、数据抓取工具等领域,图片的自动下载和处理…

Linux源码安装的Redis如何配置systemd管理并设置开机启动

文章目录 实验前提实验 实验前提 已完成源码安装并能正常启动redis /usr/local/bin/redis-server能正常启动redis 实验 vim /etc/systemd/system/redis.service内容如下: [unit] Descriptionredis-server Afternetwork.target[Service] Typeforking ExecStart/…

k8s集群 安装配置 Prometheus+grafana

k8s集群 安装配置 Prometheusgrafana k8s环境如下:机器规划: node-exporter组件安装和配置安装node-exporter通过node-exporter采集数据显示192.168.40.180主机cpu的使用情况显示192.168.40.180主机负载使用情况 Prometheus server安装和配置创建sa账号&…

[论文笔记] CT数据配比方法论——1、Motivation

我正在写这方面的论文,感兴趣的可以和我一起讨论!!!!!! Motivation 1、探测原有模型的配比: 配比 与 ppl, loss, bpw, benchmark等指标 之间的关系。 2、效果稳定的配比:配比 与 模型效果 之间的规律。 Experiments 1、主语言(什么语言作为主语言,几种主语言?…

Linux----Mplayer音视频库的移植

想要播放视频音乐就得移植相关库到板子上 Mplayer移植需要依赖以下源文件:(从官网获取或者网上) 1、zlib-1.2.3.tar.gz :通用的内存空间的压缩库。 2、libpng-1.2.57.tar.gz :png格式图片的压缩或解压库 3、Jpegsrc.v9b.tar.gz : jpeg格式图片的压…

docker应用:搭建云手机

简介:近来慵懒,身体懈怠良多,思来想去随手看点小攻略以宽慰不懈怠的心。云手机Cloudphone,就是将云计算技术运用于网络终端服务,通过云服务器实现云服务的手机。其实就是深度结合了网络服务的智能手机,这类…

初谈Linux信号-=-信号的产生

文章目录 概述从生活角度理解信号Linux中信号信号常见的处理方式理解信号的发送与保存 信号的产生core、term区别 概述 从生活角度理解信号 你在网上买了很多件商品,再等待不同商品快递的到来。但即便快递没有到来,你也知道快递来临时, 你该…

【IntelliJ IDEA】一篇文章集合所有IDEA的所有设置

IntelliJ IDEA 是一款功能强大的集成开发环境(IDE),其设置涵盖了多个方面,以满足不同开发者的需求和偏好。由于 IDEA 的设置相当复杂和详尽,这里无法在一篇简短的文章中详细介绍所有设置。然而,我可以提供一…

义务外贸wordpress独立站主题

健身器材wordpress网站模板 跑步机、椭圆机、划船机、动感单车、健身车、深蹲架、龙门架、健身器材wordpress网站模板。 https://www.jianzhanpress.com/?p4251 农业机械wordpress网站模板 植保机械、畜牧养殖机械、农机配件、土壤耕整机械、农业机械wordpress网站模板。 …

戴着苹果Vision Pro,如何吃花生米

6月底苹果Vision Pro国内开售,我早早到官网预订了一台。选择必要的配件,输入视力信息,定制符合自己视力的蔡司镜片。确实贵。把主要配件和镜片配齐,要3万6,比Pico、META的眼镜贵一个数量级。 Vision Pro出来后&#x…

复合翼无人机搭载自组网模块集群组网技术实现详解

复合翼无人机作为一种具备高效飞行和长航时特点的飞行器,在多个领域如军事侦察、环境监测、灾害救援等都有着广泛的应用。而为了实现复合翼无人机之间的高效通信,搭载自组网模块实现集群组网技术显得尤为重要。本文将详细介绍复合翼无人机搭载自组网模块…

Java实现随机题库-全站最呆瓜思想,保证你能学会

目录 Blue留言 : 学本篇文章之前所需掌握技能 推荐视频: 代码逻辑思想 步骤: 1、引入依赖 2、做一个excel表格 3、java实现从excel表中取数据 第一步:根据excel上面的字段名(如下图)&#xff0…

Boost搜索引擎项目相关介绍

Boost搜索引擎相关介绍: 首先,Boost库不具备搜索条件,所以我们这个项目借此实现搜索功能。 项目的核心就是以用户搜索的相关内容在目标数据中进行查找。 首先,我们面临的第一大难题就是目标数据,在这里目标数据就是Boo…

如何学习Spark:糙快猛的大数据之旅

作为一名大数据开发者,我深知学习Spark的重要性。今天,我想和大家分享一下我的Spark学习心得,希望能够帮助到正在学习或准备学习Spark的朋友们。 目录 Spark是什么?学习Spark的"糙快猛"之道1. 不要追求完美,在实践中学习2. 利用大模型作为24小时助教3. 根据自己的节…

51单片机学习(4)

一、串口通信 1.串口通信介绍 写完串口函数时进行模块化编程,模块化编程之后要对其进行注释,以便之后使用模块化函数,对模块化.c文件中的每一个函数进行注释。 注意:一个函数不能既在主函数又在中断函数中 模式1最常用&#xf…

《Towards Black-Box Membership Inference Attack for Diffusion Models》论文笔记

《Towards Black-Box Membership Inference Attack for Diffusion Models》 Abstract 识别艺术品是否用于训练扩散模型的挑战,重点是人工智能生成的艺术品中的成员推断攻击——copyright protection不需要访问内部模型组件的新型黑盒攻击方法展示了在评估 DALL-E …

二、GD32F407VET6使用定时器点灯

零、所需文件及环境: 1、第一章建立好的LED灯闪烁程序 2、编译环境MDK5(KEIL5) 3、一个GD32F407VET6硬件 4、一个下载器j-link 或 st-link等 5.代码编辑器 Notepad (可以不要 用记事本也能编译 都是习惯的问题 壹、复制LED灯闪烁程序 1.1 复制le…