基本信息
源码名称:vtkLineWidget实例
源码大小:36.06M
文件格式:.7z
开发语言:C/C++
更新时间:2019-12-17
友情提示:(无需注册或充值,赞助后即可获取资源下载链接)
嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300
本次赞助数额为: 2 元×
微信扫码支付:2 元
×
请留下您的邮箱,我们将在2小时内将文件发到您的邮箱
源码介绍
#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; }