平面和直线是三维计算机视觉和计算机图形学中有用的几何实体。将它们表示为一组点是低效的,这会导致很大的内存需求,具体取决于用于生成点的步长。

在本文中,我将讨论如何使用向量方程表示平面和直线。我还将介绍如何使用向量形式找到直线和平面之间的交点。

三维线条

我们可以用下面的等式[1]表示向量形式的直线。

p = l₀ + l * ** d,** d ∈ R

其中,I是一个向量,表示直线方向,l₀是直线上的一个点,d是标量。

p是直线上的通用点,这些点定义了线。因此,为了定义直线,我们只需要知道6个数字/参数,就可以用向量形式完整地表示它。

我创建了一个类来表示线向量并绘制它。它由一个vector和一个point_on_line参数化,它们都是3x1 numpy列向量。

要在直线上获得点,我们可以使用该方程。通过缩放vector改变d。

import matplotlib.pyplot as plt
import numpy as npclass Line:def __init__(self, vector, point_on_line) -> None:self.vector = np.array(vector).reshape(3, 1)self.point_on_line = np.array(point_on_line).reshape(3, 1)def plot(self, step_size=0.1):points = np.zeros((3, 0))for i in np.arange(-10, 10, step_size):points = np.concatenate((points, self.point_on_line + i * self.vector), axis=1)fig = plt.figure()ax = fig.add_subplot(111, projection='3d')ax.scatter(points[0, :].ravel(),points[1, :].ravel(),points[2, :].ravel(),s=1)ax.scatter(*self.point_on_line, "r")plt.show()

我将展示一些样本行。

向量(1,1,1)点(0,0,0);

如果你想要一条横跨二维平面的线,那么你可以使用一个在两个坐标中只有非零值的向量,你将在二维平面中得到一条线。

向量(1,1,0)点(0,0,0):

三维平面

我们可以用下面的等式表示向量形式的平面。

(pp₀) *  n = 0,其中n是平面的法向(垂直)向量,p₀是平面上的点。

上述方程式中所有点p的轨迹定义了该平面。(p — **p₀)**表示平面中的向量,n表示平面的正交向量或法向量。因此,对于平面上所有点p的这些向量,相互正交的这两个向量的点积将为零。

用六个数字来表达一个平面十分优雅!

下面是Python中使用上述定义的平面类。

class Plane:def __init__(self, normal_vector, point_on_plane) -> None:self.normal_vector = np.array(normal_vector).reshape(3, 1)self.point_on_plane = np.array(point_on_plane).reshape(3, 1)

在本文中,你可以表示平面的方法:https://medium.com/@daniel.j.lenton/part-iii-projective-geometry-in-3d-37f36746733b

接下来,让我们看看如何找到直线和平面的交点。

3D中点与平面的交点

现在我们知道了如何在3D中表示点和平面,我们可以看看如何找到这两个几何图形之间的交点。

如果一条直线和某个平面在点p相交,它将同时满足直线和平面方程。因此,为了找到交点,将p的值从直线方程代入平面方程。

(( **l₀ + l * ** d) — p₀) * n = 0

展开这些项可以得到以下等式。

(l *  n) d + (l₀ — p₀) *  n = 0

求解d得到:

d = (p₀ — l₀) *  n / (l *  n)

这返回给我们一个点,该点位于直线和平面上。

有三种情况。

  1. 首先是直线和平面平行,但直线不在平面内。

  2. 接下来是,正好有一个交点。

  3. 最后,直线平行于平面并在平面中,在这种情况下,直线中的每个点也将位于平面上。因此,在这种情况下,将有无限多个点同时满足这两个方程。

对于前两个案例,l *  n = 0,因为对于它们,I垂直于法向量n。否则,我们将得到一个实数d,它可以在直线方程中替换回来,以得到交点:

p = l₀ + l * d

我已经为平面和直线类编写了一个基于上述方程计算交点的函数。请注意,函数是相同的等式,唯一不同的是代码语法。

class Line:def __init__(self, vector, point_on_line) -> None:self.vector = np.array(vector).reshape(3, 1)self.point_on_line = np.array(point_on_line).reshape(3, 1)def intersect(self, plane):if plane.normal_vector.ravel().dot(self.vector.ravel()) != 0:d = (plane.point_on_plane - self.point_on_line).ravel().dot(plane.normal_vector.ravel()) / plane.normal_vector.ravel().dot(self.vector.ravel())return self.point_on_line + (d * self.vector)return None
class Plane:def __init__(self, normal_vector, point_on_plane) -> None:self.normal_vector = np.array(normal_vector).reshape(3, 1)self.point_on_plane = np.array(point_on_plane).reshape(3, 1)def intersect(self, line: Line):if self.normal_vector.ravel().dot(line.vector.ravel()) != 0:d = (self.point_on_plane - line.point_on_line).ravel().dot(self.normal_vector.ravel()) / self.normal_vector.ravel().dot(line.vector.ravel())return line.point_on_line + (d * line.vector)return None

现在,我们可以使用plane和line类来查找它们之间的交点。

例如:

l1 = Line((1, 1, 0), (0, 0, 0))
p1 = Plane((1, 1, 1), (5, 5, 5))
print(p1.intersect(l1))
# Output
#[[7.5]
# [7.5]
# [0. ]]

我们可以使用Symphy验证结果:

from sympy.geometry import Line, Segment
from sympy import Point, Eq
l1 = Line(Point(0,0,0), Point(1,1,0))
from sympy import Plane, Point3D
p1 = Plane((5,5,5), normal_vector=(1,1,1))
print(p1.intersection(l1))

我们也使用Symphy实现来验证我们的代码。

结论

在本文中,我们研究了3D中的线和平面。我们看到了它们的向量方程,以及如何用一个向量和一个点来表示它们。

这是一个非常紧凑的表示,只有六个数字。我们最终了解了如何找到两者之间的交叉点,并查看了三种可能的交叉点情况。

参考文献

[1] https://en.wikipedia.org/wiki/Line%E2%80%93plane_intersection

☆ END ☆

如果看到这里,说明你喜欢这篇文章,请转发、点赞。微信搜索「uncle_pn」,欢迎添加小编微信「 woshicver」,每日朋友圈更新一篇高质量博文。

扫描二维码添加小编↓

在三维空间中表示平面和直线相关推荐

  1. 三维空间中的平面方程

    平面方程: Ax+By+Cz+D=0 (参数,A,B,C,D是描述平面空间特征的常数) 如何求参数: 选择逆时针凸多边形的三个连续顶点(x1,y1,z1),(x2,y2,z2),(x3,y3,z3) ...

  2. 如何计算三维空间中点到平面的投影点坐标

    三维空间平面的一般方程为                  (1) 假定不在平面上的三维空间点坐标为,其在平面上的投影点坐标为.因为投影点到当前点与平面垂直,根据垂直约束条件,易知与满足如下条件:   ...

  3. 3D数学 | 如何计算三维空间中点到平面的投影点坐标

    三维空间平面的一般方程为 假定不在平面上的三维空间点坐标为,其在平面上的投影点坐标为.因为投影点到当前点与平面垂直,根据垂直约束条件,易知与满足如下条件: 将(2)和(3)代入(1),可以解得: 将( ...

  4. 计算三维空间(推广到K维)中点到平面的投影点坐标

    计算三维空间中点到平面的投影点坐标 问题概述: 三维平面的一般方程为: (1) A x + B y + C z + D = 0 Ax+By+Cz+D = 0\tag{1} Ax+By+Cz+D=0(1 ...

  5. 数分下第4讲 (8.2节): 平面和直线

    第2.2讲 空间解析几何中的平面和直线 本节中将利用向量运算的方法,给出几何中基础的平面和直线表达.用代数的方法给出几何关系,这是空间解析几何的特点.向量的方法给出几何变量之间的关系,和纯几何方法不同 ...

  6. 计算三维空间中直线和三角形的交点

    计算三维空间中直线和三角形的交点 前言 一.计算平面方程 1.1 平面不过原点 1.2 平面过原点 1.3 平面过 zzz 轴 1.4 平面为 yOzyOzyOz 平面 二.计算直线方程 三.计算交点 ...

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

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

  8. 三维空间中的两直线相交

    很多资料上提供的两直线相交求点问题一般都是基于二维空间的,而且是直接使用坐标系进行求解.实际上知道二维空间中的求法(使用坐标系进行求解的),要想从中推导到三维空间中的求法是不容易的.在进行几何问题求解 ...

  9. 三维空间中两直线交点

    文章目录 一.原理概述 二.实现代码 三.实现效果 一.原理概述 为了获取三维空间中的两条相交直线,这里我们采用点向式来表示直线,通过两个点和其法向量来创造直线相交情况,具体操作如下: (1)确定轴向 ...

  10. [足式机器人]Part1 三维空间中的跳行Ch03——【Legged Robots that Balance 读书笔记】

    本文仅供学习使用 本文结合个人理解体会作者的思路,也从个人科研角度出发,部分翻译参考由:QQ群(2群legged robot that balance)提供,感谢他们为本文英文版翻译所做的贡献(但有些 ...

最新文章

  1. 深入理解python异步编程_深入理解Python异步编程
  2. java鼠标经过时变色_将鼠标悬停在标签上时,鼠标指针会变为手形
  3. 【noip模拟赛3】编码
  4. 让Visual Studio 2013为你自动生成XML反序列化的类
  5. Unity协程(Coroutine)原理深入剖析
  6. php 随机几率,php实现根据概率配置随机抽奖
  7. sr锁存器 数电_数字电路第5章(1SR锁存器)_2.ppt
  8. 书摘—智能主义:未来商业与社会的新生态
  9. java Socket(TCP)编程小项目
  10. 如何做好手机APP测试?APP测试流程及解决方案
  11. simulink upd通信
  12. OpenSSL 生成CA证书及终端用户证书
  13. HTML,js,jQuery的1+S证书学习资料
  14. 实测 CSDN开发助手-Chrome插件
  15. Matlab基本函数-feather函数
  16. 基于C++的Qt网络编程——基于 IP 多播的网络会议程序
  17. Top命令查询结果界面参数详解
  18. 人才是最重要的资产,这类企业不可贸然裁员
  19. PC游戏史上十大最经典RPG
  20. 学习下 BlackHat Asia 2021 大会议题

热门文章

  1. html鼠标悬停改变背景,html - 更改鼠标悬停行的背景颜色 - SO中文参考 - www.soinside.com...
  2. scrapy 官方中文文档地址
  3. ViewPage动态删除页面
  4. open cv中文文档
  5. 除了深度学习,机器翻译还需要啥?
  6. 51单片机流水灯方法大全
  7. EOF和scanf用法
  8. Matlab图像练习程序:imrotate功能实现
  9. 达梦数据库的表空间及用户管理
  10. python猜数字十次、猜对输出猜了多少次_python-猜数字小练习