【C#】计算两条直线的交点坐标
问题描述
计算两条直线的交点坐标,可以理解为给定坐标P1、P2、P3、P4,形成两条线,返回这两条直线的交点坐标?
注意区分:这两条线是否垂直、是否平行。
代码实现
斜率解释
斜率是数学中的一个概念,特别是在解析几何和平面直角坐标系中,用来描述一条直线倾斜程度的量。它定义为直线上任意两点之间的垂直变化量(即纵坐标的变化量,通常称为“上升”或“Δy”)与水平变化量(即横坐标的变化量,通常称为“运行”或“Δx”)之比。斜率通常用字母 m 表示。
需要注意的是,对于垂直线,由于水平变化量“Δ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)
表示无垂直交点。
相关文章:

【C#】计算两条直线的交点坐标
问题描述 计算两条直线的交点坐标,可以理解为给定坐标P1、P2、P3、P4,形成两条线,返回这两条直线的交点坐标? 注意区分:这两条线是否垂直、是否平行。 代码实现 斜率解释 斜率是数学中的一个概念,特别是…...

在项目服务器部署git 并实现自动提交
以下场景适合在服务器当中使用git 方便提交代码,同时不需要外部的git仓库(码云gitee或者github作为管理平台)。依靠服务器本身ssh 连接协议做为git提交的地址,同时利用钩子自动同步项目代码 首先下载git sudo apt update sudo a…...
前缀匹配工具之IP-Prefix
目录 基本概念: 技术背景: 用户需求: 安全需求: 企业内部的访问控制需求: IP-Prefix的配置与语句分析: 调用方式: 尾声 基本概念: IP-Prefix,即IP前缀,相比传统ACL,它能…...
等级保护测评案例分享及合规建议
一、黑龙江省等级保护测评概述 黑龙江省等级保护测评(简称“等保测评”)是依据国家网络安全等级保护制度的要求,对信息系统进行安全等级划分和安全保护能力的评估。等保测评不仅能够帮助企业和组织发现潜在的安全风险,还能够指导…...

GOLLIE : ANNOTATION GUIDELINES IMPROVE ZERO-SHOT INFORMATION-EXTRACTION
文章目录 题目摘要引言方法实验消融研究 题目 Techgpt-2.0:解决知识图谱构建任务的大型语言模型项目 论文地址:https://arxiv.org/abs/2310.03668 摘要 大型语言模型 (LLM) 与指令调优相结合,在泛化到未见过的任务时取得了重大进展。然而,它…...

2024-07-19 Unity插件 Odin Inspector9 —— Validation Attributes
文章目录 1 说明2 验证特性2.1 AssetsOnly / SceneObjectsOnly2.2 ChildGameObjectsOnly2.3 DisallowModificationsIn2.4 FilePath2.5 FolderPath2.6 MaxValue / MinValue2.7 MinMaxSlider2.8 PropertyRange2.9 Required2.10 RequiredIn2.11 RequiredListLength2.12 ValidateIn…...

跨平台WPF音乐商店应用程序
目录 一 简介 二 设计思路 三 源码 一 简介 支持在线检索音乐,支持实时浏览当前收藏的音乐及音乐数据的持久化。 二 设计思路 采用MVVM架构,前后端分离,子界面弹出始终位于主界面的中心。 三 源码 视窗引导启动源码: namesp…...
设计模式简述(一)
定义:设计模式指的是在软件开发过程中,经过验证的,用于解决在特定环境下,重复出现的,特定问题的解决方案。创建型设计模式关注对象的创建过程,提供了更灵活、可扩展的对象创建机制。结构型设计模式用于解决…...
OSI参考模型:解析网络通信的七层框架
引言 在现代计算机网络中,OSI(开放式系统互联)参考模型是理解和设计网络通信协议的基础。1978年由国际标准化组织(ISO)提出,OSI模型定义了网络通信的七层结构,每一层都承担着特定的功能&#x…...

QT通用配置文件库(QPreferences)
QT通用配置文件库(QPreferences) QPreferences项目是基于nlohmann/json的qt可视化配置文件库,将配置保存成json格式,并提供UI查看与修改,可通过cmake可快速添加进项目。默认支持基本类型、stl常用容器、基本类型与stl容器组成的结构体&#…...

如何搭建一个RADIUS服务器?
1. 系统环境 1.1.操作系统 Ubuntu-20.04.1 (kernel: 5.15.0-58-generic) 1.2.所需软件 FreeRADIUS MariaDB 1.3.注意事项 本文提到的所有操作,都是以root 身份执行; 2. FreeRADIUS的安装 2.1. 安装FreeRADIUS服务器程序 以…...

双机热备综合实验
1,对现有网络进行改造升级,将当个防火墙组网改成双机热备的组网形式,做负载分担模式,游客区和DMZ区走FW3,生产区和办公区的流量走FW1 2,办公区上网用户限制流量不超过100M,其中销售部人员在其基…...
Java和Python的图结构如何实现图的深度优先搜索算法
Java和Python的图结构如何实现图的深度优先搜索算法? 在Java和Python中,实现深度优先搜索(DFS)算法的基本思路都是通过递归或栈来探索图的各个节点。 Java实现DFS:Java import java.util.ArrayList; import java.uti…...
Web学习day05
html&css 目录 html&css 文章目录 一、web开发 1.1工作流程 1.2开发技术 二、HTML 2.1HTML规范 2.2基础标签 2.2.1标题 2.2.2水平线 2.2.3段落和换行 2.2.4文字效果 2.2.5超链接 2.2.6图像 2.2.7音频和视频 三、布局标签 3.1列表 3.2容器 3.3表格 3…...

LINUX客户端client(socket、connect)实现客户端发送,服务器接收
SERVICE端见前一篇文章 5. 客户端连接函数 connect()(与前面的bind一样) int connect (int sockfd, struct sockaddr * serv_addr, int addrlen) 参数: sockfd: 通过 socket() 函数拿到的 fd addr:struct sockaddr 的结构体变量地址 addr…...

【网络安全科普】勒索病毒 防护指南
勒索病毒简介 勒索病毒是一种恶意软件,也称为勒索软件(Ransomware),其主要目的是在感染计算机后加密用户文件,并要求用户支付赎金以获取解密密钥。这种类型的恶意软件通常通过电子邮件附件、恶意链接、下载的软件或漏洞…...
TFHE库,fftw和googletest库安装
点个关注吧!本文主要关注于TFHE的安装与常见的问题 1.TFHE的git链接: https://github.com/tfhe/tfhe git clone --recurse-submodules --branchmaster https://github.com/tfhe/tfhe.git 2.安装 mkdir build cd build cmake ../src -DENABLE_TESTSon -D…...
关于Spring Boot IOCDC,看这一篇就够了
一,Spring是什么及常用注解 先说什么是spring,在前面的博客中已经知道了,spring是一个开源框架,为了让我们开发更加简单,那关于ioc呢,一句话概况一下:Spring就是包含了众多工具方法的Ioc容器 …...
Model Import Settings
前言 在可视化3D世界中,模型是3D世界的核心,你可以没有贴图,可以没有特效,甚至可以没有用户交互界面,但必须得有模型来描述世界的基本样貌。 在3D世界中,由点线面构成了模型的轮廓;由UV和纹理&a…...

腾讯云COS托管静态网站,以及如何解决访问出现了下载网页的情况
腾讯云对象存储(Cloud Object Storage,简称COS),与其他云厂商所提供的云对象存储都是面向非结构化数据,只是每个云厂商的叫法有别于他家,或许是更能彰显厂商的品牌吧! 但不管云厂商怎么给云对象…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...

实战三:开发网页端界面完成黑白视频转为彩色视频
一、需求描述 设计一个简单的视频上色应用,用户可以通过网页界面上传黑白视频,系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观,不需要了解技术细节。 效果图 二、实现思路 总体思路: 用户通过Gradio界面上…...
API网关Kong的鉴权与限流:高并发场景下的核心实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 引言 在微服务架构中,API网关承担着流量调度、安全防护和协议转换的核心职责。作为云原生时代的代表性网关,Kong凭借其插件化架构…...
6️⃣Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙
Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙 一、前言:离区块链还有多远? 区块链听起来可能遥不可及,似乎是只有密码学专家和资深工程师才能涉足的领域。但事实上,构建一个区块链的核心并不复杂,尤其当你已经掌握了一门系统编程语言,比如 Go。 要真正理解区…...

AxureRP-Pro-Beta-Setup_114413.exe (6.0.0.2887)
Name:3ddown Serial:FiCGEezgdGoYILo8U/2MFyCWj0jZoJc/sziRRj2/ENvtEq7w1RH97k5MWctqVHA 注册用户名:Axure 序列号:8t3Yk/zu4cX601/seX6wBZgYRVj/lkC2PICCdO4sFKCCLx8mcCnccoylVb40lP...
【java】【服务器】线程上下文丢失 是指什么
目录 ■前言 ■正文开始 线程上下文的核心组成部分 为什么会出现上下文丢失? 直观示例说明 为什么上下文如此重要? 解决上下文丢失的关键 总结 ■如果我想在servlet中使用线程,代码应该如何实现 推荐方案:使用 ManagedE…...

Python爬虫(52)Scrapy-Redis分布式爬虫架构实战:IP代理池深度集成与跨地域数据采集
目录 一、引言:当爬虫遭遇"地域封锁"二、背景解析:分布式爬虫的两大技术挑战1. 传统Scrapy架构的局限性2. 地域限制的三种典型表现 三、架构设计:Scrapy-Redis 代理池的协同机制1. 分布式架构拓扑图2. 核心组件协同流程 四、技术实…...
十二、【ESP32全栈开发指南: IDF开发环境下cJSON使用】
一、JSON简介 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,具有以下核心特性: 完全独立于编程语言的文本格式易于人阅读和编写易于机器解析和生成基于ECMAScript标准子集 1.1 JSON语法规则 {"name"…...