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