【C#】已知有三个坐标点:P0、P1、P2,当满足P3和P4连成的一条直线 与 P0和P1连成一条直线平行且长度一致,该如何计算P3、P4?

问题描述

已知有三个坐标点:P0、P1、P2,当满足P3和P4连成的一条直线 与 P0和P1连成一条直线平行长度一致,该如何计算P3、P4?

 

解决办法

思路一:斜率及点斜式方程

6a6ffa76862f47eb9ac46aa74031d56c.png


# 示例坐标
x0, y0 = 1, 1 # P0坐标
x1, y1 = 4, 4 # P1坐标
x2, y2 = 2, 2 # P2坐标# 计算直线P0P1的斜率
m = (y1 - y0) / (x1 - x0)# 设定P3和P4在x轴上的不同值
x3 = x2 - 1
x4 = x2 + 1# 使用点斜式方程求P3和P4的y坐标
y3 = m * (x3 - x2) + y2
y4 = m * (x4 - x2) + y2# P3和P4的坐标
P3 = (x3, y3)
P4 = (x4, y4)P3, P4

思路二:斜率及两线相交

直线的斜率

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

 

6af594287d3649baa8746d1254c040a5.png

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

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

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

 

注意:两条平行的直线斜率是相等的。

 

如何计算两条直线的垂直交点

15521f07509e4798bcb53b19a91f1433.png

using System;
using System.Numerics; // For handling potential overflow with large numberspublic class LineIntersection
{public static Tuple<double, double>? FindPerpendicularIntersection(Tuple<double, double> p1, Tuple<double, double> p2, Tuple<double, double> p3, Tuple<double, double> p4){double dx1 = p2.Item1 - p1.Item1;double dy1 = p2.Item2 - p1.Item2;double dx2 = p4.Item1 - p3.Item1;double dy2 = p4.Item2 - p3.Item2;// Check for vertical and horizontal linesbool isVerticalLine1 = Math.Abs(dx1) < double.Epsilon;bool isVerticalLine2 = Math.Abs(dx2) < double.Epsilon;bool isHorizontalLine1 = Math.Abs(dy1) < double.Epsilon;bool isHorizontalLine2 = Math.Abs(dy2) < double.Epsilon;if (isVerticalLine1 && isVerticalLine2){// Both lines are vertical, check if they coincideif (Math.Abs(p1.Item1 - p3.Item1) > double.Epsilon)return null; // Lines do not intersect}else if (isVerticalLine1){// Line 1 is vertical, Line 2 is notif (isHorizontalLine2){// Line 2 is horizontal, check intersectionif (p3.Item1 <= p1.Item1 && p1.Item1 <= p4.Item1 || p4.Item1 <= p1.Item1 && p1.Item1 <= p3.Item1)return Tuple.Create(p1.Item1, p3.Item2);elsereturn null;}else{// Calculate intersection of vertical line 1 and non-vertical line 2double m2 = dy2 / dx2;double b2 = p3.Item2 - m2 * p3.Item1;double y = m2 * p1.Item1 + b2;return Tuple.Create(p1.Item1, y);}}else if (isVerticalLine2){// Line 2 is vertical, Line 1 is notif (isHorizontalLine1){// Line 1 is horizontal, check intersectionif (p1.Item1 <= p3.Item1 && p3.Item1 <= p2.Item1 || p2.Item1 <= p3.Item1 && p3.Item1 <= p1.Item1)return Tuple.Create(p3.Item1, p1.Item2);elsereturn null;}else{// Calculate intersection of vertical line 2 and non-vertical line 1double m1 = dy1 / dx1;double b1 = p1.Item2 - m1 * p1.Item1;double y = m1 * p3.Item1 + b1;return Tuple.Create(p3.Item1, y);}}else if (isHorizontalLine1 && isHorizontalLine2){// Both lines are horizontal, check if they coincideif (Math.Abs(p1.Item2 - p3.Item2) > double.Epsilon)return null; // Lines do not intersect}else if (isHorizontalLine1){// Line 1 is horizontal, Line 2 is notdouble m2 = dy2 / dx2;double b2 = p3.Item2 - m2 * p3.Item1;double x = (p1.Item2 - b2) / m2;return Tuple.Create(x, p1.Item2);}else if (isHorizontalLine2){// Line 2 is horizontal, Line 1 is notdouble m1 = dy1 / dx1;double b1 = p1.Item2 - m1 * p1.Item1;double x = (p3.Item2 - b1) / m1;return Tuple.Create(x, p3.Item2);}else{// Neither line is vertical or horizontaldouble det = dx1 * dy2 - dx2 * dy1;if (Math.Abs(det) < double.Epsilon){// Lines are parallel or coincidentreturn null;}double x = (dx1 * (p3.Item2 - p1.Item2) - dy1 * (p3.Item1 - p1.Item1)) / det;double y = (dy2 * (p3.Item1 - p1.Item1) - dx2 * (p3.Item2 - p1.Item2)) / det;return Tuple.Create(x, y);}return null; // Should never reach here}
}

需要注意的是,上述代码没有处理垂直线的情况,因为垂直线的斜率为无穷大。在实际应用中,你需要特别检查分母是否为零,以避免除以零的错误。

此外,如果两条直线实际上是平行的而不是垂直的(即 m1=m2​),则上述代码会抛出异常,因为这样的直线没有交点(除非它们是同一直线,在这种情况下,它们有无数个交点)。

如果你需要一个更完整的实现,包括处理垂直线和重合线的情况,请告知我,我可以进一步详细说明。

思路三:方向向量 

using System;public class CoordinateCalculator
{    public static void Main(string[] args){// 坐标1、坐标2、坐标3double[] coord1 = { 1.0, 2.0 };double[] coord2 = { 4.0, 6.0 };double[] coord3 = { 7.0, 8.0 };// 计算坐标4和坐标5double[][] results = CalculateCoordinates(coord1, coord2, coord3);// 输出结果Console.WriteLine("坐标4: (" + results[0][0] + ", " + results[0][1] + ")");Console.WriteLine("坐标5: (" + results[1][0] + ", " + results[1][1] + ")");}public static double[][] CalculateCoordinates(double[] coord1, double[] coord2, double[] coord3){// 计算坐标1和坐标2连成的直线的方向向量double dx = coord2[0] - coord1[0];double dy = coord2[1] - coord1[1];// 计算坐标1和坐标2之间的距离double distance = Math.Sqrt(dx * dx + dy * dy);// 归一化方向向量double directionX = dx / distance;double directionY = dy / distance;// 坐标4和坐标5是沿着方向向量和反方向向量的点double[] coord4 = { coord3[0] + directionX * distance, coord3[1] + directionY * distance };double[] coord5 = { coord3[0] - directionX * distance, coord3[1] - directionY * distance };return new double[][] { coord4, coord5 };}
}

 

注意:上述只是参考,具体的实现还需自己计算。

 

 

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

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

相关文章

leetcode力扣_二分查找

69.x的平方根 给你一个非负整数 x &#xff0c;计算并返回 x 的 算术平方根 。由于返回类型是整数&#xff0c;结果只保留 整数部分 &#xff0c;小数部分将被 舍去 。注意&#xff1a;不允许使用任何内置指数函数和算符&#xff0c;例如 pow(x, 0.5) 或者 x ** 0.5 。 示例 1&…

数据结构——线性表(循环链表)

一、循环链表定义 将单链表中终端结点的指针端由空指针改为指向头结点&#xff0c;就使整个单链表形成一 个环&#xff0c;这种头尾相接的单链表称为单循环链表&#xff0c;简称循环链表(circular linked list)。 循环链表解决了一个很麻烦的问题。如何从当中一 个结点出发&am…

C# 智慧大棚nmodbus4

窗体 &#xff1a;图表&#xff08;chart&#xff09;&#xff1a; 下载第三方&#xff1a; nmodbus4:可以实现串口直连&#xff0c;需要创建串口对象设置串口参数配置Serialport 如果需要把串口数据表通过tcp进行网口传递 需要创建tcpclient对象 ModbusSerialMaster master; /…

爬虫(二)——爬虫的伪装

前言 本文是爬虫系列的第二篇文章&#xff0c;主要讲解关于爬虫的简单伪装&#xff0c;以及如何爬取B站的视频。建议先看完上一篇文章&#xff0c;再来看这一篇文章。要注意的是&#xff0c;本文介绍的方法只能爬取免费视频&#xff0c;会员视频是无法爬取的哦。 爬虫的伪装 …

【Arduino IDE】安装及开发环境、ESP32库

一、Arduino IDE下载 二、Arduino IDE安装 三、ESP32库 四、Arduino-ESP32库配置 五、新建ESP32-S3N15R8工程文件 乐鑫官网 Arduino官方下载地址 Arduino官方社区 Arduino中文社区 一、Arduino IDE下载 ESP-IDF、MicroPython和Arduino是三种不同的开发框架&#xff0c;各自适…

基于Web的特产美食销售系统的设计与实现

&#x1f497;博主介绍&#x1f497;&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示&#xff1a;文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…

SpringBoot框架学习笔记(二):容器功能相关注解详解

1 Spring 注入组件的注解 Component、Controller、 Service、Repository这些在 Spring 中的传统注解仍然有效&#xff0c;通过这些注解可以给容器注入组件 2 Configuration 2.1 应用实例 需求说明: 演示在 SpringBoot, 如何通过Configuration 创建配置类来注入组件 回顾…

客户端与服务器通讯详解(3):如何选择合适的通讯方式

上篇文章中&#xff0c;我们讲解了客户端与服务器通讯详解&#xff08;2&#xff09;&#xff1a;12种常见通讯方式&#xff0c;重点讲解了http、websocket和RESTful API三种&#xff0c;本文我们继续讲解如何依据场景选择最合适的通讯方式。欢迎友友们点赞评论。 一、客户端服…

微软研究人员为电子表格应用开发了专用人工智能LLM

微软的 Copilot 生成式人工智能助手现已成为该公司许多软件应用程序的一部分。其中包括 Excel 电子表格应用程序&#xff0c;用户可以在其中输入文本提示来帮助处理某些选项。微软的一组研究人员一直在研究一种新的人工智能大型语言模型&#xff0c;这种模型是专门为 Excel、Go…

PDF文件无法编辑?3步快速移除PDF编辑限制

正常来说,我们通过编辑器打开pdf文件后,就可以进行编辑了&#xff61;如果遇到了打开pdf却不能编辑的情况,那有可能是因为密码或是扫描件的原因&#xff61;小编整理了一些pdf文件无法编辑&#xff0c;以及pdf文件无法编辑时我们要如何处理的方法&#xff61;下面就随小编一起来…

JDK新特性(Lambda表达式,Stream流)

Lambda表达式&#xff1a; Lambda 表达式背后的思想是函数式编程&#xff08;Functional Programming&#xff09;思想。在传统的面向对象编程中&#xff0c;程序主要由对象和对象之间的交互&#xff08;方法调用&#xff09;构成&#xff1b;而在函数式编程中&#xff0c;重点…

Vscode中Github copilot插件无法使用(出现感叹号)解决方案

1、击扩展或ctrl shift x ​​​​​​​ 2、搜索查询或翻找到Github compilot 3、点击插件并再左侧点击登录github 点击Sign up for a ... 4、跳转至github登录页&#xff0c;输入令牌完成登陆后返回VScode 5、插件可以正常使用

Android Framework学习笔记(4)----Zygote进程

Zygote的启动流程 Init进程启动后&#xff0c;会加载并执行init.rc文件。该.rc文件中&#xff0c;就包含启动Zygote进程的Action。详见“RC文件解析”章节。 根据Zygote对应的RC文件&#xff0c;可知Zygote进程是由/system/bin/app_process程序来创建的。 app_process大致处…

好用的AI搜索引擎

1. 360AI 搜索 访问 360AI 搜索: https://www.huntagi.com/sites/1706642948656.html 360AI 搜索介绍&#xff1a; 360AI 搜索&#xff0c;新一代智能答案引擎&#xff0c;值得信赖的智能搜索伙伴&#xff0c;为复杂搜索提供专业支持&#xff0c;解锁更相关、更全面的答案。AI…

pyspark使用 graphframes创建图的方法

1、安装graphframes的步骤 1.1 查看 spark 和 scala版本 在终端输入&#xff1a; spark-shell --version 查看spark 和scala版本 1.2 在maven库中下载对应版本的graphframes https://mvnrepository.com/artifact/graphframes/graphframes 我这里需要的是spark 2.4 scala 2.…

古建筑白蚁监测预警系统解决方案

一、概述 白蚁是世界五大害虫之一&#xff0c;俗称“无牙老虎”&#xff0c;能够破坏房屋建筑、园林绿地、农作物等&#xff0c;特别是木结构和砖木结构的古建筑。白蚁的啃食行为会对古建筑造成严重的损坏&#xff0c;严重时甚至会导致建筑倒塌&#xff0c;严重威胁古建筑的安全…

人工智能导论-专家系统

专家系统 概述 本章主要介绍专家系统的概念、原理&#xff0c;创建过程&#xff0c;并补充知识发现与数据挖掘内容 **重点&#xff1a;**专家系统的工作原理和体系结构,知识获取的过程和模式 **难点&#xff1a;**如何设计和创建专家系统 AI第2次高峰(60年代) - 费根鲍姆 …

TCP与UDP网络编程

网络通信协议 java.net 包中提供了两种常见的网络协议的支持: UDP&#xff1a;用户数据报协议(User Datagram Protocol)TCP&#xff1a;传输控制协议(Transmission Control Protocol) TCP协议与UDP协议 TCP协议 TCP协议进行通信的两个应用进程&#xff1a;客户端、服务端 …

昇思25天学习打卡营第16天 | Vision Transformer图像分类

昇思25天学习打卡营第16天 | Vision Transformer图像分类 文章目录 昇思25天学习打卡营第16天 | Vision Transformer图像分类Vision Transform&#xff08;ViT&#xff09;模型TransformerAttention模块Encoder模块 ViT模型输入 模型构建Multi-Head Attention模块Encoder模块Pa…

BiLSTM 实现股票多变量时间序列预测(PyTorch版)

前言 系列专栏:【深度学习&#xff1a;算法项目实战】✨︎ 涉及医疗健康、财经金融、商业零售、食品饮料、运动健身、交通运输、环境科学、社交媒体以及文本和图像处理等诸多领域&#xff0c;讨论了各种复杂的深度神经网络思想&#xff0c;如卷积神经网络、循环神经网络、生成对…