VTK 学习----VTK对象绘制-点(vtkPoints、vtkSphereSource)、线(vtkLine、vtkLineSource)

5.3 线

5.3.1 对象接口说明

vtk中的vtkLine、vtkLineSource两个都能起到绘制线的作用。它们的接口说明如下:

vtkLine:

Intersection

将两条有限的三维线投影到二维平面上。如果两条直线在垂直于这两条直线的叉乘的平面上的投影相交,就会得到一个交点。参数(u,v)是直线在最接近点处的参数坐标。

Intersection3D

求有限三维线的交点。如果这两条直线在垂直于这两条直线的叉乘的平面上的投影相交,并且最近的接近点之间的距离在相对公差范围内,就可以找到交点。参数(u,v)是直线在最接近点处的参数坐标。注意:“Intersection()决定两条直线在平面上的投影是否相交,而Intersection3D()决定直线本身在三维空间中是否相交,且在公差范围内。”

static double DistanceToLine(const double x[3], const double p1[3], const double p2[3]);

求前顶点到由提供的顶点定义的边的距离。返回距离的平方。注:线的范围假设为无穷大。

LineSource

vtkLineSource派生于vtkPolyDataAlgorithm,无单独重要接口。

5.3.2 代码实现显示线

vtkLine:

void ESLine::createLine()
{
	auto pts = m_pTrackReader->getPoints();
	vtkSmartPointer<vtkCellArray> lineCell = vtkSmartPointer<vtkCellArray>::New();
	vtkSmartPointer<vtkPoints> linePts = vtkSmartPointer<vtkPoints>::New();
	VTKPoint3D pt1, pt2;
	int size = pts.size();
	for (int index = 0; index < size - 1; ++index)
	{
		vtkSmartPointer<vtkLine> line = vtkSmartPointer<vtkLine>::New();
		pt1 = pts.at(index);
		pt2 = pts.at(index + 1);
		vtkIdType id1 = linePts->InsertNextPoint(pt1.m_x, pt1.m_y, pt1.m_z);
		vtkIdType id2 = linePts->InsertNextPoint(pt2.m_x, pt2.m_y, pt2.m_z);
		line->GetPointIds()->SetId(0, id1);
		line->GetPointIds()->SetId(1, id2);
		lineCell->InsertNextCell(line);
	}
	vtkSmartPointer<vtkPolyData> polyData = vtkSmartPointer<vtkPolyData>::New();
	polyData->SetPoints(linePts);
	polyData->SetLines(lineCell);
	vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
	mapper->SetInputData(polyData);
	vtkSmartPointer<vtkLODActor> actor = vtkSmartPointer<vtkLODActor>::New();
	actor->SetMapper(mapper);
	double* scale = m_vtkView->zoomScale();
	actor->SetScale(scale[0], scale[1], scale[2]);
	m_pRender->AddActor(actor);
	m_pRender->ResetCamera();
	m_pRender->ResetCameraClippingRange();
	m_pRenderWnd->Render();
}

vtkLineSource

void ESLine::createLineSource()
{
	auto pts = m_pTrackReader->getPoints();

	vtkSmartPointer<vtkLineSource> lineSource = vtkSmartPointer<vtkLineSource>::New();
	vtkSmartPointer<vtkPoints> inputPts = vtkSmartPointer<vtkPoints>::New();
	inputPts->SetDataType(VTK_DOUBLE);
	//DataArea.IffyArea();
	auto pt = pts.front();
	int size = pts.size();
	for (int index = 0; index < size; ++index)
	{
		pt = pts.at(index);
		inputPts->InsertNextPoint(pt.m_x, pt.m_y, pt.m_z);
	}
	lineSource->SetPoints(inputPts);
	lineSource->Update();

	vtkSmartPointer<vtkPolyDataMapper> tubeMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
	tubeMapper->SetInputConnection(/*tubeFilter*/lineSource->GetOutputPort());
	vtkSmartPointer<vtkLODActor> actor = vtkSmartPointer<vtkLODActor>::New();
	actor->SetMapper(tubeMapper);
	double* scale = m_vtkView->zoomScale();
	actor->SetScale(scale[0], scale[1], scale[2]);
	m_pRender->AddActor(actor);
	m_pRender->ResetCamera();
	m_pRender->ResetCameraClippingRange();
	m_pRenderWnd->Render();
}

5.4 点

5.4.1 对象接口说明

vtk中可以用vtkPoints画点和vtkSphereSource画球来表示三维空间中的点。下面重点说明下vtkSphereSource及其接口。

vtkSphereSource创建一个以原点为中心的指定半径的球体(由多边形表示)。可以指定纬度(phi)和经度(θ)方向上的分辨率(多边形离散化)。也可以通过指定最大phi和θ角来创建部分球体。默认情况下,球体的曲面细分使用三角形; 但是,您可以设置LatLongTessellation以使用四边形生成曲面细分。

vtkSphereSource的接口如下:

SetRadius (double)

设置球体半径。默认值为0.5

SetCenter (doubledoubledouble)

设置球体的中心。默认值为0,0,0。

SetThetaResolution (int)

设置经度方向上的点数(从StartTheta到EndTheta)。

SetPhiResolution (int)

设置纬度方向上的点数(范围从StartPhi到EndPhi)。

SetStartTheta (double)

设置起始经度角。默认情况下,StartTheta = 0度。

SetEndTheta (double)

设置结束经度角。默认情况下,EndTheta = 360度。

SetStartPhi (double)

设置起始纬度角度(0表示北极)。默认情况下,StartPhi = 0度。

SetEndPhi (double)

设置结束纬度角度。默认情况下,EndPhi = 180度。

SetLatLongTessellation (vtkTypeBool)

使球体沿经纬度线的边缘镶嵌在一起。如果关闭,则在非极性区域生成三角形,这将导致不平行于经纬度线的边缘。如果打开,四边形将在除两极以外的所有地方生成。这对于生成具有自然经纬度线的线框球体非常有用。

SetOutputPointsPrecision (int)

设置/获得输出点所需的精度。vtkAlgorithm :: SINGLE_PRECISION - 输出单精度浮点数。vtkAlgorithm :: DOUBLE_PRECISION - 输出双精度浮点数。

5.4.2 代码实现显示点和球

显示点:

void ESPoint::createPoint(const VTKPoint3D& pt)
{
	vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
	vtkSmartPointer<vtkCellArray> vertices = vtkSmartPointer<vtkCellArray>::New();
	vtkIdType pid[1];
	pid[0] = points->InsertNextPoint(pt.m_x, pt.m_y, pt.m_z);
	vertices->InsertNextCell(1, pid);
	vtkSmartPointer<vtkPolyData> point = vtkSmartPointer<vtkPolyData>::New();
	point->SetPoints(points);
	point->SetVerts(vertices);
	vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
	mapper->SetInputData(point);
	vtkSmartPointer<vtkLODActor> actor = vtkSmartPointer<vtkLODActor>::New();
	actor->SetMapper(mapper);
	actor->GetProperty()->SetColor(1, 0, 0);
	actor->GetProperty()->SetPointSize(10);
	double* scale = m_vtkView->zoomScale();
	actor->SetScale(scale[0], scale[1], scale[2]);
	m_pRender->AddActor(actor);
}

这种方式显示的点,无法在放大缩小时,点跟着放大缩小。

显示球:

void ESPoint::createSphere(const VTKPoint3D& pt)
{
	double* scale = m_vtkView->zoomScale();
	vtkSmartPointer<vtkSphereSource> sphereSource = vtkSmartPointer<vtkSphereSource>::New();
	sphereSource->SetCenter(pt.m_x * scale[0]/* / 2.0*/, pt.m_y * scale[1], pt.m_z * scale[2]);
	sphereSource->SetRadius(100);
	sphereSource->SetThetaResolution(40);
	sphereSource->SetPhiResolution(40);
	sphereSource->Update();

	//create a mapper
	vtkSmartPointer<vtkPolyDataMapper> sphereMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
	sphereMapper->SetInputConnection(sphereSource->GetOutputPort());

	// create an actor
	vtkSmartPointer<vtkLODActor> sphereActor = vtkSmartPointer<vtkLODActor>::New();
	sphereActor->SetMapper(sphereMapper);
	sphereActor->GetProperty()->SetColor(1, 0, 0);

	sphereActor->SetScale(1.0, 1, 1/*scale[2]*/);
	m_pRender->AddActor(sphereActor);

}

还可以通过SetScale来控制让点绘制成椭球状。

  • 3
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

dylan55_you

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

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

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

打赏作者

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

抵扣说明:

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

余额充值