我使用的是观察者/命令模式,我想得到的理想效果是:鼠标在A点时按下鼠标右键,这时按住右键不放移动鼠标,界面上实时会显示A点与鼠标当前点之间的连线;当松开右键时,界面上只显示A点与右键松开时坐标点之间的连线。但是目前我的程序显示的结果如图所示,当按住鼠标右键移动鼠标时,界面上会把鼠标移动过的点与A点的连线全都显示出来,一直没有找到解决方案。
class PickCommand : public vtkCommand
{
public:
static PickCommand *New()
{
return new PickCommand;
}
void Delete()
{
delete this;
}
virtual void Execute(vtkObject *caller, unsigned long l, void *callData)
{
if (picker->GetCellId() < 0 )
{
textActor->VisibilityOff();
double selpt[3];
picker->GetSelectionPoint(selpt);
double x = selpt[0];
double y = selpt[1];
picker->GetPickPosition( pickPos );
xp = pickPos[0];
yp = pickPos[1];
zp = pickPos[2];
cout<<" X:"<<xp<<" Y:"<<yp<<" Z:"<<zp<<endl;
// volume->VisibilityOff();
char text[120];
sprintf( text, "(%5.5f, %5.5f, %5.5f)", xp, yp, zp );
textMapper->SetInput( text );
textActor->SetPosition(x, y);
textActor->VisibilityOn();
}
else
{
}
renWin->Render();
}
};
void PickerInteractionCallback( vtkObject* vtkNotUsed(object),
unsigned long event,
void* clientdata,
void* vtkNotUsed(calldata) )
{
vtkInteractorStyleTrackballCamera * style =
(vtkInteractorStyleTrackballCamera*)clientdata;
int *pick = iren->GetEventPosition();
vtkPolyData *polydata = vtkPolyData::New();
vtkPolyDataMapper *lineMapper = vtkPolyDataMapper::New();
vtkActor *lineActor1 = vtkActor::New();
vtkPoints *points1 = vtkPoints::New();
vtkLine *line0 = vtkLine::New();
vtkCellArray *lines1 = vtkCellArray::New();
switch( event )
{
case vtkCommand::RightButtonPressEvent:
MouseMotion=1;
// double pickPos[3];
picker->Pick((double)pick[0], (double)pick[1], 0.0, ren);//拾取操作
picker->GetPickPosition( pickPos );
xp1 = pickPos[0];
yp1 = pickPos[1];
zp1 = pickPos[2];
break;
case vtkCommand::RightButtonReleaseEvent:
MouseMotion=0;
/* xp2=xp1;
yp2=yp1;
zp2=zp1;*/
break;
case vtkCommand::MouseMoveEvent:
if(MouseMotion)
{
picker->Pick((double)pick[0], (double)pick[1], 0.0, ren);//拾取操作
picker->GetPickPosition( pickPos );
xp2 = pickPos[0];
yp2 = pickPos[1];
zp2 = pickPos[2];
vtkPoints *points1 = vtkPoints::New();
points1->InsertNextPoint ( xp1, yp1, zp1 ); //返回第一个点的ID:0
points1->InsertNextPoint ( xp2, yp2, zp2 ); //返回第二个点的ID:1
//每两个坐标点之间分别创建一条线
//SetId()的第一个参数是线段的端点ID,第二个参数是连接的点的ID
vtkLine *line0 = vtkLine::New();
line0->GetPointIds()->SetId ( 0,1);
// line0->GetPointIds()->SetId ( 1,1 );
//创建Cell数组,用于存储以上创建的线段
vtkCellArray *lines1 = vtkCellArray::New();
lines1->InsertNextCell ( line0 );
//将点和线加入到数据集中,前者指定数据集的几何,后者指定其拓扑
polydata->SetPoints ( points1 );
polydata->SetLines ( lines1 );
points1->Delete();
lines1->Delete();
vtkPolyDataMapper *lineMapper = vtkPolyDataMapper::New();
lineMapper->SetInput(polydata); //测试划线
vtkProperty *property=vtkProperty::New();
property->SetColor(0,0,0);
property->SetOpacity(1); //透明度
vtkActor *lineActor1 = vtkActor::New();
lineActor1->SetMapper(lineMapper);
lineActor1->SetProperty(property);
ren->AddActor(lineActor1);
style->OnRightButtonUp();
style->OnMouseMove();
}
break;
}
}
