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

news2024/9/24 9:23:01

问题描述

计算两条直线的交点坐标,可以理解为给定坐标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) 表示无垂直交点。

 

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

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

相关文章

HTML开发笔记:1.环境、标签和属性、CSS语法

一、环境与新建 在VSCODE里&#xff0c;加载插件&#xff1a;“open in browser” 然后新建一个文件夹&#xff0c;再在VSCODE中打开该文件夹&#xff0c;在右上角图标新建文档&#xff0c;一定要是加.html&#xff0c;不要忘了文件后缀 复制任意一个代码比如&#xff1a; <…

reserve和resize

void test_vector4() {vector<int> v1;//cout << v1.max_size() << endl;//v1.reserve(10);v1.resize(10);for (size_t i 0; i < 10; i){v1[i] i;}for (auto e : v1){cout << e << " ";}cout << endl;} 在上面这段代码中对…

数学建模--国赛备赛---TOPSIS算法

目录 1.准备部分 1.1提交材料 1.2MD5码相关要求 2.TOPSIS算法 2.1算法概述 2.2基本概念 2.3算法核心思想 2.4拓展思考 3.适用赛题 3.1适用赛题说明 3.2适用赛题举例 4.赛题分析 4.1指标的分类 4.2数据预处理 4.2.1区间型属性的变换 4.2.2向量规范化 4.3数据加…

vue 侧边锚点外圆角

环境&#xff1a;uniapp、vue3、unocss、vant4 效果&#xff1a; 代码 主要是&#xff1a;pointTop 、pointCentent 、pointBottom&#xff0c;这三个样式 html <div v-show"!showPoint" class"fixedLeftDiv"><div><div class"pointT…

RPG素材Unity7月20闪促限时4折游戏开发资产兽人角色模型动画休闲放置模板物理交互流体水下焦散VR界面UI2D模板场景20240720

今天这个是RPG素材比较多&#xff0c;还有一些休闲放置模板、FPS场景素材、角色模型、动画、特效。 详细内容展示&#xff1a;www.bilibili.com/video/BV1Tx4y1s7vm 闪促限时4折&#xff1a;https://prf.hn/l/0eEOG1P 半价促销&#xff1a;https://prf.hn/l/RlDmDeQ 7月闪促…

java开发报错合集

mapstruct 1. 报错信息&#xff1a; mapstruct 错误 java.lang.NoSuchMethodError: Ljava/lang/Double 错误 解决方案&#xff1a; mapstruct 错误 java.lang.NoSuchMethodError: Ljava/lang/Double 错误_mapstruct nosuchmethoderror-CSDN博客 2. 报错信息&#xff1a; maps…

数据结构——线性表(单链表)

一、链式存储结构定义 线性表的链式存储结构定义是指使用指针将线性表中的元素按照其逻辑次序依次存储在存储空间中&#xff0c;通过指针来表示数据元素之间的逻辑关系。具体来说&#xff0c;链式存储结构由数据域和指针域组成&#xff0c;数据域存储数据元素的数值&#xff0…

手机接Usb hub再连接电脑下D+D-波形

&#x1f3c6;本文收录于《CSDN问答解答》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&…

UE4-光照渲染、自动曝光、雾

目录 一.光源种类 二.灯光的移动性 三.自动曝光 四.指数级高度雾 五.实现光束 一.光源种类 1.定向光源 用来模拟现实中的太阳光。 2.点光源 比如现实中的灯泡 3.聚光源 4.矩形光源 是这几个光源中性能开销最大的&#xff0c;一般不用到游戏场景中&#xff0c;因为游…

win安装mysql

解压到目录没如果多个mysql创建不同的名字 创建data和my.ini my.ini内容 [client] default-character-setutf8mb4[mysqld] #设置3306端口 port 3306 # 设置mysql的安装目录 basedirF:\mysql-5.7.31 # 设置mysql的数据存放目录 datadirF:\mysql-5.7.31\data # 允许最大连接数 …

ComfyUI面部修复FaceDetailer使用指南

原文&#xff1a;ComfyUI面部修复完全指南 (chinaz.com) 让我们开始使用ComfyUI中的人脸详细修复器吧。人脸详细修复器节点乍一看可能很复杂&#xff0c;但不要担心&#xff0c;我们会一点一点地分解它。通过理解每个输入、输出和参数&#xff0c;你很快就能像专业人士一样使用…

处理AI模型中的“Type Mismatch”报错:数据类型转换技巧

处理AI模型中的“Type Mismatch”报错&#xff1a;数据类型转换技巧 &#x1f504; 处理AI模型中的“Type Mismatch”报错&#xff1a;数据类型转换技巧 &#x1f504;摘要引言正文内容1. 错误解析&#xff1a;什么是“Type Mismatch”&#xff1f;2. 数据类型转换技巧2.1 检查…

大数据环境下的房地产数据分析与预测研究的设计与实现

1绪论 1.1研究背景及意义 随着经济的快速发展和城市化进程的推进&#xff0c;房地产市场成为了国民经济的重要组成部分。在中国&#xff0c;房地产行业对经济增长、就业创造和资本投资起到了重要的支撑作用。作为中国西南地区的重要城市&#xff0c;昆明的房地产市场也备受关…

SwiftUI 在 WWDC 24 之后的新变化

文章目录 前言视图集合新的标签栏体验英雄动画滚动位置Entry 宏预览其他总结 前言 WWDC 24 已经到来&#xff0c;我们有很多内容要讨论。每年&#xff0c;SwiftUI 都会通过引入更多功能来赶上 UIKit。今年也不例外。让我们深入了解 SwiftUI 框架引入的新功能。 我首先要提到的…

JavaDS —— 优先级队列(堆) PriorityQueue

优先级队列的概念 我们在前面就已经学习过队列&#xff0c;队列是一种先进先出(FIFO)的数据结构&#xff0c;但有些情况下&#xff0c;操作的数据可能带有优先级&#xff0c;一般出队列时&#xff0c;可能需要优先级高的元素先出队列&#xff0c;那么在该场景下&#xff0c;使…

详解数据结构之队列、循环队列(源码)

详解数据结构之队列、循环队列(源码) 队列属于线性表 队列&#xff1a;就好比如&#xff0c;我们在排队买东西时排队&#xff0c;第一个先来的第一个买&#xff0c;最后一个到的最后一个买&#xff0c;这里的队列也是满足先进先出&#xff0c;后进后出的规律&#xff08;First …

如果用MATLAB函数delayseq可以对分数延时,但是延时后波形较原波形有幅度上的改变

&#x1f3c6;本文收录于《CSDN问答解答》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&…

Adobe国际认证详解-视频设计认证专家行业应用场景解析

在当今数字化时代&#xff0c;视频设计已成为各行各业不可或缺的一环。而视频设计认证专家&#xff0c;作为经过Adobe国际认证体系严格考核的专业人才&#xff0c;更是行业内炙手可热的存在。他们凭借深厚的视频设计理论基础和实践经验&#xff0c;为行业提供了高质量的视频设计…

ROS2中间件

ROS2 是重新设计的 Robot Operating System&#xff0c;无论从用户API接口到底层实现都进行了改进。这里主要关注ROS2 的中间件。 1. 通信模式 ROS2 使用DDS协议进行数据传输&#xff0c;并通过抽象的rmw&#xff0c;支持多个厂家的DDS实现&#xff08;FastDDS&#xff0c;Cyc…

Django 执行原生SQL

在Django中&#xff0c;你可以使用Raw SQL queries来执行原生的SQL查询。这对于需要进行复杂查询或Django的ORM无法满足的查询非常有用。 1&#xff0c;添加模型 Test/app11/models.py from django.db import modelsclass Post(models.Model):title models.CharField(max_le…