Vtk检查polydata对象是否相交

时间:2016-05-06 12:14:43

标签: c++ vtk

我正试图让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

编辑:我说这不能给出理想的结果,但它确实改善了我的结果。它对我的运动标准(这是重点)有一些影响,但最终结果是数据集有时仍然相交。

1 个答案:

答案 0 :(得分:1)

您可以为两个对象调用PolyDataObject->GetBounds()并比较它们的值。当然,如果您的对象首先在其边界相交,这只会起作用。但是对于简单几何形状的交叉,这应该提供轻量级的解决方案。 See here for an example

关于vtkBooleanOperationPolyDataFilter我只能说我之前也尝试过使用它,但它根本不能用到我想要的方式。在我的搜索中,我发现很多其他人抱怨它。

编辑:你试过vtkPolyDataIntersectionFilter了吗? class reference可以在这里找到。

  

vtkIntersectionPolyDataFilter计算两个vtkPolyData对象之间的交集。第一个输出是一组行,用于标记输入vtkPolyData对象的交集。第二和第三输出分别是第一和第二输入vtkPolyData。可选地,可以沿交叉线分割两个输出vtkPolyData。