我正试图让2个vtkPolyData对象彼此靠近而不相交。我想用一个简单的布尔函数“测试”一个是否在另一个内部。我的第一个想法是使用vtkBooleanOperationPolyDataFilter将数据集作为输入并计算交集,然后检查生成的PolyData对象是否为NULL对象。然而,这并没有产生预期的结果。
我目前使用的代码如下所示:
bool Main::Intersect(double *trans)
{
vtkSmartPointer<vtkPolyData> data1 = vtkSmartPointer<vtkPolyData>::New();
vtkSmartPointer<vtkPolyData> data2 = vtkSmartPointer<vtkPolyData>::New();
data1->ShallowCopy(this->ICPSource1);
data2->ShallowCopy(this->ICPSource2);
//This piece is just to reposition the data to the position I want to check
for (unsigned int k=0; k<3; k++)
{
trans[k]/=2;
}
translate(data2, trans);
for (unsigned int k=0; k<3; k++)
{
trans[k]*=-1;
}
translate(data1, trans);
//This is my use of the actual vtkBooleanOperationPolyDataFilter class
vtkSmartPointer<vtkBooleanOperationPolyDataFilter> booloperator = vtkSmartPointer<vtkBooleanOperationPolyDataFilter>::New();
booloperator->SetOperationToIntersection();
booloperator->AddInputData(data1);
booloperator->AddInputData(data2);
booloperator->Update();
if (booloperator->GetOutput()==NULL)
return 0;
else
return 1;
}
对此问题的任何帮助表示高度赞赏。另外,我不知道“vtkBooleanOperationPolyDataFilter”类是否真的是最好的类,它只是我发现并认为可能有用的东西。
提前致谢, Xentro
编辑:我说这不能给出理想的结果,但它确实改善了我的结果。它对我的运动标准(这是重点)有一些影响,但最终结果是数据集有时仍然相交。
答案 0 :(得分:1)
您可以为两个对象调用PolyDataObject->GetBounds()
并比较它们的值。当然,如果您的对象首先在其边界相交,这只会起作用。但是对于简单几何形状的交叉,这应该提供轻量级的解决方案。 See here for an example
关于vtkBooleanOperationPolyDataFilter
我只能说我之前也尝试过使用它,但它根本不能用到我想要的方式。在我的搜索中,我发现很多其他人抱怨它。
vtkPolyDataIntersectionFilter
了吗? class reference可以在这里找到。
vtkIntersectionPolyDataFilter计算两个vtkPolyData对象之间的交集。第一个输出是一组行,用于标记输入vtkPolyData对象的交集。第二和第三输出分别是第一和第二输入vtkPolyData。可选地,可以沿交叉线分割两个输出vtkPolyData。