在好例子网,分享、交流、成长!
您当前所在位置:首页C/C++ 开发实例图形和图像处理 → vtkLineWidget实例

vtkLineWidget实例

图形和图像处理

下载此实例
  • 开发语言:C/C++
  • 实例大小:36.06M
  • 下载次数:16
  • 浏览次数:668
  • 发布时间:2019-12-17
  • 实例类别:图形和图像处理
  • 发 布 人:cyberobot
  • 文件格式:.7z
  • 所需积分:2
 相关标签: VTK

实例介绍

【实例简介】

【实例截图】

from clipboard

【核心代码】

#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkPolyData.h>
#include <vtkSmartPointer.h>
#include <vtkSphereSource.h>
#include <vtkLineWidget2.h>
#include <vtkLineRepresentation.h>
#include <vtkCommand.h>
#include <vtkEllipseArcSource.h>
#include <vtkRendererCollection.h>
#include <vtkActorCollection.h>
#include <vtkTextWidget.h>
#include <vtkTextActor.h>
#include <vtkAnnotation.h>
#include <vtkAnnotatedCubeActor.h>
#include <vtkInformation.h>
#include <vtkVectorText.h>
#include <vtktextmapper.h>
#include <vtkProperty.h>
#include <vtkFollower.h>
#include <vtkCamera.h>
#include <vtkInteractorObserver.h>
#include <vtkAxesActor.h>
#include <vtkDistanceWidget.h>
#include <vtkDistanceRepresentation.h>

class vtkLineCallback : public vtkCommand
{
  public:
    static vtkLineCallback *New()
    {
      return new vtkLineCallback;
    }

	void setProperty(vtkSmartPointer<vtkVectorText> vectorText, vtkSmartPointer<vtkFollower> actor, vtkSmartPointer<vtkEllipseArcSource> ellipse)
	{
		this->vectorText = vectorText;
		this->actor = actor;
		this->ellipse = ellipse;
	}

    virtual void Execute(vtkObject *caller, unsigned long eventID, void*)
    {
		vtkLineWidget2 *lineWidget = reinterpret_cast<vtkLineWidget2*>(caller);

		char text[200];
		sprintf(text, "%.2f mm", lineWidget->GetLineRepresentation()->GetDistance());
		vtkNew<vtkPolyData> polydata;
		lineWidget->GetLineRepresentation()->GetPolyData (polydata);
		
		double pA[3], pB[3];
		int num;
		vtkPoints* points = polydata->GetPoints();
		polydata->GetPoint(0, pA);
		polydata->GetPoint(num = points->GetNumberOfPoints() - 1, pB);
		std::cout<< "PA: " << setiosflags(ios::fixed) << setprecision(6) << pA[0] << " " << pA[1] << " " << pA[2] << "\t\t"
			<< "PB: " << pB[0] << " " << pB[1] << " " << pB[2] << std::endl;

		double majorRadius[3] = { (pB[0] - pA[0]) / 2, (pB[1] - pA[1]) / 2, (pB[2] - pA[2]) / 2 };
		double pCenter[3] = { (pA[0]   pB[0]) / 2, (pA[1]   pB[1]) / 2, (pA[2]   pB[2]) / 2 };
		double Length =  std::sqrt(std::pow((pB[0] - pA[0]), 2)   std::pow((pB[1] - pA[1]), 2)   std::pow((pB[2] - pA[2]), 2));
		double pDisplay[3];

		vectorText->SetText(text);
		//actor->SetOrientation(lineWidget->GetRepresentation()->GetRenderer()->GetActiveCamera()->GetDirectionOfProjection());
		actor->SetPosition(pCenter);
		actor->SetScale(Length / 10);

		//Update everytime when trigger this event.
		//This normal setting would ensure the ellipse alwarys dispaly in 2D when updating.
		//ellipse->SetNormal(lineWidget->GetRepresentation()->GetRenderer()->GetActiveCamera()->GetDirectionOfProjection());
		ellipse->SetCenter(pCenter);
		ellipse->SetMajorRadiusVector(majorRadius);
    }
	vtkSmartPointer<vtkVectorText> vectorText = nullptr;
	vtkSmartPointer<vtkActor> actor = nullptr;
	vtkSmartPointer<vtkEllipseArcSource> ellipse = nullptr;
};
 
int main(int, char *[])
{
	/*/////////////////////////////////////////////////////////////////////////
	Basic rendering settings
	/////////////////////////////////////////////////////////////////////////*/
	vtkNew<vtkRenderer> renderer;
	vtkNew<vtkRenderWindow> renderWindow;
	vtkNew<vtkRenderWindowInteractor> renderWindowInteractor;
	renderWindow->SetSize(600, 400);
	renderWindow->AddRenderer(renderer);
	renderWindowInteractor->SetRenderWindow(renderWindow);

	/*/////////////////////////////////////////////////////////////////////////
	vtkLineWidget2
	/////////////////////////////////////////////////////////////////////////*/
	vtkNew<vtkLineWidget2> lineWidget;
	lineWidget->CreateDefaultRepresentation();
	double pStart[3] = { 0, 0, 0 }, pEnd[3] = { 1, 1, 1 };
	lineWidget->GetLineRepresentation()->SetPoint1DisplayPosition(pStart); //SetPoint1WorldPosition
	lineWidget->GetLineRepresentation()->SetPoint1DisplayPosition(pEnd);
	lineWidget->SetInteractor(renderWindowInteractor);

	/*/////////////////////////////////////////////////////////////////////////
	vtkEllipseArcSource
	/////////////////////////////////////////////////////////////////////////*/
	vtkNew<vtkEllipseArcSource> ellipse;
	vtkNew<vtkPolyDataMapper> mapperText;
	mapperText->SetInputConnection(ellipse->GetOutputPort());
	vtkNew<vtkActor> ellipseActor;
	ellipseActor->SetMapper(mapperText);
	ellipse->SetSegmentAngle(360);
	ellipse->SetRatio(0.5);
	ellipse->SetNormal(renderer->GetActiveCamera()->GetDirectionOfProjection());
	double lineStart[3], lineEnd[3];
	lineWidget->GetLineRepresentation()->GetPoint1WorldPosition(lineStart);
	lineWidget->GetLineRepresentation()->GetPoint2WorldPosition(lineEnd);
	double pCenter[3] = { (lineEnd[0]   lineStart[0]) / 2,(lineEnd[1]   lineStart[1]) / 2, (lineEnd[2]   lineStart[2]) / 2 };
	ellipse->SetCenter(pCenter);
	double vMajorRadius[3] = { (lineEnd[0] - lineStart[0]) / 2,(lineEnd[1] - lineStart[1]) / 2, (lineEnd[2] - lineStart[2]) / 2};
	ellipse->SetMajorRadiusVector(vMajorRadius);
	renderer->AddActor(ellipseActor);

	/*/////////////////////////////////////////////////////////////////////////
	vtkVectorText
	/////////////////////////////////////////////////////////////////////////*/
	vtkNew<vtkVectorText> vectorText;
	vtkNew<vtkPolyDataMapper> txtMapper;
	vtkNew <vtkFollower> textActor;
	char text[200];
	double distance = lineWidget->GetLineRepresentation()->GetDistance();
	sprintf(text, "%.2f mm", distance);
	vectorText->SetText(text);
	textActor->SetScale(distance / 10);
	textActor->SetCamera(renderer->GetActiveCamera());
	txtMapper->SetInputConnection(vectorText->GetOutputPort());
	textActor->SetMapper(txtMapper);
	renderer->AddActor(textActor);

	/*/////////////////////////////////////////////////////////////////////////
	vtkLineCallback
	/////////////////////////////////////////////////////////////////////////*/
	vtkNew<vtkLineCallback> lineCallback;
	lineCallback->setProperty(vectorText, textActor, ellipse);
	lineWidget->AddObserver(vtkCommand::InteractionEvent, lineCallback);
	lineWidget->On();

	/*/////////////////////////////////////////////////////////////////////////
	vtkAxesActor
	/////////////////////////////////////////////////////////////////////////*/
	vtkNew<vtkAxesActor> oriAxesActor;
	oriAxesActor->SetPosition(pCenter);
	oriAxesActor->SetTotalLength(distance / 3 , distance / 3, distance / 3);
	oriAxesActor->SetShaftType(0);
	oriAxesActor->SetAxisLabels(1);
	oriAxesActor->SetConeRadius(distance / 5);
	oriAxesActor->SetCylinderRadius(distance / 50);
	renderer->AddActor(oriAxesActor);

	/*/////////////////////////////////////////////////////////////////////////
	Initial component about rendering
	/////////////////////////////////////////////////////////////////////////*/
	renderWindow->Render();
	renderWindowInteractor->Initialize();
	renderWindow->Render();
	renderWindowInteractor->Start();

	return EXIT_SUCCESS;
}

标签: VTK

实例下载地址

vtkLineWidget实例

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警