level 3
zero9079
楼主
下面是继承 vtkInteractorStyleImage类来用鼠标右键画一条线,不知道为什么画不到图片上,哪位大神帮帮忙,我要疯了~~~~~~~~~~~~~~~~~~~~
#include <vtkSmartPointer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkInteractorStyleImage.h>
#include <vtkJPEGReader.h>
#include <vtkImageActor.h>
#include <vtkRendererCollection.h>
#include <vtkPointPicker.h>
#include <vtkSphereSource.h>
#include <vtkPolyDataMapper.h>
#include <vtkRenderer.h>
#include <vtkActor.h>
#include <vtkInteractorStyleTrackballCamera.h>
#include <vtkObjectFactory.h>
#include <vtkProperty.h>
#include <vtkLineSource.h>
class PointPickerInteractorStyle : public vtkInteractorStyleImage
{
public:
static PointPickerInteractorStyle* New();
vtkTypeMacro(PointPickerInteractorStyle, vtkInteractorStyleImage);
virtual void OnRightButtonDown()
{
std::cout << "Picking pixel: " << this->Interactor->GetEventPosition()[0] << " " << this->Interactor- >GetEventPosition()[1] << std::endl;
this->Interactor->GetPicker()->Pick(this->Interactor->GetEventPosition()[0],
this->Interactor->GetEventPosition()[1],
0, // always zero.
this->Interactor->GetRenderWindow()->GetRenderers()->GetFirstRenderer());
double picked[3];
this->Interactor->GetPicker()->GetPickPosition(picked);
std::cout << "Picked value: " << picked[0] << " " << picked[1] << " " << picked[2] << std::endl;
vtkSmartPointer<vtkLineSource> lineSource = vtkSmartPointer<vtkLineSource>::New();
double leftup[3], leftdown[3];
leftup[0] = picked[0], leftup[1] = picked[1], leftup[2] = picked[2];
leftdown[0] = picked[0] + 1, leftdown[1] = picked[1] + 1, leftdown[2] = picked[2];
lineSource->SetPoint1(leftup);
lineSource->SetPoint2(leftdown);
lineSource->Update();
vtkSmartPointer<vtkPolyDataMapper> mapper =
vtkSmartPointer<vtkPolyDataMapper>::New();
mapper->SetInputConnection(lineSource->GetOutputPort());
vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
actor->SetMapper(mapper);
actor->SetPosition(picked);
//actor->SetScale(0.05);
actor->GetProperty()->SetColor(1.0, 0.0, 0.0);
this->Interactor->GetRenderWindow()->GetRenderers()->GetFirstRenderer()->AddActor(actor);
//this->Interactor->GetRenderWindow()->Render();
//QMessageBox::information(this, "Note", "drawRect event", QMessageBox::Yes);
//vtkInteractorStyleImage::OnRightButtonDown();
}
};
2016年11月19日 02点11分
1
#include <vtkSmartPointer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkInteractorStyleImage.h>
#include <vtkJPEGReader.h>
#include <vtkImageActor.h>
#include <vtkRendererCollection.h>
#include <vtkPointPicker.h>
#include <vtkSphereSource.h>
#include <vtkPolyDataMapper.h>
#include <vtkRenderer.h>
#include <vtkActor.h>
#include <vtkInteractorStyleTrackballCamera.h>
#include <vtkObjectFactory.h>
#include <vtkProperty.h>
#include <vtkLineSource.h>
class PointPickerInteractorStyle : public vtkInteractorStyleImage
{
public:
static PointPickerInteractorStyle* New();
vtkTypeMacro(PointPickerInteractorStyle, vtkInteractorStyleImage);
virtual void OnRightButtonDown()
{
std::cout << "Picking pixel: " << this->Interactor->GetEventPosition()[0] << " " << this->Interactor- >GetEventPosition()[1] << std::endl;
this->Interactor->GetPicker()->Pick(this->Interactor->GetEventPosition()[0],
this->Interactor->GetEventPosition()[1],
0, // always zero.
this->Interactor->GetRenderWindow()->GetRenderers()->GetFirstRenderer());
double picked[3];
this->Interactor->GetPicker()->GetPickPosition(picked);
std::cout << "Picked value: " << picked[0] << " " << picked[1] << " " << picked[2] << std::endl;
vtkSmartPointer<vtkLineSource> lineSource = vtkSmartPointer<vtkLineSource>::New();
double leftup[3], leftdown[3];
leftup[0] = picked[0], leftup[1] = picked[1], leftup[2] = picked[2];
leftdown[0] = picked[0] + 1, leftdown[1] = picked[1] + 1, leftdown[2] = picked[2];
lineSource->SetPoint1(leftup);
lineSource->SetPoint2(leftdown);
lineSource->Update();
vtkSmartPointer<vtkPolyDataMapper> mapper =
vtkSmartPointer<vtkPolyDataMapper>::New();
mapper->SetInputConnection(lineSource->GetOutputPort());
vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
actor->SetMapper(mapper);
actor->SetPosition(picked);
//actor->SetScale(0.05);
actor->GetProperty()->SetColor(1.0, 0.0, 0.0);
this->Interactor->GetRenderWindow()->GetRenderers()->GetFirstRenderer()->AddActor(actor);
//this->Interactor->GetRenderWindow()->Render();
//QMessageBox::information(this, "Note", "drawRect event", QMessageBox::Yes);
//vtkInteractorStyleImage::OnRightButtonDown();
}
};