matlab 两组网格之间的快速布尔运算

wqnecbli  于 2022-11-15  发布在  Matlab
关注(0)|答案(4)|浏览(279)

这是一个关于this question的简化问题。基本上,我只是在问问题中的第一个问题。
假设我有两组meshes,Mesh类的定义如下(C#语法):

public class Mesh
{
 public List<Element> elements;
 public List<Point> points;
}

public class Element
{
  public List<int> PointIndex;
}

public class Point
{
  public double X;
  public double Y;
}

有没有什么有效的方法/实现来找到两个Mesh之间的布尔运算的结果(在我的例子中,我希望找到多边形样式的交集)?
最简单的方法是遍历Mesh对象中的所有Element,检查另一个Mesh对象中的其他Element,并获得结果。
但我相信有更有效的算法可以做到这一点--utilizing plane sweeping algorithm
如果这样的算法已经在其他地方实现了,无论是在.Net、C++还是MatLab中,情况都会更好。

9q78igpj

9q78igpj1#

仅有网格不足以对其执行布尔运算。

class B
{
public:
   virtual bool Inside(Point p) const=0;
};

在这些附加信息之后,布尔运算就变得微不足道了:

class Intersect : public B
{
public:
   Intersect(B &b1, B &b2) : b1(b1), b2(b2) { }
   bool Inside(Point p) const { return b1.Inside(p) && b2.Inside(p); }
private:
   B &b1;
   B &b2;
};

但从这种结构中获取网状结构要困难得多。你不会从中得到任何有用的东西。最好的解决方案是类似行进立方体的东西,从那里得到的网格看起来不会很好。

nmpmafwu

nmpmafwu2#

网格布尔运算很难正确执行,您尝试使用一些现有代码是正确的。
CGAL是一个可以满足您需求的现有C++库。
你可以看看manual

yws3nbqq

yws3nbqq3#

在C++开源库MeshLib中,有一个针对三角网格的快速而健壮的Boolean operations实现。
这是一个基于MeshLib的video的MeshInspector应用程序,作者甚至声称可以对中等复杂的网格实时执行这些应用程序。

rqcrx0a6

rqcrx0a64#

在C中,如果保持网格的排序(或在操作之前对它们进行排序),并使用std::set_cross,则可以更有效地完成此操作。要做到这一点,您必须向Point添加某种排序关系。(该语言将自动为其他类生成排序操作符,假设在C中,List是一个标准容器;可能是向量或双端队列)。

相关问题