如何在vtkcontexview上通过vtkcommand回掉拾取点
时间: 2023-10-05 15:14:53 浏览: 77
您可以使用 vtkContextInteractorStyle 类来处理 vtkContextView 中的交互操作,并在事件回调函数中实现拾取点的功能。以下是一个简单的示例代码,演示了如何在 vtkContextView 中通过 vtkCommand 回调实现点的拾取:
```c++
// 创建一个 vtkChartXY 对象
vtkSmartPointer<vtkChartXY> chart = vtkSmartPointer<vtkChartXY>::New();
// 创建一些测试数据
vtkNew<vtkTable> table;
vtkNew<vtkFloatArray> arrX;
arrX->SetName("X Axis");
table->AddColumn(arrX);
vtkNew<vtkFloatArray> arrC;
arrC->SetName("Cosine");
table->AddColumn(arrC);
vtkNew<vtkFloatArray> arrS;
arrS->SetName("Sine");
table->AddColumn(arrS);
const int numPoints = 40;
float inc = 7.5 / (numPoints - 1);
table->SetNumberOfRows(numPoints);
for (int i = 0; i < numPoints; ++i)
{
table->SetValue(i, 0, i * inc);
table->SetValue(i, 1, cos(i * inc));
table->SetValue(i, 2, sin(i * inc));
}
// 将数据添加到图表中
vtkPlot *line = chart->AddPlot(vtkChart::LINE);
line->SetInputData(table, 0, 1);
line = chart->AddPlot(vtkChart::LINE);
line->SetInputData(table, 0, 2);
// 创建一个 vtkContextView 对象,并将图表添加到其中
vtkSmartPointer<vtkContextView> view = vtkSmartPointer<vtkContextView>::New();
view->GetScene()->AddItem(chart);
// 设置交互样式
vtkSmartPointer<vtkContextInteractorStyle> interactorStyle = vtkSmartPointer<vtkContextInteractorStyle>::New();
view->GetInteractor()->SetInteractorStyle(interactorStyle);
// 定义事件回调函数
class PickCallback : public vtkCommand
{
public:
static PickCallback *New()
{
return new PickCallback;
}
virtual void Execute(vtkObject *caller, unsigned long eventId, void *callData)
{
if (vtkCommand::MouseMoveEvent == eventId)
{
// 获取交互器
vtkContextInteractorStyle *style = vtkContextInteractorStyle::SafeDownCast(caller);
if (!style)
{
return;
}
// 获取拾取点
int x = style->GetInteractor()->GetEventPosition()[0];
int y = style->GetInteractor()->GetEventPosition()[1];
vtkPlot *plot = style->GetScene()->PickProp(x, y);
if (!plot)
{
return;
}
// 获取拾取点的坐标
vtkIdType index = plot->GetNearestPoint(x, y);
double *point = plot->GetData()->GetPoint(index);
std::cout << "Picked point: (" << point[0] << ", " << point[1] << ")" << std::endl;
}
}
};
// 创建回调对象并将其添加到交互器中
vtkSmartPointer<PickCallback> pickCallback = vtkSmartPointer<PickCallback>::New();
interactorStyle->AddObserver(vtkCommand::MouseMoveEvent, pickCallback);
// 启动交互器
view->GetInteractor()->Initialize();
view->GetInteractor()->Start();
```
在此示例中,我们创建了一个 vtkChartXY 对象并将一些测试数据添加到其中。然后,我们创建了一个 vtkContextView 对象,并将图表添加到其中。接下来,我们创建了一个 vtkContextInteractorStyle 对象,并将其设置为交互器的样式。然后,我们定义了一个 PickCallback 类来处理事件回调函数,其中我们使用 GetScene()->PickProp(x, y) 方法获取拾取的 plot 对象,然后使用 GetNearestPoint(x, y) 方法获取拾取点的索引,最后使用 GetData()->GetPoint(index) 方法获取拾取点的坐标。最后,我们创建了回调对象并将其添加到交互器中,然后启动交互器。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)