空间两直线最近的两个点、距离

article/2025/8/31 16:56:01

已知空间中有直线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);}
}

 


http://chatgpt.dhexx.cn/article/RaY93orb.shtml

相关文章

计算空间中两线段之间的距离

最近在建立气凝胶的有限元模型中需要计算每两根纤维&#xff08;线段&#xff09;之间的距离&#xff0c;最初参考的两篇文章确实提供了关于一些数值方法的计算思路&#xff08;文章1 && 文章2&#xff09;&#xff0c;但忽略了线段距离问题的理论推导&#xff0c;导致…

空间两个直线之间的距离和公垂线

已知 直线1&#xff1a;直线任意一点 P 1 P_1 P1​直线方向 V 1 V_1 V1​ (单位向量) 直线2&#xff1a;直线任意一点 P 2 P_2 P2​直线方向 V 2 V_2 V2​ (单位向量) 求解过程 需要用到点到直线的距离和垂足相关内容&#xff0c;参考 这里 下文中 ⋅ \centerdot ⋅代表点…

两点间距离、点到直线距离、点到线段距离、线段到线段距离

两点之间的距离 直接运用两点间距离公式 (x2-x1)^ 2(y2-y1)^ 2开根号 //两点间距离 double getDistancePP(Point a,Point b) { //这个代码是部分代码,有些逻辑没有展现完全,大家往下看!Point c(b.x-a.x,b.y-a.y);//返回一个新的点return c.abs();//取模 }点到直线距离 通常给出…

两平行平面间的距离

两平行平面方程为AxByCzD10&#xff0c;AxByCzD20 转载于:https://www.cnblogs.com/qiu-hua/p/8006040.html

两条平行线相交于一点

2019独角兽企业重金招聘Python工程师标准>>> 欧几里德几何说&#xff0c;两条平行的直线永远无法相交&#xff0c;爱因斯坦站在宇宙空间的角度猜测两条平行线有可能能相交&#xff0c;但到底如何相交&#xff0c;爱因斯坦也没有给出证明&#xff0c;科学家们至今也无…

【opencv】两条平行线之间的距离

问题&#xff1a;一张输入图片&#xff0c;图片上有两条平行线&#xff0c;求出这两条平行线之间的距离 解决思路&#xff1a; 1. 对图像中的直线进行细化 2. 提取直线的轮廓坐标 3. 对轮廓上的坐标进行直线集合&#xff0c;从而得到直线方程 4. 计算两条直线之间的距离 …

OpenCV计算两条平行线之间的距离

代码来自www.opencvchina.com #include "cv.h" #include "highgui.h" #include "cxcore.h" #include <stdlib.h> #include <stdio.h>#ifndef LINESDISHEADER#define LINESDISHEADER//对输入图像进行细化 void ThinImage(IplImage* s…

用vue实现tab切换

用vue实现tab切换 html代码 <div id"app"><ul class"tab-tilte"><li click"cur0" :class"{active:cur0}">html</li><li click"cur1" :class"{active:cur1}">css</li><li…

tab切换(用jQuery实现)?

页面中经常用到的tab栏&#xff0c;来分类展示内容 我认为掌握tab栏切换算是从静态页面到动态页面所迈出的第一步&#xff0c;并且在以后的工作中(jQuery框架开发)会作为jQuery中的常用事件和方法&#xff0c;反复的使用&#xff0c;所以掌握tab栏切换至关重要&#xff01;&am…

JQUERY实现TAB切换

博主是一枚前端小菜鸟&#xff0c;因为挺长时间没接触页面布局了&#xff0c;居然连tab栏切换都给忘了&#xff0c;后来博主看了一些前端资料还有书&#xff0c;发现网上的很多方法都杂乱无章&#xff0c;看的云里雾里的&#xff0c;冗余代码太多&#xff0c;这让新手小白会很苦…

React实现tab切换

下面来编写一个tab选项卡切换效果&#xff0c;效果如下图所示&#xff1a; 下面我放上该组件的代码&#xff1a; import React, { Component } from react; import { Link } from react-router; import ../scss/base.scss; import ../scss/tab.scss;class TabController exten…

vue实现Tab切换功能

在项目开发中&#xff0c;我们经常会碰到Tab切换的功能&#xff0c;而在Vue中想实现这样的功能也应该有很多种&#xff0c;常用的三种应该是 Tab路由切换、Tab动态组件切换、通过v-show设置Tab显示隐藏。每种方法实现起来其实都不难&#xff0c;看看官网介绍或看几篇博客应该就…

tab切换效果

1.效果图 2.分析步骤 1.首先写vue先引入&#xff1a;<script src"https://cdn.jsdelivr.net/npm/vue2.6.14/dist/vue.js"></script> 2.接着写静态布局 3.挂载dom 4.添加指令 5.肯定要储存数据 6. 最后效果实现 3.代码块部分 按步骤操作 1.首先&#xf…

vue中如何实现tab切换功能?

一、v-show控制内容切换 1&#xff09;简单版原理&#xff1a;用点击事件改变num值作为开关&#xff0c;控制tab样式和内容显示隐藏。 2&#xff09;数据渲染原理&#xff1a;主要利用v-for绑定的index来控制&#xff0c;跟上面差不多。 二、组件切换。 知识点主要是vue中is的…

点击tabs切换不同的内容

1.通过v-for遍历posts,然后渲染数据 2.定义currentTabs变量 3.运用computed计算属性 4.点击按钮时&#xff0c;切换下边的内容 5.点击切换tabs时&#xff0c;高亮当前tabs 4.将切换tabs的文件封装成组件&#xff0c;可以使用keep-alive进行缓存数据 5.使用keep-alive触发的生命…

Tab选项卡切换

Tab选项卡切换 基本代码 HTML代码&#xff1a; <div id"notice" class"notice"><!-- 标题--><div id"notice-tit" class"notice-tit"><ul><li><a href"#">公告</a></li>…

【JS实现tab切换】

JavaScript实现tab切换。 点击科技显示图一, 点击探索显示图二。 body部分&#xff1a; <div class"box"><ul><li class"active">科技</li><li>探索</li></ul><ol><li class"active">科…

Tab页面切换

页面效果如图 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta http-equiv"X-UA-Compatible" content"IEedge"> <meta name"viewport" content"widthdevice-…

Vue实现Tab切换效果

通过Vue实现简单的Tab切换 实现思路是点击上方的标题&#xff0c;下方的内容随之发生改变&#xff0c;上方和下方用的是两个块&#xff0c;是兄弟节点&#xff0c;所以需要点击tab标题和下方内容一一对应&#xff0c;基予两个模块若下标相同是一个内容实现的。Tab切换第一步先…

html的tab切换

离开学还有10天了&#x1f630; 今天再水一篇博客 &#xff08;如图&#xff09; 通过点击来切换tab。 具体思路十分简单&#xff0c;将这些都先包含进一个大的div 先是html部分 <div class"body1"><div class"game"><ul><li>…