#include <vtkSmartPointer.h>
#include <vtkPlaneSource.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkLine.h>
#include <vtkPlane.h>
#include <vtkIntersectionPolyDataFilter.h>
int main() {
// 创建平面源
vtkSmartPointer<vtkPlaneSource> planeSource = vtkSmartPointer<vtkPlaneSource>::New();
planeSource->Update();
// 创建PolyDataMapper和Actor
vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
mapper->SetInputConnection(planeSource->GetOutputPort());
vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
actor->SetMapper(mapper);
// 创建Renderer和RenderWindow
vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
renderWindow->AddRenderer(renderer);
vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
renderWindowInteractor->SetRenderWindow(renderWindow);
// 添加Actor到Renderer
renderer->AddActor(actor);
renderer->SetBackground(1, 1, 1);
// 渲染并显示窗口
renderWindow->Render();
renderWindowInteractor->Start();
// 创建一条直线
double p0[3] = {0.0, 0.0, 5.0};
double p1[3] = {0.0, 0.0, -5.0};
vtkSmartPointer<vtkLine> line = vtkSmartPointer<vtkLine>::New();
line->SetPoint1(p0);
line->SetPoint2(p1);
// 获取平面的法向量和点
double normal[3];
planeSource->GetNormal(normal);
double origin[3];
planeSource->GetOrigin(origin);
vtkSmartPointer<vtkPlane> plane = vtkSmartPointer<vtkPlane>::New();
plane->SetNormal(normal);
plane->SetOrigin(origin);
// 计算直线和平面的交点
vtkSmartPointer<vtkIntersectionPolyDataFilter> intersectionFilter = vtkSmartPointer<vtkIntersectionPolyDataFilter>::New();
intersectionFilter->SetInputData(0, line);
intersectionFilter->SetInputData(1, planeSource->GetOutput());
intersectionFilter->Update();
// 输出交点的坐标
vtkSmartPointer<vtkPoints> intersectionPoints = intersectionFilter->GetOutput()->GetPoints();
double intersectionPoint[3];
intersectionPoints->GetPoint(0, intersectionPoint);
cout << "Intersection point: (" << intersectionPoint[0] << ", " << intersectionPoint[1] << ", " << intersectionPoint[2] << ")" << endl;
return 0;
}