如何判断一个点是在立方体内部还是外部?

2023-11-24

给定 3D 空间中具有 8 个顶点的立方体。我怎样才能确定myPoint是在立方体内部还是外部?

cube[0] = (x0, y0, z0);
cube[1] = (x1, y1, z1);
cube[2] = (x2, y2, z2);
cube[3] = (x3, y3, z3);
cube[4] = (x4, y4, z4);
cube[5] = (x5, y5, z5);
cube[6] = (x6, y6, z6);
cube[7] = (x7, y7, z7);

myPoint = (x, y, z);

我正在尝试实现这个数据过滤技术 in 3D


特殊情况#1(轴对齐立方体):

As maxim1000 的回答如图所示,您可以简单地检查所考虑点的 X、Y、Z 坐标是否位于立方体的 X、Y、Z 坐标的最小值和最大值内。

X_min <= X <= X_max and Y_min <= Y <= Y_max  and Z_min <= Z <= Z_max

如果满足上述条件,则该点位于立方体内部,否则则不在立方体内部。

一般情况(定向立方体):

有两种方法可以解决这个问题。第一个将点引入立方体的局部坐标系中并应用上述特殊情况。第二种情况涉及向量投影的概念。第一种情况比第二种情况稍微复杂一些,因为您需要计算将点从世界坐标系转换到立方体的本地坐标系的旋转矩阵。考虑如下图所示的立方体。

enter image description here

对于这两种方法,我们都需要从立方体表示中获取一些基本信息。让我们将原点固定在立方体的左下角的立方体局部坐标系中;在本例中,它是点 D。现在计算三个维度上的单位方向向量以及立方体在这些方向上的范围。可以按如下方式完成。

enter image description here

The Xlocal, Ylocal, and Zlocal are illustrated in the figure with Blue, Red, Green colors. And Xlength, Ylength, and Zlength are the extents along the axes.

现在让我们回到解决问题上来。

Approach #1: Bring the point in consideration, in the local coordinate system of the Cube. To do that, we need to estimate the rotation matrix. Rotation matrix in this case is 3 x 3 matrix with Xlocal, Ylocal, and Zlocal as columns.

enter image description here

使用旋转矩阵 R,您可以将点置于局部坐标系中,然后应用轴对齐立方体的特殊情况。

方法#2:

构建从立方体中心到考虑点的方向向量,并将其投影到每个局部轴上,并检查投影是否超出立方体沿该轴的范围。如果投影位于沿每个轴的范围内,则点位于立方体内部,否则位于立方体外部。

enter image description here

The center of the cube is I, as show in the figure. The direction vector from the center of the cube to the point P is V. The projection of the vector V on Xlocal, Ylocal, and Zlocal can be calculated as follows.

enter image description here

现在,只有满足以下所有条件,点 P 才位于立方体内部。

enter image description here

下面是方法 #2 在 python 中的快速实现。

import numpy as np

def inside_test(points , cube3d):
    """
    cube3d  =  numpy array of the shape (8,3) with coordinates in the clockwise order. first the bottom plane is considered then the top one.
    points = array of points with shape (N, 3).

    Returns the indices of the points array which are outside the cube3d
    """
    b1,b2,b3,b4,t1,t2,t3,t4 = cube3d

    dir1 = (t1-b1)
    size1 = np.linalg.norm(dir1)
    dir1 = dir1 / size1

    dir2 = (b2-b1)
    size2 = np.linalg.norm(dir2)
    dir2 = dir2 / size2

    dir3 = (b4-b1)
    size3 = np.linalg.norm(dir3)
    dir3 = dir3 / size3

    cube3d_center = (b1 + t3)/2.0

    dir_vec = points - cube3d_center

    res1 = np.where( (np.absolute(np.dot(dir_vec, dir1)) * 2) > size1 )[0]
    res2 = np.where( (np.absolute(np.dot(dir_vec, dir2)) * 2) > size2 )[0]
    res3 = np.where( (np.absolute(np.dot(dir_vec, dir3)) * 2) > size3 )[0]

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

如何判断一个点是在立方体内部还是外部? 的相关文章

  • 为什么这个 Web api 控制器不并发?

    我有一个 Web API 控制器 里面有以下方法 public string Tester Thread Sleep 2000 return OK 当我调用它 10 次 使用 Fiddler 时 我预计所有 10 次调用都会在大约 2 秒后
  • Rx.NET 中是否有一个Subject 实现,其功能类似于BehaviourSubject,但仅在值发生更改时才发出?

    有没有Subject https learn microsoft com en us previous versions dotnet reactive extensions hh229699 v vs 103 Rx NET 中的实现在功能
  • 转换 const void*

    我有一个函数返回一个const void 我想用它的信息作为char 我可以将它投射为 C 风格的罚款 char variable但是当我尝试使用reinterpret cast like reinterpret cast
  • MVC3中设置下拉列表中的所选项目

    我必须为视图中的下拉列表设置所选项目 但它不起作用 View div class editor label Html LabelFor model gt model Gender div div class editor field Htm
  • 未找到 Boost 库,但编译正常

    我正在尝试在 C 中使用 boost 的文件系统 使用时看起来编译没问题 c c Analyse c o Analyse o g W Wall L usr local lib lboost filesystem lboost system
  • 传递 constexpr 对象

    我决定给予新的C 14的定义constexpr旋转并充分利用它 我决定编写一个小的编译时字符串解析器 然而 我正在努力保持我的对象constexpr将其传递给函数时 考虑以下代码 include
  • 在 C# 中,如何根据在 gridview 行中单击的按钮引用特定产品记录

    我有一个显示产品网格视图的页面 该表内有一列 其中有一个名为 详细信息 的超链接 我想这样做 以便如果用户单击该特定产品的详细信息单元格 将打开一个新页面 提供有关该产品的更多信息 我不确定如何确定哪个Product记录链接的详细信息以及我
  • 如何在 C# Designer.cs 代码中使用常量字符串?

    如何在 designer cs 文件中引用常量字符串 一个直接的答案是在我的 cs 文件中创建一个私有字符串变量 然后编辑 Designer cs 文件以使用此变量 而不是对字符串进行硬编码 但设计者不喜欢这样抛出错误 我明白为什么这行不通
  • 即使没有异步,CallContext.LogicalGetData 也会恢复。为什么?

    我注意到CallContext LogicalSetData LogicalGetData不按照我期望的方式工作 内部设置的值async方法得到恢复即使没有异步或任何类型的线程切换 无论如何 这是一个简单的例子 using System u
  • 什么是空终止字符串?

    它与什么不同标准 字符串 http www cplusplus com reference string string 字符串 实际上只是一个数组chars 空终止字符串是指其中包含空字符的字符串 0 标记字符串的结尾 不一定是数组的结尾
  • 如何使用 ASP.NET Core 获取其他用户的声明

    我仍在学习 ASP NET Core 的身份 我正在进行基于声明的令牌授权 大多数示例都是关于 当前 登录用户的 就我而言 我的 RPC 服务正在接收身份数据库中某个用户的用户名和密码 我需要 验证是否存在具有此类凭据的用户 获取该用户的所
  • 在 C# 中检查 PowerShell 执行策略的最佳方法是什么?

    当你跑步时Get ExecutionPolicy在 PowerShell 中 它得到有效的执行政策 https learn microsoft com en us powershell module microsoft powershell
  • 如何递归取消引用指针(C++03)?

    我正在尝试在 C 中递归地取消引用指针 如果传递一个对象 那就是not一个指针 这包括智能指针 我只想返回对象本身 如果可能的话通过引用返回 我有这个代码 template
  • 模板外部链接?谁能解释一下吗?

    模板名称具有链接 3 5 非成员函数模板可以有内部链接 任何其他模板名称应具有外部链接 从具有内部链接的模板生成的实体与在其他翻译单元中生成的所有实体不同 我知道使用关键字的外部链接 extern C EX extern C templat
  • 带孔的多边形三角剖分

    我正在寻找一种算法或库 更好 将多边形分解为三角形 我将在 Direct3D 应用程序中使用这些三角形 最好的可用选项是什么 这是我到目前为止发现的 本 迪斯科的笔记 http www vterrain org Implementation
  • C++ - 多维数组

    处理多维数组时 是否可以为数组分配两种不同的变量类型 例如你有数组int example i j 有可能吗i and j是两种完全不同的变量类型 例如 int 和 string 听起来您正在寻找 std vector
  • 将函数参数类型提取为参数包

    这是一个后续问题 解包 元组以调用匹配的函数指针 https stackoverflow com questions 7858817 unpacking a tuple to call a matching function pointer
  • 比较:接口方法、虚方法、抽象方法

    它们各自的优点和缺点是什么 接口方法 虚拟方法 抽象方法 什么时候应该选择什么 做出这一决定时应牢记哪些要点 虚拟和抽象几乎是一样的 虚方法在基类中有一个实现 可以选择重写 而抽象方法则没有 并且must在子类中被覆盖 否则它们是相同的 在
  • 将 Lambda 表达式树与 IEnumerable 结合使用

    我一直在尝试了解有关使用 Lamba 表达式树的更多信息 因此我创建了一个简单的示例 这是代码 如果作为 C 程序粘贴到 LINQPad 中 它可以工作 void Main IEnumerable
  • 在 Win32 控制台应用程序中设置光标位置

    如何在 Win32 控制台应用程序中设置光标位置 最好 我想避免制作句柄并使用 Windows 控制台功能 我花了整个早上沿着那条黑暗的小巷跑 它产生的问题比它解决的问题还要多 我似乎记得当我在大学时使用 stdio 做这件事相对简单 但我

随机推荐

  • xcode - 添加 AVFountation 框架

    我正在使用 xcode 4 2 创建一个 iphone 应用程序 并尝试使用 AVFoundation 框架来播放一些无线电流 当我将其导入项目的框架和构建时 我收到以下警告 ld warning ignoring file Users x
  • 如果字符串包含单词列表中的任何一个,R 每行返回 true 或 false

    我有一个包含一列字符串的数据集 text lt c flight cancelled dog cat coach travel car bus cow sheep high bar transport lt 0 df lt data fra
  • C 或 C++ 中的大整数 [关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 我正在开发一个阶乘程序 当试图找到 1000 的阶乘时 该程序不起作用 我认为大整数是解
  • 在 PHP 中动态填充静态变量

    我有两个静态值 type 和 typeID 类型是人类可读的且恒定的 并且需要根据类型的值从数据库中查找类型ID 我需要在首次加载类定义时进行一次查找 为了说明这一点 这里有一些代码不起作用 因为您无法在声明空间中调用函数 MyClass
  • 从 s3 读取时出现溢出错误 - 有符号整数大于最大值

    使用以下代码将大文件从 S3 gt 5GB 读取到 lambda 中 import json import boto3 s3 boto3 client s3 def lambda handler event context response
  • 如何强制 ADO.Net 在阅读器 TableSchema 中仅使用 System.String 数据类型

    我正在使用 OleDbConnection 查询 Excel 2007 电子表格 我想强制 OleDbDataReader 仅使用字符串作为列数据类型 系统正在查看前 8 行数据并推断数据类型为 Double 问题是 在第 9 行 该列中有
  • memcpy memmove GLIBC_2.14/2.2.5 的解释

    我的问题源于一个共享库 我没有选择重新编译该库 错误指出undefined reference to memcpy GLIBC 2 14 我机器上的 GLIBC 版本是 2 12 我已经看到人们使用该行在线完成的修复 asm symver
  • 获取该月的最后一天

    有没有一种方法可以使用Python的标准库轻松确定 即一个函数调用 给定月份的最后一天 如果标准库不支持 那么 dateutil 包是否支持 calendar monthrange提供以下信息 日历 月份范围 年 月 返回指定月份的第一天的
  • Git 在 Mac / OSX 上非常慢

    每当我在 Macbook 配备 El Capitan 的全新 Macbook Pro 上使用任何与 Git 相关的内容时 每个命令几乎需要一分钟的时间 我做了一个简单的 GIT TRACE 1 git 存储 并得到了这个 17 04 27
  • Xcode 的“po”无法识别我想要研究的变量。为什么?

    环境 Xcode 6 Beta 4我试图仅使用以下命令来查看文本值 调试器 然而 调试器无法识别静态变量 通过 Let 对于 var 来说也是如此 Why func textFieldShouldReturn textField UITex
  • 用于测量解决方案/项目所花费时间的 Visual Studio 插件 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 有谁知道有一个 Visual Studio 2008 插件可以尝试跟踪您在任何给定解决方案或项目上花费的时间 我意识到这会很困难 就像在工作中我可能
  • 如何使用 PHP 进行倒计时

    我正在为我兄弟的婚礼创建一个网站 到目前为止一切进展顺利 然而 他希望在主页上显示婚礼倒计时 距离婚礼还剩下 X 个月 X 天 X 小时 我更愿意使用 php 来完成此操作 但也愿意接受其他建议 如果您可以帮助我提供编码想法 或者只是向我指
  • NSInvalidUnarchiveOperationException 无法解码 Apple Watch 扩展中的对象错误

    我有一个用户对象 需要将其存储在 NSUserDefaults 中并与 iOS 8 扩展应用程序 Watchkit 共享 在主容器应用程序中 我可以毫无问题地对对象进行编码和解码 但是 当我尝试检索扩展中存储的用户对象时 我得到了 NSIn
  • 联合供稿内容:已编码

    我正在使用SyndicationFeed类来消耗一些 RSS 提要 我想知道如何获得content encodedRSS 提要的节点 这是我正在使用的代码 XmlReader reader XmlReader Create response
  • 使用位移位除以 2 的幂

    我有以下任务 Compute x 2 n for 0 lt n lt 30使用位移位 要求 向零舍入 例子 divpwr2 15 1 7 divpwr2 33 4 2 合法经营者 lt lt gt gt 操作员最大数量 15 这是我到目前为
  • 使用 ffmpeg 更新视频上的 PNG 叠加

    我正在尝试制作视频的 RTMP 流并在其上放置一些图形数据 我有一个命令可以创建我需要的输出 唯一的问题是 尽管 PNG 图像在渲染过程中在磁盘上更新 但在输出视频中 叠加层始终保持不变 我希望 ffmpeg 在每次更改时 或每分钟一次 从
  • PlatformException(sign_in_failed,com.google.android.gms.common.api.ApiException:10:,null)

    我搜索了整个互联网 尝试了所有可能的解决方案 但我仍然无法从我的 flutter 应用程序中使用 GoogleSignIn 登录 我尝试过的事情 1 添加SHA 1证书2 添加SHA 256证书3 填充 O Auth 屏幕4 在fireba
  • 在python中打开和关闭没有文件对象的文件

    使用文件对象打开和关闭文件 fp open ram txt w fp close 如果我们想在不使用文件对象的情况下打开和关闭文件 即 open ram txt w 我们需要写吗close poem txt 或写作close 还好吗 他们都
  • JetStream CSS 和 JS 无法正常工作并显示 @vite(['resources/css/app.css', 'resources/js/app.js'])

    我在 laravel 8 上安装了 livewire laravel mix 和 jetstream 但是 Jetsream 的 css 和 js 不起作用 并在标题中显示一条消息 vite resources css app css re
  • 如何判断一个点是在立方体内部还是外部?

    给定 3D 空间中具有 8 个顶点的立方体 我怎样才能确定myPoint是在立方体内部还是外部 cube 0 x0 y0 z0 cube 1 x1 y1 z1 cube 2 x2 y2 z2 cube 3 x3 y3 z3 cube 4 x