创建一个立方体和一条穿过该立方体的直线
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();
计算交点并显示
使用IntersectWithLine
方法获取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);
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红色的点显示
使用vtkLineSource
类生成一条直线,以两个交点作为线段两个端点,设置分辨率SetResolution
为10,将线段分为10段,共有11个顶点;
vtkNew<vtkLineSource> line_inside;
line_inside->SetPoint1(intersectPoints->GetPoint(0));
line_inside->SetPoint2(intersectPoints->GetPoint(1));
line_inside->SetResolution(10);
line_inside->Update();
通过line_inside->GetOutput()->GetPoint(i, position_world);
可以将11个顶点的世界坐标显示出来;
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();
如果一个端点为开始,设置xyz
三个方向上的步进,就可以依次求得间隔的顶点;也可以按照一个方向上设置间隔时应该生成段的个数,使用vtkLineSource
获得每个顶点的坐标;
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;
}