#include "vtkSmartPointer.h"
#include "vtkAngleWidget.h"
#include "vtkAngleRepresentation2D.h"
#include "vtkSphereSource.h"
#include "vtkPolyDataMapper.h"
#include "vtkActor.h"
#include "vtkRenderer.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkCommand.h"
#include "vtkCoordinate.h"
#include "vtkMath.h"
#include "vtkHandleWidget.h"
#include "vtkPointHandleRepresentation2D.h"
#include "vtkAxisActor2D.h"
#include "vtkLeaderActor2D.h"
#include "vtkProperty2D.h"
// This callback is responsible for setting the angle label.
class vtkAngleCallback : public vtkCommand
{
public:
static vtkAngleCallback *New()
{
return new vtkAngleCallback;
}
virtual void Execute(vtkObject*, unsigned long eid, void*)
{
if (eid == vtkCommand::PlacePointEvent)
{
std::cout << "point placed\n";
}
else if (eid == vtkCommand::InteractionEvent)
{
double point1[3], center[3], point2[3];
this->Rep->GetPoint1WorldPosition(point1);
this->Rep->GetCenterWorldPosition(center);
this->Rep->GetPoint2WorldPosition(point2);
std::cout << "Angle between " << "("
<< point1[0] << ","
<< point1[1] << ","
<< point1[2] << "), ("
<< center[0] << ","
<< center[1] << ","
<< center[2] << ") and ("
<< point2[0] << ","
<< point2[1] << ","
<< point2[2] << ") is "
<< this->Rep->GetAngle() << std::endl;
}
}
vtkAngleRepresentation2D *Rep;
vtkAngleCallback() :Rep(0) {}
};
// The actual test function
int main(int argc, char *argv[])
{
// Create the RenderWindow, Renderer and both Actors
//
vtkSmartPointer< vtkRenderer > ren1
= vtkSmartPointer< vtkRenderer >::New();
vtkSmartPointer< vtkRenderWindow > renWin
= vtkSmartPointer< vtkRenderWindow >::New();
renWin->AddRenderer(ren1);
vtkSmartPointer< vtkRenderWindowInteractor > iren
= vtkSmartPointer< vtkRenderWindowInteractor >::New();
iren->SetRenderWindow(renWin);
// Create a test pipeline
//
vtkSmartPointer< vtkSphereSource > ss
= vtkSmartPointer< vtkSphereSource >::New();
ss->SetRadius(10);
vtkSmartPointer< vtkPolyDataMapper > mapper
= vtkSmartPointer< vtkPolyDataMapper >::New();
mapper->SetInputData(ss->GetOutput());
vtkSmartPointer< vtkActor > actor
= vtkSmartPointer< vtkActor >::New();
actor->SetMapper(mapper);
// Create the widget and its representation
vtkSmartPointer< vtkPointHandleRepresentation2D > handle
= vtkSmartPointer< vtkPointHandleRepresentation2D >::New();
handle->GetProperty()->SetColor(1, 0, 0);
vtkSmartPointer< vtkAngleRepresentation2D > rep
= vtkSmartPointer< vtkAngleRepresentation2D >::New();
rep->SetHandleRepresentation(handle);
vtkSmartPointer< vtkAngleWidget > widget
= vtkSmartPointer< vtkAngleWidget >::New();
widget->SetInteractor(iren);
widget->SetRepresentation(rep);
widget->CreateDefaultRepresentation();
vtkSmartPointer< vtkAngleCallback > mcbk
= vtkSmartPointer< vtkAngleCallback >::New();
mcbk->Rep = rep;
widget->AddObserver(vtkCommand::PlacePointEvent, mcbk);
widget->AddObserver(vtkCommand::InteractionEvent, mcbk);
// Add the actors to the renderer, set the background and size
//
ren1->AddActor(actor);
ren1->SetBackground(0.1, 0.2, 0.4);
renWin->SetSize(300, 300);
// render the image
//
iren->Initialize();
renWin->Render();
widget->On();
// Initialize
for (int i = 0; i < argc - 1; i++)
{
if (strcmp("--InitializeWorldPositions", argv[i]) == 0)
{
// Point 1
double p1[3] = { atof(argv[i + 1]), atof(argv[i + 2]), atof(argv[i + 3]) };
rep->GetPoint1Representation()->SetWorldPosition(p1);
rep->GetRay1()->GetPosition2Coordinate()->SetValue(p1);
// center
double c[3] = { atof(argv[i + 4]), atof(argv[i + 5]), atof(argv[i + 6]) };
rep->GetCenterRepresentation()->SetWorldPosition(c);
rep->GetRay1()->GetPositionCoordinate()->SetValue(c);
rep->GetRay2()->GetPositionCoordinate()->SetValue(c);
// point2
double p2[3] = { atof(argv[i + 7]), atof(argv[i + 8]), atof(argv[i + 9]) };
rep->GetPoint2Representation()->SetWorldPosition(p2);
rep->GetRay2()->GetPosition2Coordinate()->SetValue(p2);
}
if (strcmp("--InitializeDisplayPositions", argv[i]) == 0)
{
// Point 1
double p1[3] = { atof(argv[i + 1]), atof(argv[i + 2]), atof(argv[i + 3]) };
rep->SetPoint1DisplayPosition(p1);
// center
double c[3] = { atof(argv[i + 4]), atof(argv[i + 5]), atof(argv[i + 6]) };
rep->SetCenterDisplayPosition(c);
// point2
double p2[3] = { atof(argv[i + 7]), atof(argv[i + 8]), atof(argv[i + 9]) };
rep->SetPoint2DisplayPosition(p2);
}
}
//widget->WidgetIsDefined();
renWin->Render();
iren->Start();
}
VTK 角度测量
最新推荐文章于 2024-03-04 16:29:23 发布