当前位置: 首页 > news >正文

【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) 表示无垂直交点。

 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 升级TrinityCore 服务器硬件
  • 内网隧道——隧道技术基础
  • Qt Creator:C++与Python混合编程
  • (21)起落架/可伸缩相机支架
  • C语言:进程间通信
  • Linux(openwrt)下iptables+tc工具实现网络流量限速控制(QoS)
  • 基于面向对象和递归的拦截器设计模式
  • 1.24、定义浅层神经网络架构和算法(matlab)
  • Android11 framework 禁止三方应用开机自启动
  • 正则表达式在Python中的高级应用:从HTML中提取数据
  • c++应用网络编程之四Linux常用的网络IO模型
  • WPF之URI的使用
  • Linux 各目录
  • MySQL-显示所有错误信息
  • Linux——Shell脚本和Nginx反向代理服务器
  • axios请求、和返回数据拦截,统一请求报错提示_012
  • gcc介绍及安装
  • js对象的深浅拷贝
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • Map集合、散列表、红黑树介绍
  • PHP的类修饰符与访问修饰符
  • tensorflow学习笔记3——MNIST应用篇
  • Vue2.x学习三:事件处理生命周期钩子
  • WordPress 获取当前文章下的所有附件/获取指定ID文章的附件(图片、文件、视频)...
  • 记录一下第一次使用npm
  • 容器服务kubernetes弹性伸缩高级用法
  • 写给高年级小学生看的《Bash 指南》
  • Oracle Portal 11g Diagnostics using Remote Diagnostic Agent (RDA) [ID 1059805.
  • 7行Python代码的人脸识别
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • ​十个常见的 Python 脚本 (详细介绍 + 代码举例)
  • $(selector).each()和$.each()的区别
  • (C语言)fread与fwrite详解
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (Ruby)Ubuntu12.04安装Rails环境
  • (翻译)terry crowley: 写给程序员
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (六)c52学习之旅-独立按键
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)
  • (三)模仿学习-Action数据的模仿
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • (原)记一次CentOS7 磁盘空间大小异常的解决过程
  • (源码分析)springsecurity认证授权
  • (转)C#调用WebService 基础
  • (转)大型网站架构演变和知识体系
  • (转载)深入super,看Python如何解决钻石继承难题
  • *p++,*(p++),*++p,(*p)++区别?
  • .net framework 4.0中如何 输出 form 的name属性。
  • .NET I/O 学习笔记:对文件和目录进行解压缩操作
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地中转一个自定义的弱事件(可让任意 CLR 事件成为弱事件)
  • .NET开源快速、强大、免费的电子表格组件
  • :class的用法及应用
  • ??myeclipse+tomcat
  • [ 网络通信基础 ]——网络的传输介质(双绞线,光纤,标准,线序)
  • [1159]adb判断手机屏幕状态并点亮屏幕