基本信息
源码名称: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;
}