IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 几何向量:二维平面非平行直线相交(修正) -> 正文阅读

[网络协议]几何向量:二维平面非平行直线相交(修正)

??????今天突然发现以前做平面非平行直线相交是有问题的,和以前博客关联太多了,必须得专门写一篇纠错。
??????只能说以前刚好没碰到这种情况,太神奇了,代码如下:

    /// <summary>
    /// 计算两射线交点
    /// </summary>
    /// <param name="p1"></param>
    /// <param name="p2"></param>
    /// <param name="p4"></param>
    /// <param name="p3"></param>
    /// <returns></returns>
    private Vector2 CalculateLineCross(Vector2 p1, Vector2 p2, Vector2 p4, Vector2 p3)
    {
        //构建直线参数k和a
        float k1 = (p2.y - p1.y) / (p2.x - p1.x);
        float a1 = p2.y - k1 * p2.x;

        float k2 = (p3.y - p4.y) / (p3.x - p4.x);
        float a2 = p3.y - k2 * p3.x;
        //根据求解计算交点
        float y = (k2 * a1 - k1 * a2) / (k2 - k1);
        float x = 0;
        if (k1 != 0)
        {
            x = (y - a1) / k1;
        }
        else if (k2 != 0)
        {
            x = (y - a2) / k2;
        }
        return new Vector2(x, y);
    }

??????看出问题了吧,如果(p2.x - p1.x),或者(p3.x - p4.x)等于0,那么斜率k就是不存在的,基于这个不存在的斜率k计算的结果就是错的。
??????但是c#数学运算分母=0不报错和刚好实际开发场景又没碰到斜率k不存在的计算结果,就忽视了。
??????所以现在得补全这个计算的适应性,使用直线方程组求解,如下:
在这里插入图片描述
??????那么我们只需要通过四个坐标构建直线方程参数就行了,如下:
在这里插入图片描述

??????接下来构建算法:

 /// <summary>
    /// 计算平面直线相交
    /// </summary>
    /// <param name="p1"></param>
    /// <param name="p2"></param>
    /// <param name="p4"></param>
    /// <param name="p3"></param>
    /// <returns></returns>
    private Vector2 CalculateLineCross(Vector2 p1, Vector2 p2, Vector2 p4, Vector2 p3)
    {
        float[] abc1 = GetLineEquationParams(p1, p2);
        float[] abc2 = GetLineEquationParams(p4, p3);

        float a1 = abc1[0], b1 = abc1[1], c1 = abc1[2];
        float a2 = abc2[0], b2 = abc2[1], c2 = abc2[2];

        float x = (c2 * b1 - c1 * b2) / (a1 * b2 - a2 * b1);
        float y = (c2 * a1 - c1 * a2) / (b1 * a2 - b2 * a1);

        return new Vector2(x, y);
    }
    /// <summary>
    /// 构建平面直线方程参数A、B、C
    /// </summary>
    /// <param name="p1"></param>
    /// <param name="p2"></param>
    /// <returns></returns>
    private float[] GetLineEquationParams(Vector2 p1, Vector2 p2)
    {
        float a, b, c;
        //L1
        if (p1.y == p2.y)
        {
            a = 0;
            b = 1;
            c = -p1.y;
        }
        //L2
        else if (p1.x == p2.x)
        {
            a = 1;
            b = 0;
            c = -p1.x;
        }
        //L3
        else
        {
            float k = (p2.y - p1.y) / (p2.x - p1.x);
            //y-y1=k(x-x1)
            a = k;
            b = -1;
            c = p1.y - k * p1.x;
        }
        return new float[] { a, b, c };
    }

??????刚好以实际项目测试,效果如下:
在这里插入图片描述??????这样就是平面非平行直线相交的修正方法。

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章           查看所有文章
加:2022-05-15 11:44:47  更:2022-05-15 11:45:40 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 0:34:01-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码