已知空间中有直线lineA和直线lineB,求两直线间最近的两点和距离。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class TwoLineMinDis : MonoBehaviour
{[SerializeField]private Vector3[] _lineA = new Vector3[2];[SerializeField]private Vector3[] _lineB = new Vector3[2];void Update(){#region 推算过程/** 假设_lineA上垂足点为 Pa,距离起点的距离为X,Pa=_lineA[0]+dirA*X;* 假设_lineB上垂足点为 Pb,距离起点的距离为Y,Pb=_lineB[0]+dirB*Y;* 则垂足向量为dirAB,dirAB=Pb-Pa, dirAB=_lineB[0]+dirB*Y-_lineA[0]-dirA*X;* 垂足向量dirAB垂直于_lineA和_lineB* dirAB.dirA=0 dirAB.dirB=0* (_lineB[0]+dirB*Y-_lineA[0]-dirA*X).dirA=0* (_lineB[0]+dirB*Y-_lineA[0]-dirA*X).dirB=0* _lineB[0].dirA+dirB.dirA*Y-lineA[0].dirA-dirA.dirA*X=0* _lineB[0].dirB+dirB.dirB*Y-lineA[0].dirB-dirA.dirB*X=0* X=(_lineB[0].dirA+dirB.dirA*Y-lineA[0].dirA)/dirA.dirA* Y=(_lineA[0].dirB+dirA.dirB*X-_lineB[0].dirB)/dirB.dirB;* * _lineA和_lineB存在三种情况 1.空间垂直   2.空间平行  3.空间不平行也不垂直* 1.空间垂直 则dirA.dirB=0*       _lineB[0].dirA+dirB.dirA*Y-lineA[0].dirA-dirA.dirA*X=0*       _lineB[0].dirB+dirB.dirB*Y-lineA[0].dirB-dirA.dirB*X=0*       _lineB[0].dirA-lineA[0].dirA-dirA.dirA*X=0*       _lineB[0].dirB+dirB.dirB*Y-lineA[0].dirB=0*       X=(_lineB[0].dirA-_lineA[0].dirA)/dirA.dirA*       Y=(_lineA[0].dirB-_lineB[0].dirB)/dirB.dirB;* 2.空间平行 则dirA.dirB=1*       取_lineA的起点为垂足,则X=0 *       _lineB[0].dirB+dirB.dirB*Y-lineA[0].dirB=0*       Y=(_lineA[0].dirA-_lineB[0].dirA)/dirB.dirA*       Y=(_lineA[0].dirB-_lineB[0].dirB)/dirB.dirB*       * 3.空间不平行也不垂直*       _lineB[0].dirA+dirB.dirA*Y-lineA[0].dirA-dirA.dirA*X=0*       _lineB[0].dirB+dirB.dirB*Y-lineA[0].dirB-dirA.dirB*X=0*       X=(_lineB[0].dirA+dirB.dirA*Y-lineA[0].dirA)/dirA.dirA*       Y=(_lineA[0].dirB+dirA.dirB*X-_lineB[0].dirB)/dirB.dirB;*       *           dirB.dirB(_lineA[0].dirA - _lineB[0].dirA) + dirA.dirB(_lineB[0].dirB-_lineA[0].dirB)*       X=  ———————————————————————————————————————————*                                dirA.dirB * dirA.dirB - dirA.dirA * dirB.dirB*           dirA.dirA(_lineA[0].dirB - _lineB[0].dirB) + dirA.dirB(_lineB[0].dirA-_lineA[0].dirA)*       Y=  ———————————————————————————————————————————*                                dirA.dirA * dirB.dirB - dirA.dirB * dirA.dirB*/#endregionVector3 dirLineA = _lineA[1] - _lineA[0];Vector3 dirLineB = _lineB[1] - _lineB[0];Vector3 posLineA = Vector3.zero;Vector3 posLineB = Vector3.zero;float dot = Vector3.Dot(dirLineA, dirLineB);//两向量空间垂直if (dot == 0){posLineA = _lineA[0] + dirLineA * (Vector3.Dot(_lineB[0], dirLineA) - Vector3.Dot(_lineA[0], dirLineA)) / Vector3.Dot(dirLineA, dirLineA);posLineB = _lineB[0] + dirLineB * (Vector3.Dot(_lineA[0], dirLineB) - Vector3.Dot(_lineB[0], dirLineB)) / Vector3.Dot(dirLineB, dirLineB);}//两向量空间平行else if (dot == 1){posLineA = _lineA[0];posLineB = _lineB[0] + dirLineB * (Vector3.Dot(_lineA[0], dirLineA) - Vector3.Dot(_lineB[0], dirLineA)) / Vector3.Dot(dirLineB, dirLineA);}//两向量不平行也不垂直else{posLineA = _lineA[0] + dirLineA * (Vector3.Dot(dirLineB, dirLineB) * (Vector3.Dot(_lineA[0], dirLineA) - Vector3.Dot(dirLineA, _lineB[0])) + Vector3.Dot(dirLineA, dirLineB) * (Vector3.Dot(_lineB[0], dirLineB) - Vector3.Dot(_lineA[0], dirLineB)))/ (Vector3.Dot(dirLineA, dirLineB) * Vector3.Dot(dirLineA, dirLineB) - Vector3.Dot(dirLineA, dirLineA) * Vector3.Dot(dirLineB, dirLineB));posLineB = _lineB[0] + dirLineB * (Vector3.Dot(dirLineA, dirLineA) * (Vector3.Dot(_lineA[0], dirLineB) - Vector3.Dot(_lineB[0], dirLineB)) + Vector3.Dot(dirLineA, dirLineB) * (Vector3.Dot(_lineB[0], dirLineA) - Vector3.Dot(_lineA[0], dirLineA)))/ (Vector3.Dot(dirLineA, dirLineA) * Vector3.Dot(dirLineB, dirLineB) - Vector3.Dot(dirLineA, dirLineB) * Vector3.Dot(dirLineA, dirLineB));}if (Vector3.Dot(posLineA - _lineA[0], dirLineA) < 0){posLineA = _lineA[0]; //起点到目标点方向 和 线的方向不一致,则点在线段外面}else if (Vector3.Dot(posLineA - _lineA[1], dirLineA) > 0){posLineA = _lineA[1];//终点到目标点方向 和 线的方向一致,则点在线段外面}if (Vector3.Dot(posLineB - _lineB[0], dirLineB) < 0){posLineB = _lineB[0]; //起点到目标点方向 和 线的方向不一致,则点在线段外面}else if (Vector3.Dot(posLineB - _lineB[1], dirLineB) > 0){posLineB = _lineB[1];//终点到目标点方向 和 线的方向一致,则点在线段外面}Debug.DrawLine(_lineA[0], _lineA[1], Color.red);Debug.DrawLine(_lineB[0], _lineB[1], Color.red);Debug.DrawLine(posLineA, posLineB, Color.yellow);}
}

空间两直线最近的两个点、距离相关推荐

  1. 分别已知两直线上的两点,求两直线交点

    分别已知两直线上的两点,求两直线交点 求两直线的交点是初中数学的简单问题了,在直角坐标系中直线有很多种表示方式.同时我们知道两点确定一条直线,已知两点坐标自然能求出直线坐标,已知两直线坐标自然能求出两 ...

  2. 三维空间碰撞问题;空间中两直线的最短距离及最近点

    已知空间中两线段,如果它们无限变粗,判断是否相交.(主要讨论不在同一平面的情况) 线段AB 线段CD 问题的关键是求出这两条任意直线之间的最短距离,以及在这个距离上的两线最接近点坐标,判断该点是否在线 ...

  3. 两直线平行交叉相乘_人教版初中数学七年级下册 平行线判定2公开课优质课课件教案视频...

    平 行 线 的 判 定 一.教材分析 1.主要内容及其地位 本节的主要内容是平行线的判定公理及两个判定定理,由分析画平行线的过程得知,画平行线实际上就是画相等的同位角,由此得到平行线的判定公理--&q ...

  4. 三维空间两直线/线段最短距离、线段计算算法

    设有两空间线段 1. Ls L_s,其起点.终点坐标为 s0.s1 s_0.s_1 ,方向向量 u⃗ =s1−s0 \vec u = s_1-s_0 2. Lt L_t,其起点.终点坐标为 t0.t1 ...

  5. 向量叉乘求三维空间中两直线(或线段)的交点

    1.2D空间的直线相交 在二维空间中,利用两个直线方程y = kx + b我们可以直接计算出交点,但是这种方法麻烦了些,并且套用到三维空间用公式就更麻烦了,接下来介绍的是如何利用向量叉乘求出直线交点. ...

  6. 两直线平行交叉相乘_计算几何算法5. 直线、线段和平面相交(2D和3D)

    直线和线段相交 平面相交 直线-平面相交 两平面相交 三个平面相交 实现 intersect2D_2Segments() inSegment() intersect3D_SegmentPlane() ...

  7. 电子计算机应用地质地貌,岩土基础整理 一、高数24 1、空间解析几何与向量代数 两点间的距离,向量数量积,向量向量积,平面方程,两平面夹角,点到平面的距离,点... - 雪球...

    来源:雪球App,作者: 超级奶爸xujunhorse,(https://xueqiu.com/3442498082/131579485) 一.高数24 1.空间解析几何与向量代数 两点间的距离,向量 ...

  8. 二维平面内两直线交点计算

    对于几何关系的计算,两点确定一条直线,两直线的交点的计算经常见到.最简单matlab编程方法是通过两点列出直线方程,使用matlab工具解方程.但是计算时发现速度较为缓慢. 表达式定义 空间直线的表达 ...

  9. Java黑皮书课后题第3章:*3.25(几何:交点)第一条直线上面的两个点是(x1,y1)(x2,y2),第二条(x3,y3)(x4,y4),通过Cramer规则求出线性方程组

    *3.25(几何:交点)第一条直线上面的两个点是(x1,y1)(x2,y2),第二条(x3,y3)(x4,y4),通过Cramer规则求出线性方程组 题目 题目概述 题目给出的线性方程组 Cramer ...

最新文章

  1. Android深度探索--HAL与驱动开发----第一章读书笔记
  2. 2021级山西高考成绩查询时间,2021山西高考成绩什么时候出
  3. SourceTree 3.0.17如何跳过注册进行安装? — git图形化工具(一)
  4. 计算机二级python用什么书-计算机二级Python考试有什么学习资料?
  5. 关闭页面那点事儿...
  6. python读取指定行到最后一行_python读取文件最后一行两种方法
  7. container and Injection
  8. mpvue解析富文本mpvue-wxParse
  9. jQuery调用指定iframe页面内的方法
  10. mysql将公历农历转换_SQL 日期转换(阳历转阴历)
  11. linux samba 拒绝访问,Samba拒绝访问的解决方式
  12. 5款在线制图工具分享,快来看看!
  13. 微信开放平台注册和添加应用操作指南
  14. aspen稳态导出动态_Aspen Dynamic 针对精馏塔的模拟设计过程详解 | APP技术稿第1期...
  15. 为什么有了IP地址还要有MAC地址??
  16. node爬取app数据_使用node.js如何爬取网站数据
  17. MySQL 8.0 Command Line Client 不能打开或者闪退
  18. flutter 登录和退出登录_Flutter从入门到奔溃(一):撸一个登录界面
  19. web登录应用加密狗
  20. 反反爬之破解同程旅游加密参数!你学会了吗?

热门文章

  1. 数学语言缩写 c连续d可导,数学分析(1)复习题
  2. 51单片机常用波特率设置
  3. 为什么浏览器请求一个接口有两次其中一次是Request Method: OPTIONS
  4. android 分区 f2fs,一加5 切换data分区为f2fs格式,随机读写暴涨8倍!30秒开机,APP秒开!...
  5. SAM9X60 curiosity开发板,U盘拷贝文件到开发板
  6. 以管理为轴心 为IT服务保驾护航——北京赛特百货有限公司
  7. Python3爬取国家统计局官网2019年全国所有城市(2020年更新)
  8. 喜闻乐见的 2048 游戏 (附源码)
  9. 如何查看GCC编译器版本
  10. matlab函数用法