【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://www.rhkb.cn/news/378626.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pytorch中一些最基本函数和类

1.Tensor操作 Tensor是PyTorch中最基本的数据结构&#xff0c;类似于NumPy的数组&#xff0c;但可以在GPU上运行加速计算。 示例&#xff1a;创建和操作Tensor import torch# 创建一个零填充的Tensor x torch.zeros(3, 3) print(x)# 加法操作 y torch.ones(3, 3) z x y pr…

SEO:6个避免被搜索引擎惩罚的策略-华媒舍

在当今数字时代&#xff0c;搜索引擎成为了绝大多数人获取信息和产品的首选工具。为了在搜索结果中获得良好的排名&#xff0c;许多网站采用了各种优化策略。有些策略可能会适得其反&#xff0c;引发搜索引擎的惩罚。以下是彭博社发稿推广的6个避免被搜索引擎惩罚的策略。 1. 内…

链接追踪系列-07.logstash安装json_lines插件

进入docker中的logstash 容器内&#xff1a; jelexbogon ~ % docker exec -it 7ee8960c99a31e607f346b2802419b8b819cc860863bc283cb7483bc03ba1420 /bin/sh $ pwd /usr/share/logstash $ ls bin CONTRIBUTORS Gemfile jdk logstash-core modules tools x-pack …

本地部署 EVE: Unveiling Encoder-Free Vision-Language Models

本地部署 EVE: Unveiling Encoder-Free Vision-Language Models 0. 引言1. 快速开始2. 运行 Demo 0. 引言 EVE (Encoder-free Vision-language model) 是一种创新的多模态 AI 模型&#xff0c;主要特点是去除了传统视觉语言模型中的视觉编码器。 核心创新 架构创新&#xff…

【python虚拟环境管理】【mac m3】 使用pipx安装poetry

文章目录 一. 安装 pipx二. 安装Poetry1. 安装2. advanced 操作 官网文档&#xff1a;https://python-poetry.org/docs/ pipx介绍文档&#xff1a;https://blog.51cto.com/u_15064632/2570626 一. 安装 pipx pipx 用于全局安装 Python 命令行应用程序&#xff0c;同时在虚拟环…

[ACM独立出版] 2024年虚拟现实、图像和信号处理国际学术会议(VRISP 2024,8月2日-4)

2024年虚拟现实、图像和信号处理国际学术会议&#xff08;VRISP 2024&#xff09;将于2024年8月2-4日在中国厦门召开。 VRISP 2024将围绕“虚拟现实、图像和信号处理”的最新研究领域&#xff0c;为来自国内外高等院校、科学研究所、企事业单位的专家、教授、学者、工程师等提供…

二次开发源码 借贷系统uniapp/借贷认证系统/小额信贷系统/工薪贷APP/资金贷系统h5

前端&#xff1a;UNIAPP 后端&#xff1a;ThinkPHP 数据库&#xff1a; Mysql 前端使用的uniapp 可以打包APP H5 小程序 系统提供了完善的网络借贷体系&#xff0c;为金融中介平台提供从获客到贷后管理全流程服务&#xff0c;解决了借贷手续繁琐、流程缓慢等问题 此源码为运营…

解决一下git clone失败的问题

1&#xff09;.不开梯子&#xff0c;我们用https克隆 git clone https://github.com 报错&#xff1a; Failed to connect to github.com port 443 after 2091 ms: Couldnt connect to server 解决办法&#xff1a; 开梯子&#xff0c;然后# 注意修改成自己的IP和端口号 gi…

el-table的selection多选表格改为单选

需求场景: 选择表格数据时&#xff0c;需要控制单条数据的操作按钮是否禁用。 效果图: html代码: <div><el-tableref"multipleTable":data"tableData"tooltip-effect"dark"style"width: 100%"selection-change"handl…

【笔记】nginx命令

查看 启动 通过./nginx启动nginx之后 可以在虚拟机中进入/usr/local/nginx/html 去查看cat index.html 也就是此页面的源代码 进入vim /etc/profile 配置完之后保存退出 source /etc/profile 手动重载资源 随后就可以在任意位置重载资源了 nginx -s reload 部署静态资源就把静…

el-table表格操作列错行处理

解决方法&#xff1a; <style>::v-deep .el-table th.el-table__cell > .cell {white-space: nowrap !important;} </style>

IDEA启动Web项目总是提示端口占用

文章目录 IDEA启动Web项目总是提示端口占用一、前言1.场景2.环境 二、正文1.场景一:真端口占用2. 场景二:假端口占用 IDEA启动Web项目总是提示端口占用 一、前言 1.场景 IDEA启动Web项目总是提示端口占用&#xff1a; 确实是端口被占用&#xff0c;比如&#xff1a;没有正常…

在GPU上运行PyTorch

文章目录 1、查看GPU的CUDA版本2、下载CUDA版本3、安装cuDNN4、配置CUDA环境变量5、安装配置Anaconda6、使用Anaconda7、pycharm导入虚拟环境8、安装带GPU的PyTorch⭐9、总结 &#x1f343;作者介绍&#xff1a;双非本科大三网络工程专业在读&#xff0c;阿里云专家博主&#x…

2024.7.16日 最新版 docker cuda container tookit下载!

nvidia官方指导 https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html 其实就是这几个命令&#xff0c;但是有墙&#xff1a; curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/shar…

SpringBoot3.3.0升级方案

本文介绍了由SpringBoot2升级到SpringBoot3.3.0升级方案&#xff0c;新版本的升级可以解决旧版本存在的部分漏洞问题。 一、jdk17下载安装 1、下载 官网下载地址 Java Archive Downloads - Java SE 17 Jdk17下载后&#xff0c;可不设置系统变量java_home&#xff0c;仅在id…

【C++】类和对象的基本概念与使用

本文通过面向对象的概念以及通俗易懂的例子介绍面向对象引出类和对象。最后通过与之有相似之处的C语言中的struct一步步引出C中的类的定义方式&#xff0c;并提出了一些注意事项&#xff0c;最后描述了类的大小的计算方法。 一、什么是面向对象&#xff1f; 1.面向对象的概念 …

浅谈Git

一&#xff1a;什么是 git git一种开源的分布式版本控制系统&#xff0c;可以有效、高速地处理从很小到非常大的项目版本管理。 下图是 git 的一个工作流程简图 二&#xff1a;什么是 分布/集中式版本控制系统 软件开发过程中&#xff0c;要解决多人协作的问题&#xff0c;需要…

简单实现一个本地ChatGPT web服务(langchain框架)

简单实现一个本地ChatGPT 服务&#xff0c;用到langchain框架&#xff0c;fastapi,并且本地安装了ollama。 依赖安装&#xff1a; pip install langchain pip install langchain_community pip install langchain-cli # langchain v0.2 2024年5月最新版本 pip install bs4 pi…

which 命令在Linux中是一个快速查找可执行文件位置的工具

文章目录 0、概念1、which --help2、which命令解释 0、概念 which命令用于查找命令的可执行文件的路径which 命令在 Linux 中用于查找可执行命令的完整路径。当你在 shell 中输入一个命令时&#xff0c;shell 会在环境变量 $PATH 定义的目录列表中查找这个命令。which 命令可以…

JUC 包中的 Atomic 原子类总结

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…