VTK笔记-使用vtkOBBTree类获得直线与多边形数据的交点

创建一个立方体和一条穿过该立方体的直线

vtkNew<vtkCubeSource> cube;
cube->SetCenter(0, 0, 0);
cube->SetXLength(10);
cube->SetYLength(10);
cube->SetZLength(10);
cube->Update();

vtkNew<vtkPolyDataMapper> map;
map->SetInputConnection(cube->GetOutputPort());
vtkNew<vtkActor> actor;
actor->SetMapper(map);

double begin_point[3] = {
    
     0,0, -20 };
double end_point[3] = {
    
     0,0,20 };
vtkNew<vtkLineSource> line;
line->SetPoint1(begin_point);
line->SetPoint2(end_point);
line->Update();

vtkNew<vtkPolyDataMapper> lineMapper;
lineMapper->SetInputConnection(line->GetOutputPort());
vtkNew<vtkActor> lineActor;
lineActor->SetMapper(lineMapper);	

vtkNew<vtkRenderer> render;
render->AddActor(actor);
render->AddActor(lineActor);
vtkNew<vtkRenderWindow> ren_win;
ren_win->AddRenderer(render);
ren_win->Render();

vtkNew<vtkRenderWindowInteractor> interactor;
interactor->SetRenderWindow(ren_win);
interactor->Initialize();
interactor->Start();

在这里插入图片描述

计算交点并显示

vtkNew<vtkCubeSource> cube;
cube->SetCenter(0, 0, 0);
cube->SetXLength(10);
cube->SetYLength(10);
cube->SetZLength(10);
cube->Update();

vtkNew<vtkPolyDataMapper> map;
map->SetInputConnection(cube->GetOutputPort());
vtkNew<vtkActor> actor;
actor->SetMapper(map);
actor->GetProperty()->SetOpacity(0.3);

double begin_point[3] = {
    
     0,0, -20 };
double end_point[3] = {
    
     0,0,20 };
vtkNew<vtkLineSource> line;
line->SetPoint1(begin_point);
line->SetPoint2(end_point);
line->Update();

vtkNew<vtkPolyDataMapper> lineMapper;
lineMapper->SetInputConnection(line->GetOutputPort());
vtkNew<vtkActor> lineActor;
lineActor->SetMapper(lineMapper);	

vtkNew<vtkOBBTree> tree;
tree->SetDataSet(cube->GetOutput());
tree->BuildLocator();

vtkNew<vtkPoints> intersectPoints;
tree->IntersectWithLine(begin_point, end_point, intersectPoints, NULL);
vtkIdType number = intersectPoints->GetNumberOfPoints();
	
vtkNew<vtkPolyData> pointsPolydata;
pointsPolydata->SetPoints(intersectPoints);

vtkNew<vtkVertexGlyphFilter> vertexGlyphFilter;
vertexGlyphFilter->AddInputData(pointsPolydata);
vertexGlyphFilter->Update();

vtkNew<vtkPolyDataMapper> pointsMapper;
pointsMapper->SetInputConnection(vertexGlyphFilter->GetOutputPort());
vtkNew<vtkActor> pointsActor;
pointsActor->SetMapper(pointsMapper);
pointsActor->GetProperty()->SetPointSize(5);//定义点的尺寸大小,这样点才能在画布上显示出来
pointsActor->GetProperty()->SetColor(0.0, 0.0, 1);
	
vtkNew<vtkRenderer> render;
render->AddActor(actor);
render->AddActor(lineActor);
render->AddActor(pointsActor);

vtkNew<vtkRenderWindow> ren_win;
ren_win->AddRenderer(render);
ren_win->Render();

vtkNew<vtkRenderWindowInteractor> interactor;
interactor->SetRenderWindow(ren_win);
interactor->Initialize();
interactor->Start();

在这里插入图片描述

将相交部分设置分辨率为10红色的点显示

vtkNew<vtkCubeSource> cube;
cube->SetCenter(0, 0, 0);
cube->SetXLength(10);
cube->SetYLength(10);
cube->SetZLength(10);
cube->Update();

vtkNew<vtkPolyDataMapper> map;
map->SetInputConnection(cube->GetOutputPort());
vtkNew<vtkActor> actor;
actor->SetMapper(map);
actor->GetProperty()->SetOpacity(0.3);

double begin_point[3] = {
    
     0,0, -20 };
double end_point[3] = {
    
     0,0,20 };
vtkNew<vtkLineSource> line;
line->SetPoint1(begin_point);
line->SetPoint2(end_point);
line->Update();

vtkNew<vtkPolyDataMapper> lineMapper;
lineMapper->SetInputConnection(line->GetOutputPort());
vtkNew<vtkActor> lineActor;
lineActor->SetMapper(lineMapper);	

vtkNew<vtkOBBTree> tree;
tree->SetDataSet(cube->GetOutput());
tree->BuildLocator();

vtkNew<vtkPoints> intersectPoints;
tree->IntersectWithLine(begin_point, end_point, intersectPoints, NULL);
		
vtkNew<vtkPolyData> pointsPolydata;
pointsPolydata->SetPoints(intersectPoints);

vtkNew<vtkVertexGlyphFilter> vertexGlyphFilter;
vertexGlyphFilter->AddInputData(pointsPolydata);
vertexGlyphFilter->Update();

vtkNew<vtkPolyDataMapper> pointsMapper;
pointsMapper->SetInputConnection(vertexGlyphFilter->GetOutputPort());
vtkNew<vtkActor> pointsActor;
pointsActor->SetMapper(pointsMapper);
pointsActor->GetProperty()->SetPointSize(5);//定义点的尺寸大小,这样点才能在画布上显示出来
pointsActor->GetProperty()->SetColor(0.0, 0.0, 1);
	
vtkIdType number = intersectPoints->GetNumberOfPoints();
vtkNew<vtkPoints> results;
if (number == 2) {
    
    
	vtkNew<vtkLineSource> line_inside;
	line_inside->SetPoint1(intersectPoints->GetPoint(0));
	line_inside->SetPoint2(intersectPoints->GetPoint(1));
	line_inside->SetResolution(10);
	line_inside->Update();
	for (int i = 0; i < line_inside->GetOutput()->GetNumberOfPoints(); ++i) {
    
    
		double position_world[3] = {
    
     0 };
		line_inside->GetOutput()->GetPoint(i, position_world);
		cout << "x:" << position_world[0] << "y:" << position_world[1] << "z:" << position_world[2] << endl;
	}
	results->DeepCopy(line_inside->GetOutput()->GetPoints());
}
vtkNew<vtkPolyData> resultPolydata;
resultPolydata->SetPoints(results);

vtkNew<vtkVertexGlyphFilter> resultGlyphFilter;
resultGlyphFilter->AddInputData(resultPolydata);
resultGlyphFilter->Update();

vtkNew<vtkPolyDataMapper> resultMapper;
resultMapper->SetInputConnection(resultGlyphFilter->GetOutputPort());
vtkNew<vtkActor> resultActor;
resultActor->SetMapper(resultMapper);
resultActor->GetProperty()->SetPointSize(5);//定义点的尺寸大小,这样点才能在画布上显示出来
resultActor->GetProperty()->SetColor(1, 0.0, 0.0);

vtkNew<vtkRenderer> render;
render->AddActor(actor);
render->AddActor(lineActor);
	
render->AddActor(resultActor);
render->AddActor(pointsActor);
vtkNew<vtkRenderWindow> ren_win;
ren_win->AddRenderer(render);
ren_win->Render();

vtkNew<vtkRenderWindowInteractor> interactor;
interactor->SetRenderWindow(ren_win);
interactor->Initialize();
interactor->Start();

在这里插入图片描述
在这里插入图片描述

void normalization(double vector_line[3]) {
    
    
	double len = sqrt(vector_line[0] * vector_line[0] + vector_line[1] * vector_line[1] + vector_line[2] * vector_line[2]);
	vector_line[0] /= len;
	vector_line[1] /= len;
	vector_line[2] /= len;
}
double distanceTwoPoints(double point1[3], double point2[3]) {
    
    
	double dif_x = point1[0] - point2[0];
	double dif_y = point1[1] - point2[1];
	double dif_z = point1[2] - point2[2];
	return sqrt(dif_x * dif_x + dif_y * dif_y + dif_z * dif_z);
}
int main()
{
    
    
	vtkNew<vtkCubeSource> cube;
	cube->SetCenter(0, 0, 0);
	cube->SetXLength(10);
	cube->SetYLength(10);
	cube->SetZLength(10);
	cube->Update();

	vtkNew<vtkPolyDataMapper> map;
	map->SetInputConnection(cube->GetOutputPort());
	vtkNew<vtkActor> actor;
	actor->SetMapper(map);
	actor->GetProperty()->SetOpacity(0.3);

	double begin_point[3] = {
    
     -10, -10, -10 };
	double end_point[3] = {
    
     10, 10, 20 };
	double vector_line[3] = {
    
     end_point[0] - begin_point[0],end_point[1] - begin_point[1],end_point[2] - begin_point[2] };
	normalization(vector_line);
	double step_len[3] = {
    
     0 };
	double zoom = 1 / vector_line[0];
	for (int i = 0; i < 3; i++) {
    
    
		step_len[i] = zoom * vector_line[i];
	}

	vtkNew<vtkLineSource> line;
	line->SetPoint1(end_point);
	line->SetPoint2(begin_point);
	line->Update();

	vtkNew<vtkPolyDataMapper> lineMapper;
	lineMapper->SetInputConnection(line->GetOutputPort());
	vtkNew<vtkActor> lineActor;
	lineActor->SetMapper(lineMapper);	

	vtkNew<vtkOBBTree> tree;
	tree->SetDataSet(cube->GetOutput());
	tree->BuildLocator();

	vtkNew<vtkPoints> intersectPoints;
	tree->IntersectWithLine(begin_point, end_point, intersectPoints, NULL);
	tree->Update();
	vtkNew<vtkPolyData> pointsPolydata;
	pointsPolydata->SetPoints(intersectPoints);

	vtkNew<vtkVertexGlyphFilter> vertexGlyphFilter;
	vertexGlyphFilter->AddInputData(pointsPolydata);
	vertexGlyphFilter->Update();

	vtkNew<vtkPolyDataMapper> pointsMapper;
	pointsMapper->SetInputConnection(vertexGlyphFilter->GetOutputPort());
	vtkNew<vtkActor> pointsActor;
	pointsActor->SetMapper(pointsMapper);
	pointsActor->GetProperty()->SetPointSize(5);//定义点的尺寸大小,这样点才能在画布上显示出来
	pointsActor->GetProperty()->SetColor(0.0, 0.0, 1);
	
	vtkIdType number = intersectPoints->GetNumberOfPoints();
	vtkNew<vtkPoints> results;
	if (number == 2) {
    
    
		double point1[3] = {
    
     0 };
		double point2[3] = {
    
     0 };
		intersectPoints->GetPoint(0, point1);
		intersectPoints->GetPoint(1, point2);
		
		double distance = distanceTwoPoints(point1, point2);
		vtkNew<vtkLineSource> line_inside;
		line_inside->SetPoint1(point1);
		line_inside->SetPoint2(point2);
		line_inside->Update();
		
		results->InsertNextPoint(point1);
		results->InsertNextPoint(point2);
		
		double current_pos[3] = {
    
     point1[0],point1[1],point1[2] };
		
		while (current_pos[0] + step_len[0] < point2[0]) {
    
    
			current_pos[0] += step_len[0];
			current_pos[1] += step_len[1];
			current_pos[2] += step_len[2];
			results->InsertNextPoint(current_pos[0], current_pos[1], current_pos[2]);
			cout << "x:" << current_pos[0] << "y:" << current_pos[1] << "z:" << current_pos[2] << endl;
		}
		//results->DeepCopy(line_inside->GetOutput()->GetPoints());
	}
	vtkNew<vtkPolyData> resultPolydata;
	resultPolydata->SetPoints(results);

	vtkNew<vtkVertexGlyphFilter> resultGlyphFilter;
	resultGlyphFilter->AddInputData(resultPolydata);
	resultGlyphFilter->Update();

	vtkNew<vtkPolyDataMapper> resultMapper;
	resultMapper->SetInputConnection(resultGlyphFilter->GetOutputPort());
	vtkNew<vtkActor> resultActor;
	resultActor->SetMapper(resultMapper);
	resultActor->GetProperty()->SetPointSize(5);//定义点的尺寸大小,这样点才能在画布上显示出来
	resultActor->GetProperty()->SetColor(1, 0.0, 0.0);

	vtkNew<vtkRenderer> render;
	render->AddActor(actor);
	render->AddActor(lineActor);
	
	render->AddActor(resultActor);
	render->AddActor(pointsActor);
	vtkNew<vtkRenderWindow> ren_win;
	ren_win->AddRenderer(render);
	ren_win->Render();

	vtkNew<vtkRenderWindowInteractor> interactor;
	interactor->SetRenderWindow(ren_win);
	interactor->Initialize();
	interactor->Start();

	return 0;
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/liushao1031177/article/details/120268866
今日推荐