天天看点

VTK笔记-裁剪分割-裁剪闭合曲面形成闭合多边形数据-vtkClipClosedSurface类vtkClipClosedSurface示例

vtkClipClosedSurface

  vtkClipClosedSurface类使用平面集合剪裁闭合曲面。

  vtkClipClosedSurface将使用一组剪裁平面剪裁闭合的多边形曲面。它将通过在剪切输入数据的地方创建新的多边形面来生成新的闭合曲面。

  非流体表面不应用作vtkClipClosedSurface的输入。输入曲面不应具有开放边,并且不能具有由两个以上面共享的任何边。  vtkFeatureEdges过滤器可用于验证数据集是否满足这些条件。此外,输入曲面不应自相交,这意味着曲面的面应仅在其边缘处接触。

  如果GenerateOutline处于启用状态,则此过滤器将在剪裁平面与数据相交的任何位置生成轮廓。ScalarMode选项将向输出中添加单元格标量,以便生成的面可以以与原始曲面不同的颜色显示。

  注意:对于简单的凸输入,新面的三角剖分是在O(n)时间内完成的,但是对于非凸输入,最坏情况的时间是O(n2*m2),其中n是点的数量,m是三维腔的数量。相比之下,最好的三角剖分算法是O(nlogn)。但也有少数情况下,三角测量将无法产生严密输出。打开TriangulationErrorDisplay可以通知这些故障。

  之前对vtkPolyData数据进行裁剪后,就会破坏闭合多边形的闭合性,生成开放性的多边形。对于需要剪切后生成闭合多边形就需要使用vtkClipClosedSurface类;

VTK笔记-裁剪分割-裁剪闭合曲面形成闭合多边形数据-vtkClipClosedSurface类vtkClipClosedSurface示例

接口

多面隐函数

  设置用于裁剪的隐函数,是vtkPlaneCollection类型指针;

virtual void SetClippingPlanes(vtkPlaneCollection* planes);
vtkGetObjectMacro(ClippingPlanes, vtkPlaneCollection);
           

单元标量

  支持设置是否添加单元标量,以便可以将新面和轮廓与原始面和线区分开来。

  选项有以下:

意义
VTK_CCS_SCALAR_MODE_NONE
VTK_CCS_SCALAR_MODE_COLORS 颜色
VTK_CCS_SCALAR_MODE_LABELS 标签

  对于“Labels”选项,标量值“0”表示原始单元格,“1”表示剖切面上的新单元格,“2”表示由SetActivePlane()方法设置的ActivePlane上的新单元格。默认标量模式为“无”(VTK_CCS_SCALAR_MODE_NONE)。

vtkSetClampMacro(ScalarMode, int, VTK_CCS_SCALAR_MODE_NONE, VTK_CCS_SCALAR_MODE_LABELS);
void SetScalarModeToNone() { this->SetScalarMode(VTK_CCS_SCALAR_MODE_NONE); }
void SetScalarModeToColors() { this->SetScalarMode(VTK_CCS_SCALAR_MODE_COLORS); }
void SetScalarModeToLabels() { this->SetScalarMode(VTK_CCS_SCALAR_MODE_LABELS); }
vtkGetMacro(ScalarMode, int);
const char* GetScalarModeAsString();
           

是否生成轮廓

  使用GenerateOutline控制是否在输入面被平面切割的位置生成轮廓。

vtkSetMacro(GenerateOutline, vtkTypeBool);
vtkBooleanMacro(GenerateOutline, vtkTypeBool);
vtkGetMacro(GenerateOutline, vtkTypeBool);
           

是否生成面

  GenerateFaces用来设置是否为输出生成多边形面。

  默认情况下,此选项处于启用状态。如果关闭,则输出将没有poly。

vtkSetMacro(GenerateFaces, vtkTypeBool);
vtkBooleanMacro(GenerateFaces, vtkTypeBool);
vtkGetMacro(GenerateFaces, vtkTypeBool);  
           

颜色

  BaseColor设置所有单元格的颜色是原始几何图形的一部分。

  如果输入数据已经有颜色单元格标量,那么这些值将被使用,参数将被忽略。默认颜色为红色。需要设置为颜色类型:SetScalarModeColors。

  ClipColor设置由于剪裁而创建的任何新几何图形(面或轮廓)的颜色。

  默认颜色为橙色。需要设置为颜色类型:SetScalarModeColors。

  如果设置了ActivePlaneId,则为通过使用ActivePlane剪裁生成的任何新几何体设置颜色。

  默认值为黄色。需要设置为颜色类型:SetScalarModeColors。

vtkSetVector3Macro(BaseColor, double);
vtkGetVector3Macro(BaseColor, double);
vtkSetVector3Macro(ClipColor, double);
vtkGetVector3Macro(ClipColor, double);
vtkSetMacro(ActivePlaneId, int);
vtkGetMacro(ActivePlaneId, int);
vtkSetVector3Macro(ActivePlaneColor, double);
vtkGetVector3Macro(ActivePlaneColor, double);
           

  TriangulationErrorDisplay用来开启三角剖分失败时生成错误。

  通常三角测量误差太小而看不见,但它们会导致曲面不闭合。TriangulationErrorDisplay选项对性能没有影响。

vtkSetMacro(TriangulationErrorDisplay, vtkTypeBool);
vtkBooleanMacro(TriangulationErrorDisplay, vtkTypeBool);
vtkGetMacro(TriangulationErrorDisplay, vtkTypeBool);
           

从示例中拿到一个vtkClipClosedSurface使用的片段:

vtkNew<vtkClipClosedSurface> clipper;
clipper->SetInputData(polyData);
clipper->SetClippingPlanes(planes);
clipper->SetActivePlaneId(2);
clipper->SetScalarModeToColors();
clipper->SetClipColor(colors->GetColor3d("Banana").GetData());
clipper->SetBaseColor(colors->GetColor3d("Tomato").GetData());
clipper->SetActivePlaneColor(colors->GetColor3d("SandyBrown").GetData());
           

1.使用SetInputData设定被裁剪的闭合多边形vtkPolyData:polyData;

2.使用SetClippingPlanes设定一组用来裁剪的隐函数平面集合vtkPlaneCollection指针:planes;

3.使用SetActivePlaneId设定当前活动平面ID为2;

4.设定单元标量为颜色,SetScalarModeToColors;

5.SetClipColor设定新生成的平面颜色为香蕉黄;

6.SetBaseColor设定之前多边形表面颜色为西红柿红;

7.设定当前平面颜色为SandyBrown颜色(#f4a460);

示例

#include <vtkActor.h>
#include <vtkCamera.h>
#include <vtkClipClosedSurface.h>
#include <vtkDataSetMapper.h>
#include <vtkNamedColors.h>
#include <vtkNew.h>
#include <vtkPlane.h>
#include <vtkPlaneCollection.h>
#include <vtkPolyData.h>
#include <vtkProperty.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkSmartPointer.h>
#include <vtkSphereSource.h>
#include <vtkXMLPolyDataReader.h>

int main(int argc, char* argv[]){
  vtkNew<vtkNamedColors> colors;

  // PolyData to process
  vtkSmartPointer<vtkPolyData> polyData;

  if (argc > 1){
    vtkNew<vtkXMLPolyDataReader> reader;
    reader->SetFileName(argv[1]);
    reader->Update();
    polyData = reader->GetOutput();
  }
  else{
    // Create a sphere
    vtkNew<vtkSphereSource> sphereSource;
    sphereSource->SetThetaResolution(20);
    sphereSource->SetPhiResolution(11);
    sphereSource->Update();

    polyData = sphereSource->GetOutput();
  }

  auto center = polyData->GetCenter();
  vtkNew<vtkPlane> plane1;
  plane1->SetOrigin(center[0], center[1], center[2]);
  plane1->SetNormal(0.0, -1.0, 0.0);
  vtkNew<vtkPlane> plane2;
  plane2->SetOrigin(center[0], center[1], center[2]);
  plane2->SetNormal(0.0, 0.0, 1.0);
  vtkNew<vtkPlane> plane3;
  plane3->SetOrigin(center[0], center[1], center[2]);
  plane3->SetNormal(-1.0, 0.0, 0.0);

  vtkNew<vtkPlaneCollection> planes;
  planes->AddItem(plane1);
  planes->AddItem(plane2);
  planes->AddItem(plane3);

  vtkNew<vtkClipClosedSurface> clipper;
  clipper->SetInputData(polyData);
  clipper->SetClippingPlanes(planes);
  clipper->SetActivePlaneId(2);
  clipper->SetScalarModeToColors();
  clipper->SetClipColor(colors->GetColor3d("Banana").GetData());
  clipper->SetBaseColor(colors->GetColor3d("Tomato").GetData());
  clipper->SetActivePlaneColor(colors->GetColor3d("SandyBrown").GetData());

  vtkNew<vtkDataSetMapper> clipMapper;
  clipMapper->SetInputConnection(clipper->GetOutputPort());

  vtkNew<vtkActor> clipActor;
  clipActor->SetMapper(clipMapper);
  clipActor->GetProperty()->SetColor(1.0000, 0.3882, 0.2784);
  clipActor->GetProperty()->SetInterpolationToFlat();

  // Create graphics stuff
  vtkNew<vtkRenderer> ren1;
  ren1->SetBackground(colors->GetColor3d("SteelBlue").GetData());

  vtkNew<vtkRenderWindow> renWin;
  renWin->AddRenderer(ren1);
  renWin->SetSize(512, 512);
  renWin->SetWindowName("ClipClosedSurface");

  vtkNew<vtkRenderWindowInteractor> iren;
  iren->SetRenderWindow(renWin);

  // Add the actors to the renderer, set the background and size
  ren1->AddActor(clipActor);

  // Generate an interesting view
  ren1->ResetCamera();
  ren1->GetActiveCamera()->Azimuth(120);
  ren1->GetActiveCamera()->Elevation(30);
  ren1->GetActiveCamera()->Dolly(1.0);
  ren1->ResetCameraClippingRange();

  renWin->Render();
  iren->Initialize();
  iren->Start();

  return EXIT_SUCCESS;
}
           

  下图是未裁剪的形状:

VTK笔记-裁剪分割-裁剪闭合曲面形成闭合多边形数据-vtkClipClosedSurface类vtkClipClosedSurface示例

  下图是裁剪后的闭合多边形数据;

VTK笔记-裁剪分割-裁剪闭合曲面形成闭合多边形数据-vtkClipClosedSurface类vtkClipClosedSurface示例

继续阅读