【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.mzph.cn/diannao/48429.shtml

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

相关文章

自适应键盘,自带隐藏键盘的输入框(UITextField)

引言 在iOS开发中&#xff0c;输入框占据着举足轻重的地位。与安卓不同&#xff0c;iOS输入框经常面临键盘遮挡的问题&#xff0c;或者无法方便地取消键盘。为了解决这些问题&#xff0c;有许多针对iOS键盘管理的库&#xff0c;如IQKeyboardManager、TPKeyboardAvoiding和Keyb…

分库分表 [ 技术 ] 指南 ✨

目录 ✨探索 技术 分库分表✨ 数据库分库分表指南 一、什么是分库分表 二、分库分表策略 三、分库分表的实现 四、分库分表的常见问题及解决方案 五、总结 相关面试题目 1. 解释什么是数据库分库分表&#xff0c;以及它的主要目的是什么&#xff1f; 2. 描述垂直分库…

STM32学习(1)--STM32介绍

STM32介绍 1.STM32简介2.ARM3.STM32F103C8T64.外设5.命名规则6.系统结构7.引脚定义8.启动配置9.最小系统电路10.新建工程步骤11.工程架构 课程知识及代码来源均来自b站 江协科技&#xff0c;下学期即将做毕设&#xff0c;需要用到STM32单片机&#xff0c;在这个假期我将持续学…

摸鱼大数据——Spark Structured Steaming——新零售数据分析案例

1、数据源介绍 数据内容 字段说明 2、分析需求 数据清洗需求 清洗需求&#xff1a;1) 将客户id&#xff08;CustomerID&#xff09;不为0的数据保留下来: CustomerID ! 02) 将商品描述&#xff08;Description&#xff09;不为空的数据保留下来: Description !3) 将日期&#…

gds-linkqueue:泛型链式队列

类似于C的queue的泛型容器&#xff0c;初始化、销毁、清空、入队、出队、取队首/尾、队空。 ​​​​​​​ ​​​​​​​

对某次应急响应中webshell的分析

文章前言 在之前处理一起应急事件时发现攻击者在WEB应用目录下上传了webshell&#xff0c;但是webshell似乎使用了某种加密混淆手法&#xff0c;无法直观的看到其中的木马连接密码&#xff0c;而客户非要让我们连接webshell来证实此文件为后门文件且可执行和利用(也是很恼火&a…

fMATLAB中fill函数填充不同区域

只需获取填充区域的边缘信息&#xff0c;函数边缘越详细越好&#xff0c;然后调用fill函数。 fill函数能够根据指定的顶点坐标和填充颜色来绘制多边形或曲线形状&#xff0c;并在其内部填充指定的颜色。这使得在MATLAB中创建具有视觉吸引力的图形变得简单而高效。 fill函数的…

《0基础》学习Python——第二十讲__网路爬虫/<3>

一、用post请求爬取网页 同样与上一节课的get强求的内容差不多&#xff0c;即将requests.get(url,headershead)代码更换成requests.post(url,headershead),其余的即打印获取的内容&#xff0c;如果content-typejson类型的&#xff0c;打印上述代码的请求&#xff0c;则用一个命…

笔记:现代卷积神经网络之VGG

本文为李沐老师《动手学深度学习》笔记小结&#xff0c;用于个人复习并记录学习历程&#xff0c;适用于初学者 神经网络架构设计的模块化 然AlexNet证明深层神经网络卓有成效&#xff0c;但它没有提供一个通用的模板来指导后续的研究人员设计新的网络。 在下面的几个章节中&a…

【Vue】`v-if` 指令详解:条件渲染的高效实现

文章目录 一、v-if 指令概述二、v-if 的基本用法1. 基本用法2. 使用 v-else3. 使用 v-else-if 三、v-if 指令的高级用法1. 与 v-for 一起使用2. v-if 的性能优化 四、v-if 的常见应用场景1. 表单验证2. 弹窗控制 五、v-if 指令的注意事项 Vue.js 是一个用于构建用户界面的渐进式…

Flink调优详解:案例解析(第42天)

系列文章目录 一、Flink-任务参数配置 二、Flink-SQL调优 三、阿里云Flink调优 文章目录 系列文章目录前言一、Flink-任务参数配置1.1 运行时参数1.2 优化器参数1.3 表参数 二、Flink-SQL调优2.1 mini-batch聚合2.2 两阶段聚合2.3 分桶2.4 filter去重&#xff08;了解&#xf…

【中项】系统集成项目管理工程师-第3章 信息技术服务-3.4服务标准化

前言&#xff1a;系统集成项目管理工程师专业&#xff0c;现分享一些教材知识点。觉得文章还不错的喜欢点赞收藏的同时帮忙点点关注。 软考同样是国家人社部和工信部组织的国家级考试&#xff0c;全称为“全国计算机与软件专业技术资格&#xff08;水平&#xff09;考试”&…

持续集成02--Linux环境更新/安装Java新版本

前言 在持续集成/持续部署&#xff08;CI/CD&#xff09;的旅程中&#xff0c;确保开发环境的一致性至关重要。本篇“持续集成02--Linux环境更新/安装Java新版本”将聚焦于如何在Linux环境下高效地更新或安装Java新版本。Java作为广泛应用的编程语言&#xff0c;其版本的更新对…

XLua原理(一)

项目中活动都是用xlua开发的&#xff0c;项目周更热修也是用xlua的hotfix特性来做的。现研究底层原理&#xff0c;对于项目性能有个更好的把控。 本文认为看到该文章的人已具备使用xlua开发的能力&#xff0c;只研究介绍下xlua的底层实现原理。 一.lua和c#交互原理 概括&…

用程序画出三角形图案

创建各类三角形图案 直角三角形&#xff08;左下角&#xff09; #include <iostream> using namespace std;int main() {int rows;cout << "输入行数: ";cin >> rows;for(int i 1; i < rows; i){for(int j 1; j < i; j){cout << &…

003uboot目录分析和两个阶段

我们都知道s3c2440是一个soc&#xff0c;内含cpu和各种控制器、片内的RAM&#xff0c;他的CPU是arm920t。 我们先来分析一下uboot原码的各个目录 1.uboot目录分析 board&#xff1a;board里存放的是支持各个开发板的文件&#xff0c;包括链接脚本 common: common目录中存放的…

graham 算法计算平面投影点集的凸包

文章目录 向量的内积&#xff08;点乘&#xff09;、外积&#xff08;叉乘&#xff09;确定旋转方向numpy 的 cross 和 outernp.inner 向量与矩阵计算示例np.outer 向量与矩阵计算示例 python 示例生成样例散点数据图显示按极角排序的结果根据排序点计算向量转向并连成凸包 基本…

set、map、multiset、multimap容器介绍和常用接口使用

文章目录 前言一、set容器二、multiset三、map四、multimap 前言 1、set、map、 multiset、 multimap都是基于红黑树实现的容器。 2、set、multiset都使用头文件#include<set>,map、multimap都是使用头文件#include<map> 一、set容器 1、set容器的介绍 C标准库中的…

pytest常用命令行参数解析

简介&#xff1a;pytest作为一个成熟的测试框架&#xff0c;它提供了许多命令行参数来控制测试的运行方式&#xff0c;以配合适用于不同的测试场景。例如 -x 可以用于希望出现错误就停止&#xff0c;以便定位和分析问题。–rerunsnum适用于希望进行失败重跑等个性化测试策略。 …

【BUG】已解决:AttributeError: ‘str‘ object has no attribute ‘get‘

已解决&#xff1a;AttributeError: ‘str‘ object has no attribute ‘get‘ 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身&#xff0c;就职于医疗科技公司&#xff0c;热衷分享知识&#xff0c…