医站点医维基

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1288|回复: 7

[VTK] VTK例子14-point picker(拾取多个点)

[复制链接]

336

主题

410

回帖

2806

积分

管理员

积分
2806

热心会员推广达人优秀版主荣誉管理论坛元老

发表于 2015-12-5 17:49:50 | 显示全部楼层 |阅读模式
point picker(拾取多个点)
#include "stdafx.h"
#include "vtkPolyDataMapper.h"
#include "vtkRenderer.h"
#include "vtkRenderWindow.h"
#include "vtkWin32RenderWindowInteractor.h"
#include "vtkActor.h"
#include "vtkPointPicker.h"
#include "vtkSphereSource.h"
#include "vtkGlyph3D.h"
#include "vtkSelectPolyData.h"
#include "vtkClipPolyData.h"
#include  <stdio.h>
#include  <ctype.h>
//#include  <iostream.h>
#include  <vtkConeSource.h>
#include  <vtkPolyDataNormals.h>
#include  <vtkProperty.h>
#include  <vtkSphereSource.h>
#include  <vtkGlyph3D.h>
#include  <vtkRenderWindowInteractor.h>
#include  <vtkCallbackCommand.h>
static void pickControl(void *);
static vtkRenderer *ren1;
static vtkRenderWindow *renWin;
static vtkPoints *points;
static int n, p;
vtkPolyData *PolyData = vtkPolyData::New();
vtkRenderWindowInteractor  *iren;
void pickControl(vtkObject *caller, unsigned long eid, void *clientdata, void *calldata);
void main( int argc, char *argv[] )
{
    ren1 = vtkRenderer::New();
    renWin = vtkRenderWindow::New();
    renWin->AddRenderer(ren1);
    iren = vtkRenderWindowInteractor::New();
    n=0;
    p=0;
  vtkPointPicker *pointpicker = vtkPointPicker::New();
  vtkSphereSource *sphere = vtkSphereSource::New();
    sphere->SetThetaResolution(50);
    sphere->SetPhiResolution(50);
  vtkPolyDataMapper *sphereMapper = vtkPolyDataMapper::New();
    sphereMapper->SetInput(sphere->GetOutput());
  vtkActor *sphereActor = vtkActor::New();
    sphereActor->SetMapper(sphereMapper);
  sphereActor->GetProperty()->SetColor(0.8,0.1,0.8);
/*
  vtkConeSource *cone = vtkConeSource::New();
    cone->SetResolution(20);
  vtkGlyph3D *glyph = vtkGlyph3D::New();
    glyph->SetInput((vtkDataSet *)sphere->GetOutput());
    glyph->SetSource(cone->GetOutput());
    glyph->SetVectorModeToUseNormal();
    glyph->SetScaleModeToScaleByVector();
    glyph->SetScaleFactor(0.25);
  vtkPolyDataMapper *spikeMapper = vtkPolyDataMapper::New();
    spikeMapper->SetInput(glyph->GetOutput());
  vtkActor *spikeActor = vtkActor::New();
    spikeActor->SetMapper(spikeMapper);
*/
/////////////////////////////
    iren->SetRenderWindow(renWin);
    iren->SetPicker(pointpicker);
//  iren->SetUserMethod(vtkCommand::pickControl, (void *)iren);
  vtkCallbackCommand * cmd = vtkCallbackCommand::New();
    cmd->SetCallback(pickControl);
    pointpicker->AddObserver(vtkCommand::EndPickEvent, cmd);
    ren1->AddActor(sphereActor);
//  ren1->AddActor(spikeActor);
    ren1->SetBackground(0, 0, 0);
    renWin->SetSize(500,500);
    iren->Initialize();
    renWin->Render();
    iren->Start();
    ren1->Delete();
    renWin->Delete();
    iren->Delete();
    pointpicker->Delete();
}
// Define picking method
void pickControl(vtkObject *caller, unsigned long eid, void *clientdata, void *calldata)
{
    double *selPt;
    double *pickpos;
    double *pc;
    int i;
//  vtkRenderWindowInteractor *iren = (vtkRenderWindowInteractor *)arg;
    vtkPointPicker *pointpicker = (vtkPointPicker *)iren->GetPicker();
    selPt = pointpicker->GetSelectionPoint();
    cout<<"Screen location:"<<selPt[0]<<" "<<selPt[1]<<"\n";
    if ( pointpicker->GetPointId() >= 0 )
    {
         p = p+1; //count number of points picked
         pickpos = pointpicker->GetPickPosition();
         cout<<"Point location:"<<pickpos[0]<<" "<<pickpos[1]<<" "<<pickpos[2]<<"\n";
         //Define method for placing spheres
         points=vtkPoints::New();
         points->InsertNextPoint(pickpos);
         points->Modified();
         vtkPolyData *profile=vtkPolyData::New();
         profile->SetPoints(points);
         vtkSphereSource *sphere=vtkSphereSource::New();
         sphere->SetRadius(0.02);
         vtkGlyph3D *glyph=vtkGlyph3D::New();
         glyph->SetInput(profile);
         glyph->SetSource(sphere->GetOutput());
         vtkPolyDataMapper *glyphMapper=vtkPolyDataMapper::New();
         glyphMapper->SetInput(glyph->GetOutput());
         vtkActor *glyphActor=vtkActor::New();
         glyphActor->SetMapper(glyphMapper);
         glyphActor->GetProperty()->SetColor(1, 0, 0); //Set colour to red
         ren1-> AddActor(glyphActor);
         renWin->Render();
//       points-> Delete();
         profile->  Delete();
         sphere->  Delete();
         glyph->  Delete();
         glyphMapper->  Delete();
         glyphActor->  Delete();
    }
    else if( pointpicker->GetPointId() < 0 )
    {
         cout<<"No point picked here!"<<"\n";
         n=n+1;
         cout<<"n" <<n<<"\n";
         if (n >=3)
         {
             cout<<"Selection completed!"<<"\n";
             // check the picked points, stored in vtkPoints
             for (i=0; i<p; i++)
             {
                  pc = points->GetPoint(i);
                  cout<<"point:"<<pc[0]<<" "<<pc[1]<<" "<<pc[2]<<"\n";//See components points
             }
             vtkSelectPolyData *loop = vtkSelectPolyData::New();
//           loop->SetInput(reader->GetOutput());
             loop->SetInput(PolyData);
             loop->SetLoop(points);
             loop->GenerateSelectionScalarsOn();
             loop->SetSelectionModeToSmallestRegion(); //negative scalars inside
             vtkClipPolyData *clip = vtkClipPolyData::New(); //clips out positive region
             clip->SetInput(loop->GetOutput());
             vtkPolyDataMapper *clipMapper = vtkPolyDataMapper::New();
             clipMapper->SetInput(clip->GetOutput());
             vtkActor *clipActor = vtkActor::New();
             clipActor->SetMapper(clipMapper);
             clipActor->AddPosition(1, 0, 0);
             clipActor->GetProperty()->SetColor(0, 0, 1); //Set colour blue
             ren1->AddActor(clipActor);
             renWin->Render();
             points-> Delete();
             loop->Delete();
             clip->Delete();
             clipMapper->Delete();
             clipActor->Delete();
       }
    }
}  
14-1.png
14-2.png
回复

使用道具 举报

119

主题

457

回帖

1524

积分

版主

积分
1524

热心会员推广达人优秀版主荣誉管理论坛元老

发表于 2016-5-10 22:27:59 | 显示全部楼层
看看!!!!!谢谢楼主!!!
回复

使用道具 举报

110

主题

429

回帖

1428

积分

金牌会员

积分
1428

热心会员推广达人优秀版主荣誉管理论坛元老

发表于 2016-5-12 20:37:50 | 显示全部楼层
大哥谢了
回复

使用道具 举报

336

主题

410

回帖

2806

积分

管理员

积分
2806

热心会员推广达人优秀版主荣誉管理论坛元老

 楼主| 发表于 2016-5-14 06:50:41 | 显示全部楼层
先学习一下,以留备用
回复

使用道具 举报

1

主题

441

回帖

1100

积分

版主

积分
1100

热心会员推广达人优秀版主荣誉管理论坛元老

发表于 2016-5-14 20:39:04 | 显示全部楼层
好贴,不要沉了
回复

使用道具 举报

0

主题

399

回帖

804

积分

高级会员

积分
804

最佳新人

发表于 2016-5-16 12:09:52 | 显示全部楼层
先看看在说
回复

使用道具 举报

0

主题

412

回帖

1035

积分

版主

积分
1035

热心会员推广达人优秀版主荣誉管理论坛元老

发表于 2016-5-18 11:41:13 | 显示全部楼层
学习学习!
回复

使用道具 举报

37

主题

407

回帖

1137

积分

版主

积分
1137

热心会员推广达人优秀版主荣誉管理论坛元老

发表于 2016-5-23 03:42:20 | 显示全部楼层
次贴无用,检定完毕!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|关于我们|医维基|网站地图|Archiver|手机版|医疗之家 ( 沪ICP备2023001278号-1 )  

GMT+8, 2024-5-2 21:18 , Processed in 0.154373 second(s), 31 queries .

Designed by Medical BBS

快速回复 返回顶部 返回列表