空间两直线最近的两个点、距离
已知空间中有直线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);}
}
空间两直线最近的两个点、距离相关推荐
- 分别已知两直线上的两点,求两直线交点
分别已知两直线上的两点,求两直线交点 求两直线的交点是初中数学的简单问题了,在直角坐标系中直线有很多种表示方式.同时我们知道两点确定一条直线,已知两点坐标自然能求出直线坐标,已知两直线坐标自然能求出两 ...
- 三维空间碰撞问题;空间中两直线的最短距离及最近点
已知空间中两线段,如果它们无限变粗,判断是否相交.(主要讨论不在同一平面的情况) 线段AB 线段CD 问题的关键是求出这两条任意直线之间的最短距离,以及在这个距离上的两线最接近点坐标,判断该点是否在线 ...
- 两直线平行交叉相乘_人教版初中数学七年级下册 平行线判定2公开课优质课课件教案视频...
平 行 线 的 判 定 一.教材分析 1.主要内容及其地位 本节的主要内容是平行线的判定公理及两个判定定理,由分析画平行线的过程得知,画平行线实际上就是画相等的同位角,由此得到平行线的判定公理--&q ...
- 三维空间两直线/线段最短距离、线段计算算法
设有两空间线段 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 ...
- 向量叉乘求三维空间中两直线(或线段)的交点
1.2D空间的直线相交 在二维空间中,利用两个直线方程y = kx + b我们可以直接计算出交点,但是这种方法麻烦了些,并且套用到三维空间用公式就更麻烦了,接下来介绍的是如何利用向量叉乘求出直线交点. ...
- 两直线平行交叉相乘_计算几何算法5. 直线、线段和平面相交(2D和3D)
直线和线段相交 平面相交 直线-平面相交 两平面相交 三个平面相交 实现 intersect2D_2Segments() inSegment() intersect3D_SegmentPlane() ...
- 电子计算机应用地质地貌,岩土基础整理 一、高数24 1、空间解析几何与向量代数 两点间的距离,向量数量积,向量向量积,平面方程,两平面夹角,点到平面的距离,点... - 雪球...
来源:雪球App,作者: 超级奶爸xujunhorse,(https://xueqiu.com/3442498082/131579485) 一.高数24 1.空间解析几何与向量代数 两点间的距离,向量 ...
- 二维平面内两直线交点计算
对于几何关系的计算,两点确定一条直线,两直线的交点的计算经常见到.最简单matlab编程方法是通过两点列出直线方程,使用matlab工具解方程.但是计算时发现速度较为缓慢. 表达式定义 空间直线的表达 ...
- 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 ...
最新文章
- Android深度探索--HAL与驱动开发----第一章读书笔记
- 2021级山西高考成绩查询时间,2021山西高考成绩什么时候出
- SourceTree 3.0.17如何跳过注册进行安装? — git图形化工具(一)
- 计算机二级python用什么书-计算机二级Python考试有什么学习资料?
- 关闭页面那点事儿...
- python读取指定行到最后一行_python读取文件最后一行两种方法
- container and Injection
- mpvue解析富文本mpvue-wxParse
- jQuery调用指定iframe页面内的方法
- mysql将公历农历转换_SQL 日期转换(阳历转阴历)
- linux samba 拒绝访问,Samba拒绝访问的解决方式
- 5款在线制图工具分享,快来看看!
- 微信开放平台注册和添加应用操作指南
- aspen稳态导出动态_Aspen Dynamic 针对精馏塔的模拟设计过程详解 | APP技术稿第1期...
- 为什么有了IP地址还要有MAC地址??
- node爬取app数据_使用node.js如何爬取网站数据
- MySQL 8.0 Command Line Client 不能打开或者闪退
- flutter 登录和退出登录_Flutter从入门到奔溃(一):撸一个登录界面
- web登录应用加密狗
- 反反爬之破解同程旅游加密参数!你学会了吗?
热门文章
- 数学语言缩写 c连续d可导,数学分析(1)复习题
- 51单片机常用波特率设置
- 为什么浏览器请求一个接口有两次其中一次是Request Method: OPTIONS
- android 分区 f2fs,一加5 切换data分区为f2fs格式,随机读写暴涨8倍!30秒开机,APP秒开!...
- SAM9X60 curiosity开发板,U盘拷贝文件到开发板
- 以管理为轴心 为IT服务保驾护航——北京赛特百货有限公司
- Python3爬取国家统计局官网2019年全国所有城市(2020年更新)
- 喜闻乐见的 2048 游戏 (附源码)
- 如何查看GCC编译器版本
- matlab函数用法