【问题标题】:How to check if given 3d point is outside convex hull如何检查给定的 3d 点是否在凸包之外
【发布时间】:2019-09-05 22:15:45
【问题描述】:

我正在从事一个科学项目。我有一个 voronoi 图顶点的 xyz 坐标列表,以及一个创建我的蛋白质凸包的点列表(来自三角剖分)。现在一些顶点离船体很远,我想过滤掉它们。我怎样才能在 c++ 中做到这一点?目前不需要超级优化,我只专注于删除这些点。

visualization

我还想检查从 voronoi 顶点(红色十字)到蛋白质中心(粉红色球体)的线是否在任何时候与船体面相交,但我不知道如何实现。

我已经读过,您可以通过计算从该点开始的无限线穿过船体的次数来检查一个点是否在多边形内,但这是针对二维的。可以实施类似的方法来满足我的需求吗?

https://www.geeksforgeeks.org/how-to-check-if-a-given-point-lies-inside-a-polygon/

【问题讨论】:

  • 等等,你只有一个 Voronoi 图,还是一个凸包?这真的是一个 C++ 程序吗,还是你要一个算法?
  • 我有我的蛋白质原子。从那些我计算voronoi图。我也在做蛋白质的准三角测量,我可以检查哪些原子形成了我的外壳。我正在用 c++ 制作一个控制台应用程序,它将在 voronoi 顶点上运行,但我想在进行下一步之前尽可能地减少它们的数量。碰巧在船体外部的 Voronoi 顶点对我没有用。希望我回答了你的问题。
  • 不,你没有。但让我换个说法:您计算的数据的确切表示是什么?描述您希望我们考虑的数据结构。
  • 存储带有坐标的浮点数 (xyz) 的对象。我想检查 voronoi 顶点是否位于船体之外(也定义为点)。对不起,如果这又不是你想要的,我还在学习新东西。
  • 所以,现在我明白了您要检查哪些顶点,但您还没有说船体使用什么数据结构。我问的不是你用于point的结构,而是hull

标签: convex-hull


【解决方案1】:

让我们从二维情况开始。您可以在 CS.SX 上找到解决方案:

Determine whether a point lies in a convex hull of points in O(logn)

这个想法是凸包上的每两个连续点定义了平面的三角形切片(到包的某个内部点);您可以找到您的点所在的切片,并检查它是否比限制幻灯片的线段更靠近内部点。

对于三维情况,我猜你应该可以做类似的事情,但是搜索形成相关三角形的 3 个点可能有点棘手。特别是,它还取决于凸包的表示方式——因为在二维情况下,凸包只是一个循环上的一系列连续点。

我知道这并不能完全解决您的问题,但鉴于您所写的内容,这是我所得到的最好的...

【讨论】:

    猜你喜欢
    • 2012-01-05
    • 2015-10-02
    • 2014-12-12
    • 2015-03-29
    • 2014-03-05
    • 1970-01-01
    • 2021-09-22
    • 2015-01-31
    • 1970-01-01
    相关资源
    最近更新 更多