(c++)已知空间三维两个点坐标,得到直线方程以及两点之间所有的点,使用VTK进行绘制显示

  1. 直线参数方程
    如果是在二维坐标系下,已知两个点p1(x1, y1), p2(x2, y2), 很容易求得两点之间的斜率,然后使用y = kx + b计算出k,b值得到直线方程。同理在三维空间下仍然可以使用直线参数方程。
    x = x1 + dx * t,
    y = y1 + dy * t,
    z = z1 + dz * t

    例如:
    已知p1(x1, y1, z1), p2(x2, y2, z2)个点,可以求得p1p2两个点的方向向量d。
    d = p2 - p1 = ((x2 - x1), (y2 - y1), (z2 - z1))。
    可以求得t = |d| / √d。

  2. c++代码求解方程
    a.首先定义点的结构

    struct Points3D
    {
    	float x;
    	float y;
    	float z;
    };
    

    b . 计算两个点的方向向量

    	void LinearEquation::GetDirection(float * Direction)
    	{
    		
    		Direction[0] = m_p2.x - m_p1.x;
    		Direction[1] = m_p2.y - m_p1.y;
    		Direction[2] = m_p2.z - m_p1.z;
    	}
    

    c.然后计算向量模长

    float GetLength(float* Matrix)
    {
    	float x = pow(Matrix[0], 2);
    	float y = pow(Matrix[1], 2);
    	float z = pow(Matrix[2], 2);
    
    	return sqrt(x + y + z);
    }
    

    d.得到参数t以及dx,dy,dz,主要代码如下

    void GetEquationParameters(float& dx, float& dy, float& dz, float& t)
    {
    	float Direction[3];
    	GetDirection(Direction); ///得到两点的方向向量
    
    	float L_D = GetLength(Direction); //得到方向向量的模长
    
    	float std_D[3];
    	memcpy(std_D, Direction, sizeof(Direction));
    	GetNormVector(std_D);  //得到单位向量
    
    	dx = std_D[0];
    	dy = std_D[1];
    	dz = std_D[2];
    
    	float L_std_D = GetLength(std_D);
    
    	t = L_D / L_std_D;  //t = |d| / √d;
    }
    

    e. 得到两点之间的所有点,interval代表采点的间隔。

    void GetLinearPoints(float interval, std::vector<Points3D>& points)
    		{
    			float dx, dy, dz, t;
    			GetEquationParameters(dx, dy, dz, t);
    		
    			
    			for (int i = 0; i < int(m_NumPoints / interval); i++){
    				float x = m_p1.x + dx * t * interval * i;
    				float y = m_p1.y + dy * t * interval * i;
    				float z = m_p1.z + dz * t * interval * i;
    		
    				float dis = sqrt(pow(m_p2.x - x, 2) + pow(m_p2.y - y, 2) + pow(m_p2.z - z, 2));
    				if (dis < 1.0)
    					break;
    		
    				Points3D pt;
    				pt.x = x;
    				pt.y = y;
    				pt.z = z;
    				points.push_back(pt);
    		
    			}
    		
    		}
    
  3. 使用VTK进行点绘制显示

    #ifndef INITIAL_OPENGL
    #define INITIAL_OPENGL
    
    #include <vtkAutoInit.h>
    VTK_MODULE_INIT(vtkRenderingOpenGL2)
    VTK_MODULE_INIT(vtkInteractionStyle)
    #endif  //不加这5行会报错
    
    
    #include "vtkPoints.h"
    #include "vtkSmartPointer.h"
    #include "vtkActor.h"
    #include "vtkCellArray.h"
    #include "vtkPolyData.h"
    #include "vtkPolyDataMapper.h"
    #include "vtkRenderer.h"
    #include "vtkRenderWindow.h"
    #include "vtkRenderWindowInteractor.h"
    #include "vtkProperty.h"
    
    void VtkDrawPoints(vector<Points3D> pt)
    {
    	vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
    	vtkSmartPointer<vtkCellArray> vertices = vtkSmartPointer<vtkCellArray>::New();
    	vtkSmartPointer<vtkPolyData> polydata = vtkSmartPointer<vtkPolyData>::New();
    	vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
    	vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
    	vtkSmartPointer<vtkRenderer> render = vtkSmartPointer<vtkRenderer>::New();
    	vtkSmartPointer<vtkRenderWindow> window = vtkSmartPointer<vtkRenderWindow>::New();
    	vtkSmartPointer<vtkRenderWindowInteractor> win_render = vtkSmartPointer<vtkRenderWindowInteractor>::New();
    
    	int Num = pt.size();
    
    	for (int i = 0; i < Num; i++) {
    		vtkIdType id = points->InsertNextPoint(pt[i].x, pt[i].y, pt[i].z);
    		vertices->InsertNextCell(1);
    		vertices->InsertCellPoint(id);
    	}
    
    	
    	polydata->SetPoints(points);
    	polydata->SetVerts(vertices);
    	
    	
    	mapper->SetInputData(polydata);
    	
    	actor->SetMapper(mapper);
    	actor->GetProperty()->SetColor(255, 0, 0);
    	actor->GetProperty()->SetPointSize(2);
    
    	render->AddActor(actor);
    	render->SetBackground(0, 0, 0);
    
    	window->AddRenderer(render);
    	window->SetSize(600, 600);
    
    	win_render->SetRenderWindow(window);
    	win_render->Initialize();
    	win_render->Start();
    }
    

完整代码可以访问此链接c++求空间直线方程并使用vtk进行绘制显示

  • 6
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
要将已知坐标三维连接成曲线并将其拉伸为曲面,您可以使用 Qt 和 VTK 库。以下是一个简单的代码示例,它演示了如何使用 VTK 创建曲线并将其拉伸为曲面: ```cpp #include <vtkSmartPointer.h> #include <vtkPoints.h> #include <vtkCellArray.h> #include <vtkPolyData.h> #include <vtkPolyDataMapper.h> #include <vtkActor.h> #include <vtkRenderer.h> #include <vtkRenderWindow.h> #include <vtkRenderWindowInteractor.h> #include <vtkParametricSpline.h> #include <vtkParametricFunctionSource.h> #include <vtkParametricSurfaceSource.h> int main(int, char *[]) { // Create some points vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New(); points->InsertNextPoint(0,0,0); points->InsertNextPoint(1,0,0); points->InsertNextPoint(2,1,0); points->InsertNextPoint(3,2,1); points->InsertNextPoint(4,3,2); // Create a spline vtkSmartPointer<vtkParametricSpline> spline = vtkSmartPointer<vtkParametricSpline>::New(); spline->SetPoints(points); // Create a curve vtkSmartPointer<vtkParametricFunctionSource> curveSource = vtkSmartPointer<vtkParametricFunctionSource>::New(); curveSource->SetParametricFunction(spline); curveSource->Update(); // Create a surface vtkSmartPointer<vtkParametricSurfaceSource> surfaceSource = vtkSmartPointer<vtkParametricSurfaceSource>::New(); surfaceSource->SetParametricFunction(spline); surfaceSource->SetUResolution(30); surfaceSource->SetVResolution(30); surfaceSource->Update(); // Visualize vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New(); mapper->SetInputData(curveSource->GetOutput()); vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New(); actor->SetMapper(mapper); vtkSmartPointer<vtkPolyDataMapper> surfaceMapper = vtkSmartPointer<vtkPolyDataMapper>::New(); surfaceMapper->SetInputData(surfaceSource->GetOutput()); vtkSmartPointer<vtkActor> surfaceActor = vtkSmartPointer<vtkActor>::New(); surfaceActor->SetMapper(surfaceMapper); vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New(); renderer->AddActor(actor); renderer->AddActor(surfaceActor); vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New(); renderWindow->AddRenderer(renderer); vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor = vtkSmartPointer<vtkRenderWindowInteractor>::New(); renderWindowInteractor->SetRenderWindow(renderWindow); renderWindow->Render(); renderWindowInteractor->Start(); return EXIT_SUCCESS; } ``` 以上代码使用了 `vtkParametricSpline` 类来创建一个样条曲线,然后使用 `vtkParametricFunctionSource` 类将曲线转换为 `vtkPolyData` 对象。接下来,使用 `vtkParametricSurfaceSource` 类将曲线拉伸为曲面。最后,使用 `vtkPolyDataMapper` 类和 `vtkActor` 类将曲线和曲面添加到 `vtkRenderer` 类中,并使用 `vtkRenderWindow` 类将其显示在屏幕上。 您可以根据需要修改代码以适应您的应用程序。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

花生米生花@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值