재단 하 다

vtkClipPolyData 로 재단 하기
효과:
#include "stdafx.h"
#include "vtkActor.h"
#include "vtkRenderer.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkCylinder.h"
#include "vtkPlane.h"
#include "vtkImplicitBoolean.h"
#include "vtkPolyDataMapper.h"
#include "vtkSphereSource.h"
#include "vtkProperty.h"
#include "vtkClipPolyData.h"
#include "vtkTransformPolyDataFilter.h"
#include "vtkTransform.h"
#include "vtkInteractorStyleTrackballCamera.h"

int main()
{
	vtkSphereSource *sphere=vtkSphereSource::New();
	sphere->SetCenter(0,0,0);
	sphere->SetRadius(10);
	sphere->SetThetaResolution(40);
	sphere->SetPhiResolution(40);

	vtkCylinder *cylinder = vtkCylinder::New();//  
	cylinder->SetCenter(0,0,0);
	cylinder->SetRadius(3);

	vtkPlane *vPlane = vtkPlane::New();//   
	vPlane->SetOrigin(0, 0, 0);
	vPlane->SetNormal(0, -1, 0);

	vtkImplicitBoolean *cuted_cylinder = vtkImplicitBoolean::New();
	cuted_cylinder->SetOperationTypeToIntersection();
	cuted_cylinder->AddFunction(cylinder);
	cuted_cylinder->AddFunction(vPlane);

	vtkClipPolyData *clipper=vtkClipPolyData::New();
	clipper->SetInputConnection(sphere->GetOutputPort());
	clipper->SetClipFunction(cylinder);
	clipper->GenerateClipScalarsOn();
	clipper->GenerateClippedOutputOn();
	clipper->SetValue(0.5);

	vtkTransform *transform=vtkTransform::New();
	transform->Translate(7,0,0);
	vtkTransformPolyDataFilter *filter=vtkTransformPolyDataFilter::New();
	filter->SetInputConnection(clipper->GetOutputPort());
	filter->SetTransform(transform);
	vtkClipPolyData *clipper2=vtkClipPolyData::New();
	clipper2->SetInputConnection(filter->GetOutputPort());
	clipper2->SetClipFunction(cuted_cylinder);
	clipper2->GenerateClipScalarsOn();
	clipper2->GenerateClippedOutputOn();
	clipper2->SetValue(0.5);

	vtkPolyDataMapper *map = vtkPolyDataMapper::New();
	map->SetInputConnection(clipper2->GetOutputPort());
	map->ScalarVisibilityOff();

	vtkActor *actor = vtkActor::New();
	actor->SetMapper(map);
	actor->GetProperty()->SetColor(0,1,1);
	//actor->GetProperty()->SetAmbientColor(0.4,0.5,0.6);
	//actor->GetProperty()->SetDiffuseColor(0.8,0.6,0.2);
	actor->RotateX(40);

	vtkRenderer *ren = vtkRenderer::New();
	vtkRenderWindow *renWin = vtkRenderWindow::New();
	renWin->AddRenderer(ren);

	vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
	iren->SetRenderWindow(renWin);

	ren->AddActor(actor);
	ren->SetBackground(1, 1, 1);
	renWin->SetSize(450, 450);

	vtkInteractorStyleTrackballCamera *style=vtkInteractorStyleTrackballCamera::New();
	iren->SetInteractorStyle(style);

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

	iren->Start();
}

그 중 1~14 줄 에는 해당 헤더 파일 이 포함 되 어 있다.
18~22 줄 은 하나의 공 을 정의 하고 원심 은 원점 에 있 으 며 반지름 은 10 이 며 경위 방향 을 설정 한 삼각 편 수 는 모두 40 이다.
24~26 줄 은 원기둥 의 은 함 수 를 정의 하고 반지름 을 3 으로 설정 하 며 중심 은 원점 에 있 습 니 다.vtk 에서 원기둥 은 함 수 는 길 이 를 설정 하지 않 았 습 니 다.그 방향 은 Y 축 방향 입 니 다.이곳 의 원기둥 은 방금 정 의 된 공 을 재단 하 는 데 사 용 됩 니 다.재단 효 과 는 공 을 뚫 고 양면 을 모두 재단 하 는 것 입 니 다.공의 한 면 만 자 르 려 면 반 개의 원기둥 을 사용 합 니 다.다음 28~30 줄 은 평면 을 정의 하고 평면 과 원기둥 으로 교차 하면 반 개의 원기둥 을 얻 을 수 있다.
32~35 줄 은 평면 과 원기둥 을 Bool 구 교 연산(SetOperation TypeToIntersection()을 통 해 반 개의 원기둥 의 은 함수 가 cuted 를 나타 낸다.cylinder,구 화 연산 이 라면 SetOperation TypeToUnion()을 사용 합 니 다.
37~42 줄 은 vtkClipPolyData 대상 clipper 를 정의 하고 입력 을 18~24 줄 로 설정 하여 만 든 공 으로 설정 합 니 다.재단 함 수 는 원통 cylinder 로 설정 하고 다음 3 줄 40~42 줄 은 쓸모 가 없 는 것 같 습 니 다.
위 에서 얻 은 것 은 단지 하나의 원기둥 으로 공 을 자 르 는 효과 일 뿐 이지 만,반 개의 원기둥 으로 자 르 는 효 과 를 동시에 나타 내기 위해 방금 자 른 재단 체 를 x 축 으로 일정한 위 치 를 이동 한 다음 에 방금 Bool 연산 으로 얻 은 반 개의 원기둥 으로 자 르 면 비교 하기 편리 하 다.기하학 적 대상 의 이동 에 대해 변환 transform 을 지정 한 다음 vtkTransformPolyDataFilter 대상 filter 를 정의 한 다음 filter 의 입력 을 이동 할 기하학 적 대상 으로 설정 하고 transform 으로 변환 해 야 합 니 다.44~48 줄 은 커트 볼 을 이동 시 켰 고 그 이동 결 과 는 filter 에 있 습 니 다.
49~54 줄 은 이동 한 후 얻 은 filter 를 새로운 재단 의 입력 으로 반 원통 cutedcylinder 는 재단 함 수 를 위해 재단 을 진행 하여 재단 결 과 를 얻 었 습 니 다 clipper 2

좋은 웹페이지 즐겨찾기