3 维空间中点与线之间的最短距离

2024-01-11

我试图使用 numpy 或 python 中的任何东西找到从点 (x0,y0,z0) 到由 (x1,y1,z1) 和 (x2,y2,z2) 连接的线的最小距离。不幸的是,我在网上能找到的所有内容都与二维空间有关,而且我对 python 还很陌生。任何帮助将不胜感激。提前致谢!


StackOverflow 不支持 Latex,因此我将忽略一些数学知识。一种解决方案来自这样的想法:如果你的线跨越了点p and q,那么该线上的每个点都可以表示为t*(p-q)+q对于一些实值t。然后您想要最小化给定点之间的距离r以及该线上的任何点,距离很方便地是单个变量的函数t,所以标准的微积分技巧效果很好。考虑以下示例,该示例计算之间的最小距离r和跨越的线p and q。通过手工,我们知道答案应该是1.

import numpy as np

p = np.array([0, 0, 0])
q = np.array([0, 0, 1])
r = np.array([0, 1, 1])

def t(p, q, r):
    x = p-q
    return np.dot(r-q, x)/np.dot(x, x)

def d(p, q, r):
    return np.linalg.norm(t(p, q, r)*(p-q)+q-r)

print(d(p, q, r))
# Prints 1.0

这在任何维度上都可以正常工作,包括 2、3 和 10 亿。唯一真正的限制是p and q必须是不同的点,以便它们之间有一条独特的线。

我在上面的示例中分解了代码,以便展示我从数学角度思考它的方式所产生的两个不同的步骤(发现t然后计算距离)。这不一定是最有效的方法,如果您想知道各种点和同一条线的最小距离,那么它肯定不是最有效的方法 - 如果维数很小,则更是如此。要获得更有效的方法,请考虑以下事项:

import numpy as np

p = np.array([0, 0, 0])  # p and q can have shape (n,) for any
q = np.array([0, 0, 1])  # n>0, and rs can have shape (m,n)
rs = np.array([          # for any m,n>0.
    [0, 1, 1],
    [1, 0, 1],
    [1, 1, 1],
    [0, 2, 1],
])

def d(p, q, rs):
    x = p-q
    return np.linalg.norm(
        np.outer(np.dot(rs-q, x)/np.dot(x, x), x)+q-rs,
        axis=1)

print(d(p, q, rs))
# Prints array([1.        , 1.        , 1.41421356, 2.        ])

我可能缺少一些简化或其他可以加快速度的东西,但这至少应该是一个好的开始。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

3 维空间中点与线之间的最短距离 的相关文章

  • Python动态导入脚本,需要有其__name__ == "__main__"代码才能被调用

    当从另一个脚本导入 python 脚本时 我想要受经典保护的脚本代码 if name main 要运行 我怎样才能运行该代码 我想做的是从 python 脚本动态更改模块 然后导入现有脚本 该脚本应该看到所做的更改并运行其 main 像Py
  • 在 Unity 中平滑动态生成的网格?

    给定 Unity 和 C 中的网格 其本身是通过合并更简单的基础网格实时创建的 我们如何在运行时 将其变成平滑的 几乎像包裹在布中的网格版本一样 不是完全凸出的版本 而是更圆润 软化锋利的边缘 桥接深间隙等 理想情况下 表面也将像 平滑角度
  • 计算温度的偏导数(温度的水平平流)

    我想知道哪种方法计算x和y方向温度的偏导数 温度的水平平流 最正确 第二个代码使用温度 纬向风和经向风的数据矩阵 提取温度 T 纬向风分量 u 和经向风分量 v 的数据 import matplotlib pyplot as plt imp
  • Python 按文件夹模块导入

    我有一个目录结构 example py templates init py a py b py a py and b py只有一个类 名称与文件相同 因为它们是猎豹模板 纯粹出于风格原因 我希望能够在中导入和使用这些类example py像
  • Python - 包和设置文件

    我有一个 python 包 需要从我的项目目录中提取设置 这是我的项目当前的结构 Project bin mypackage package files Project myproject project files start py se
  • 如何在 pygame 中聚焦光线或如何仅绘制窗口的某些圆形部分?

    对于这一点 如果您熟悉它 请想想 超级马里奥制造2 中嘘关卡中的黑暗模式 我试图在角色周围创建一个圆形聚光灯 这也将使圆圈范围内的任何内容都可见 例如部分站在地板上 敌人或场景中的任何其他物体 我的计划是首先绘制圆圈 聚光灯 然后绘制场景
  • 地图与星图的性能?

    我试图对两个序列进行纯Python 没有外部依赖 逐元素比较 我的第一个解决方案是 list map operator eq seq1 seq2 然后我发现starmap函数来自itertools 这看起来和我很相似 但事实证明 在最坏的情
  • Python 可以使用单独的媒体播放器打开 mp3 文件吗? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 是否可以开一个mp3Python 中的文件 可以使用Popen 我并不是要在程序中运行它 我的意思是作为媒体播放器中的一个单独窗口或其
  • Accel 无法在 gedit 3 插件中工作

    我试图为 Gedit 3 编写一个使用 GObject 自省的小插件 下面显示的代码的相关部分只是为了建立一个环境 然后我可以将函数放入按钮的回调中 但是 该按钮的加速器不起作用 这段代码有什么问题 我正在使用教程here http www
  • Weasyprint 在调用 write_pdf 时获得未定义的属性:“AttributeError:‘PosixPath’对象没有属性‘read_text’”

    我正在 ubuntu 18 04 上运行 weasyprint 项目 并尝试创建一个 pdf 当我尝试设置页脚图像时 问题就开始了 我正在 python 3 6 7 上运行 这是我调用 weasyprint 的代码 import sys i
  • numpy 数组最快的保存和加载选项

    我有一个生成二维的脚本numpy数组与dtype float和形状的顺序 1e3 1e6 现在我正在使用np save and np load对数组执行 IO 操作 然而 这些函数对于每个数组都需要几秒钟的时间 是否有更快的方法来保存和加载
  • Python变量赋值问题

    a b 0 1 while b lt 50 print b a b b a b 输出 1 2 4 8 16 32 wheras a b 0 1 while b lt 50 print b a b b a b 输出 正确的斐波那契数列 1 1
  • 图像堆栈的最大强度投影

    我正在尝试重新创建该功能 max array 3 来自 MatLab 它可以获取 N 个图像的 300x300px 图像堆栈 我在这里说 图像 因为我正在处理图像 实际上这只是一个大的双数组 300x300xN 并创建一个 300x300
  • 在 (i)python 脚本中从 jupyter 内核获取输出

    我想从单个 ipython 会话中打开多个内核 在这些内核上运行代码 然后收集结果 但我不知道如何收集结果 甚至不知道如何查看 stdout stderr 我怎样才能做这些事情呢 到目前为止我所得到的 我已经使用如下代码管理了前两个步骤 打
  • 尝试修复我的功能

    我正在开发一个函数 我必须返回一个元组 其中第一个参数是最大数字的 str 第二个参数是 int 列表 这是示例以及我为该函数编写的内容 投票 G G N G C G 1 3 0 1 您必须将最大值的位置映射到正确的一方 parties N
  • 如何替换被测模块的文件访问引用

    pyfakefs https code google com p pyfakefs 听起来非常有用 它 最初是作为核心 Python 模块的一个适度的假实现来开发的 以支持中等复杂的文件系统交互 并于 2006 年 9 月在 Google
  • 仅对某些行的不同大小的两个 pandas 数据帧的列进行求和

    我有两个 pandas 数据框 如下所示 df1 n column1 0 5 0 0 0 1 6 0 0 0 2 7 0 0 0 3 8 0 0 0 4 9 0 0 0 5 10 0 0 0 df2 n column2 0 6 0 1 0
  • Beautiful Soup 获取动态表数据

    我有以下代码 url https www basketball reference com leagues NBA 2017 standings html all expanded standings html urlopen url so
  • 在 python 中使用递归替代 len()

    作为 CS1301 问题的一部分 我正在尝试使用递归编写一个函数 该函数将执行与 len 完全相同的操作 但是 我有两个问题 我正在使用全局变量 但我在课程中还没有学到这一点 cs1301 自动评分器告诉我 我的函数返回 26 而不是 13
  • 连接运算符 + 或 ,

    var1 abc var2 xyz print literal var1 var2 literalabcxyz print literal var1 var2 literal abc xyz 除了带有 的自动空格之外 两者有什么区别 哪个通

随机推荐

  • OpenCV 2.3 无法编译,未定义的引用错误

    我在 Windows 7 64 位和 Netbeans 7 0 中使用 OpenCV 我尝试使用 MinGW 和 cygwin 编译下一个代码 但都因未定义的引用而失败 当我使用 MAT 或 FLANN 等时 我无法编译 但我添加了所有库
  • WordPress API 按类别获取帖子

    是否可以按类别获取所有帖子 http codex wordpress org XML RPC WordPress API Posts http codex wordpress org XML RPC WordPress API Posts
  • 在身份验证配置中找不到 Pod 执行角色或不具有所有必需的权限。我该如何调试?

    客观的 我希望能够使用 Fargate 部署 AWS EKS 我已经成功地进行了部署node group 然而 当我转而使用 Fargate 时 Pod 似乎都陷入了挂起状态 我当前的代码是什么样的 我正在使用 Terraform 进行配置
  • 在asp.net中发送邮件

    我正在使用 asp net 3 5 和 C 我想从 asp net 发送邮件 因为我从我的托管提供商处获得了一些详细信息 这些是 邮件 MySite net UserName Password 但我无法通过这些详细信息发送邮件 我在 web
  • Oracle TO_DATE 不工作

    我有这个查询不返回任何行 但有些记录的日期大于 90 年 6 月 25 日 为什么它不起作用 SELECT employee id last name hire date FROM employees WHERE hire date gt
  • C- SIGUSR1 在语法上到底是什么

    当我在kill 或signal 函数中使用SIGUSR1时 它在做什么 是宏吗 我读到它是用户定义的 但它是在哪里定义的 我可以制作 SIGUSR10 或以编程方式制作不同信号类型的 数组 吗 用户定义的信号意味着这些信号没有明确的含义 与
  • 使用 apache mod proxy 删除基本身份验证标头

    我有一个 HTTP Basic 安全网站 我用 mod proxy 隐藏了 Tomcat 应用程序服务器 我可以删除 HTTP Basic 标头吗 Tomcat应用程序读取标头并返回401未授权 不需要基本身份验证 因为应用程序使用 coo
  • 如何在 TypeORM 中模拟 EntityManager?

    我有以下代码从我的 NestJS 服务中模拟实体管理器 它在某种程度上有效 但问题在于指定什么findOne应该返回不同的实体 provide getEntityManagerToken useFactory connection Conn
  • R:根据数据框列表中的数据框名称设置列名称

    我有一个很大的数据框列表 如下所示 gt head lst Set1 ID Value 1 A 1 2 B 1 3 C 1 Set2 ID Value 1 A 1 2 D 1 3 E 1 Set3 ID Value 1 B 1 2 C 1
  • 自定义 sp_who 而不授予查看服务器状态

    我需要一个存储过程 可以将其提供给一组用户 使他们能够查看所有正在运行的进程 例如sp who 但我不希望这些用户拥有VIEW SERVER STATE权限 因为这会暴露太多元数据 我还需要允许用户终止进程 这是专门用于该组的开发服务器 我
  • Tinkerpop Gremlin 深度优先搜索顺序

    我有一个非常简单的示例图 我试图对其进行深度优先查询 假设图的边看起来像这样 A gt B A gt C B gt D B gt E C gt F C gt G 从 A 开始的深度优先搜索应该返回 A B D E C F G 但如果我能得到
  • 阻止 CTRL-Click 影响父数据网格

    我有一个 WPF DataGrid 它在 RowDetailsTemplate 中声明了另一个数据网格
  • 使用PIL在App Engine上绘制图像

    我已阅读主题 App Engine PIL 和叠加文本 https stackoverflow com questions 12695480 app engine pil and overlaying text 下面的代码将显示损坏的图像
  • 使用 TFLiteConverter 将 Keras 模型转换为量化的 tflite 版本会导致 NOTYPE 错误

    当转换和执行 keras 模型的 8 位量化时 我遇到了一个奇怪的错误 而图像数据集不会发生这种错误 import tensorflow python keras backend as K import tensorflow as tf f
  • 在向量上查找另一个特定数字之前的数字

    所以我想知道matlab中一个事件何时发生在另一个事件之前 我所说的事件是指数字 例如 我有一个向量 比方说 x 0 3 0 3 0 1 0 2 0 5 0 1 0 3 0 1 0 5 0 1 0 4 0 5 我想知道 0 1 发生在 0
  • 简化嵌套 Maybe 模式匹配

    我的代码中有以下构造 f Maybe A gt X f a case a of Nothing gt x Just b gt case b of Nothing gt y Just c gt case c of Nothing gt z J
  • SpringMVC Ajax 验证

    我有一个 Spring Mvc 3 表单 可以 POST 到控制器 在控制器中我调用来执行 DML 语句 我还有一个单独的验证类 它实现 Validator 并在我的控制器中调用 我在那里进行简单和复杂的验证 例如检查用户名是否存在并返回错
  • 如何在AFNetworking 2.0中获取下载进度?

    我正在使用 AFURLSessionManager 创建一个新的下载任务 AFURLSessionManager manager NSProgress p nil NSURLSessionDownloadTask downloadTask
  • 让 vim 分割窗口处于插入模式

    我想在 vim 分割窗口中查看 bash 命令的输出 split 为此 我安装了 Conque Shell 它在分割窗口中显示 bash ConqueTermSplit bash 然后我可以运行 shell 命令并在插入模式下观察输出 但是
  • 3 维空间中点与线之间的最短距离

    我试图使用 numpy 或 python 中的任何东西找到从点 x0 y0 z0 到由 x1 y1 z1 和 x2 y2 z2 连接的线的最小距离 不幸的是 我在网上能找到的所有内容都与二维空间有关 而且我对 python 还很陌生 任何帮