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

时间:2011-01-04 14:56:02

标签: c# c++ algorithm matlab

这是this question的缩减问题。基本上我只是问问题中的第一名。

假设我有两组meshes,网格类的定义如下(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之间的布尔运算(在我的情况下,我想找到多边形交叉点)的结果?

天真的方法是遍历Element对象中的所有Mesh s,检查另一个Element对象中的其他Mesh,并获取结果。

但我相信还有更有效的算法 - utilizing plane sweeping algorithm

如果此类算法已在其他地方实现,无论是在.Net,C ++还是在matlab中,都会更好。

3 个答案:

答案 0 :(得分:0)

仅对网格进行布尔操作是不够的。

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;
};

但是从这种结构中获取网格要困难得多。你不会从中得到任何有用的东西。最好的解决方案就像行进立方体一样,你从中得到的网格看起来不会有任何好处。

答案 1 :(得分:0)

网格布尔运算很难正确,你尝试使用现有的代码是正确的。

一个适合您需求的现有C ++库是CGAL。

您可以查看manual

答案 2 :(得分:-1)

在C ++中,如果你保持Mesh的排序(或在操作之前对它们进行排序),并使用std :: set_intersection,这可以更有效地完成。为此,您必须向Point添加某种排序关系。 (该语言将自动为其他类生成排序运算符,假设在C ++中,List是标准容器;可能是vector或deque)。