#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);
VTK_MODULE_INIT(vtkRenderingFreeType);
VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2);
#include "vtkActor.h"
#include "vtkAppendPolyData.h"
#include "vtkButtonWidget.h"
#include "vtkCommand.h"
#include "vtkConeSource.h"
#include "vtkEllipticalButtonSource.h"
#include "vtkGlyph3D.h"
#include "vtkLookupTable.h"
#include "vtkNew.h"
#include "vtkPNGReader.h"
#include "vtkPlatonicSolidSource.h"
#include "vtkPolyDataMapper.h"
#include "vtkProp3DButtonRepresentation.h"
#include "vtkProperty.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkRenderer.h"
#include "vtkSphereSource.h"
#include "vtkTIFFReader.h"
#include "vtkTestUtilities.h"
#include "vtkTesting.h"
#include "vtkTexturedButtonRepresentation.h"
#include "vtkTexturedButtonRepresentation2D.h"
#include <vtkBMPReader.h>
#include "vtkSmartPointer.h"
#include "vtkClipPolyData.h"
#include "vtkImplicitPlaneRepresentation.h"
#include "vtkImplicitPlaneWidget2.h"
#include "vtkInteractorEventRecorder.h"
#include "vtkLODActor.h"
#include "vtkPlane.h"
#include "vtkPolyData.h"
#include <vtkImplicitPlaneWidget.h>
#include "vtkSliderRepresentation2D.h"
#include "vtkSliderRepresentation3D.h"
#include "vtkSliderWidget.h"
#include "vtkWidgetEvent.h"
#include "vtkWidgetEventTranslator.h"
#include "vtkSphere.h"
#include <vtkImageData.h>
#include <vtkImageDataOutlineFilter.h>
#include <vtkImagePlaneWidget.h>
#include <vtkVolume16Reader.h>
#include <vtkImageMapToColors.h>
#include <vtkImageActor.h>
#include <vtkCellPicker.h>
#include "vtkMath.h"
#include "vtkMathUtilities.h"
#include <vtkImageMapper3D.h>
#include "vtkLogger.h"
#include <vtkCamera.h>
#include "vtkRegressionTestImage.h"
#include "vtkImageReslice.h"
#include "vtkInteractorStyleImage.h"
#include "vtkOutlineFilter.h"
#include "vtkPlaneSource.h"
#include "vtkResliceCursor.h"
#include "vtkResliceCursorActor.h"
#include "vtkResliceCursorLineRepresentation.h"
#include "vtkResliceCursorPolyDataAlgorithm.h"
#include "vtkResliceCursorThickLineRepresentation.h"
#include "vtkResliceCursorWidget.h"
#include "vtkSeedRepresentation.h"
#include "vtkSeedWidget.h"
#include "vtkPointHandleRepresentation2D.h"
#include <vtkProperty2D.h>
#include <vtkCompassRepresentation.h>
#include <vtkCompassWidget.h>
#include <vtkAnnotatedCubeActor.h>
#include "vtkDistanceRepresentation2D.h"
#include "vtkDistanceWidget.h"
#include "vtkAxisActor2D.h"
#include <vtkTextProperty.h>
#include <vtkMatrix4x4.h>
#include <vtkStreamingDemandDrivenPipeline.h>
#include <vtkInformation.h>
#include <iostream>
// The mouse motion callback, to turn "Slicing" on and off
class vtkImageInteractionCallback : public vtkCommand
{
public:
static vtkImageInteractionCallback* New() { return new vtkImageInteractionCallback; }
vtkImageInteractionCallback()
{
this->Slicing = 0;
this->ImageReslice = nullptr;
this->Interactor = nullptr;
}
void SetImageReslice(vtkImageReslice* reslice) { this->ImageReslice = reslice; }
vtkImageReslice* GetImageReslice() { return this->ImageReslice; }
void SetInteractor(vtkRenderWindowInteractor* interactor) { this->Interactor = interactor; }
vtkRenderWindowInteractor* GetInteractor() { return this->Interactor; }
void Execute(vtkObject*, unsigned long event, void*) override
{
vtkRenderWindowInteractor* interactor = this->GetInteractor();
int lastPos[2];
interactor->GetLastEventPosition(lastPos);
int currPos[2];
interactor->GetEventPosition(currPos);
if (event == vtkCommand::LeftButtonPressEvent)
{
this->Slicing = 1;
}
else if (event == vtkCommand::LeftButtonReleaseEvent)
{
this->Slicing = 0;
}
else if (event == vtkCommand::MouseMoveEvent)
{
if (this->Slicing)
{
vtkImageReslice* reslice = this->ImageReslice;
// Increment slice position by deltaY of mouse
int deltaY = lastPos[1] - currPos[1];
reslice->Update();
double sliceSpacing = reslice->GetOutput()->GetSpacing()[2];
vtkMatrix4x4* matrix = reslice->GetResliceAxes();
// move the center point that we are slicing through
double point[4];
double center[4];
point[0] = 0.0;
point[1] = 0.0;
point[2] = sliceSpacing * deltaY;
point[3] = 1.0;
matrix->MultiplyPoint(point, center);
matrix->SetElement(0, 3, center[0]);
matrix->SetElement(1, 3, center[1]);
matrix->SetElement(2, 3, center[2]);
interactor->Render();
}
else
{
vtkInteractorStyle* style =
vtkInteractorStyle::SafeDownCast(interactor->GetInteractorStyle());
if (style)
{
style->OnMouseMove();
}
}
}
}
private:
// Actions (slicing only, for now)
int Slicing;
// Pointer to vtkImageReslice
vtkImageReslice* ImageReslice;
// Pointer to the interactor
vtkRenderWindowInteractor* Interactor;
};
// The program entry point
int tutorial_reslice_1(int argc, char* argv[])
{
std::string rootDir = std::string(DATA_DIR);
std::string fullpath = rootDir + "headsq/quarter";
// Start by loading some data.
vtkSmartPointer<vtkImageReader2> reader = vtkSmartPointer<vtkImageReader2>::New();
reader->SetFilePrefix(fullpath.c_str());
reader->SetDataExtent(0, 63, 0, 63, 1, 93);
reader->SetDataSpacing(3.2, 3.2, 1.5);
reader->SetDataOrigin(0.0, 0.0, 0.0);
reader->SetDataScalarTypeToUnsignedShort();
reader->SetDataByteOrderToLittleEndian();
reader->UpdateWholeExtent();
// Calculate the center of the volume
reader->Update();
int extent[6];
double spacing[3];
double origin[3];
reader->GetOutputInformation(0)->Get(vtkStreamingDemandDrivenPipeline::WHOLE_EXTENT(), extent);
reader->GetOutput()->GetSpacing(spacing);
reader->GetOutput()->GetOrigin(origin);
double center[3];
center[0] = origin[0] + spacing[0] * 0.5 * (extent[0] + extent[1]);
center[1] = origin[1] + spacing[1] * 0.5 * (extent[2] + extent[3]);
center[2] = origin[2] + spacing[2] * 0.5 * (extent[4] + extent[5]);
// Matrices for axial, coronal, sagittal, oblique view orientations
// static double axialElements[16] = {
// 1, 0, 0, 0,
// 0, 1, 0, 0,
// 0, 0, 1, 0,
// 0, 0, 0, 1 };
// static double coronalElements[16] = {
// 1, 0, 0, 0,
// 0, 0, 1, 0,
// 0,-1, 0, 0,
// 0, 0, 0, 1 };
static double sagittalElements[16] = {
0, 0, -1, 0, //
1, 0, 0, 0, //
0, -1, 0, 0, //
0, 0, 0, 1 //
};
// static double obliqueElements[16] = {
// 1, 0, 0, 0,
// 0, 0.866025, -0.5, 0,
// 0, 0.5, 0.866025, 0,
// 0, 0, 0, 1 };
// Set the slice orientation
vtkSmartPointer<vtkMatrix4x4> resliceAxes = vtkSmartPointer<vtkMatrix4x4>::New();
resliceAxes->DeepCopy(sagittalElements);
// Set the point through which to slice
resliceAxes->SetElement(0, 3, center[0]);
resliceAxes->SetElement(1, 3, center[1]);
resliceAxes->SetElement(2, 3, center[2]);
// Extract a slice in the desired orientation
vtkSmartPointer<vtkImageReslice> reslice = vtkSmartPointer<vtkImageReslice>::New();
reslice->SetInputConnection(reader->GetOutputPort());
reslice->SetOutputDimensionality(2);
reslice->SetResliceAxes(resliceAxes);
reslice->SetInterpolationModeToLinear();
// Create a greyscale lookup table
vtkSmartPointer<vtkLookupTable> table = vtkSmartPointer<vtkLookupTable>::New();
table->SetRange(0, 2000); // image intensity range
table->SetValueRange(0.0, 1.0); // from black to white
table->SetSaturationRange(0.0, 0.0); // no color saturation
table->SetRampToLinear();
table->Build();
// Map the image through the lookup table
vtkSmartPointer<vtkImageMapToColors> color = vtkSmartPointer<vtkImageMapToColors>::New();
color->SetLookupTable(table);
color->SetInputConnection(reslice->GetOutputPort());
// Display the image
vtkSmartPointer<vtkImageActor> actor = vtkSmartPointer<vtkImageActor>::New();
actor->GetMapper()->SetInputConnection(color->GetOutputPort());
vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
renderer->AddActor(actor);
vtkSmartPointer<vtkRenderWindow> window = vtkSmartPointer<vtkRenderWindow>::New();
window->AddRenderer(renderer);
// Set up the interaction
vtkSmartPointer<vtkInteractorStyleImage> imageStyle =
vtkSmartPointer<vtkInteractorStyleImage>::New();
vtkSmartPointer<vtkRenderWindowInteractor> interactor =
vtkSmartPointer<vtkRenderWindowInteractor>::New();
interactor->SetInteractorStyle(imageStyle);
window->SetInteractor(interactor);
window->Render();
vtkSmartPointer<vtkImageInteractionCallback> callback =
vtkSmartPointer<vtkImageInteractionCallback>::New();
callback->SetImageReslice(reslice);
callback->SetInteractor(interactor);
imageStyle->AddObserver(vtkCommand::MouseMoveEvent, callback);
imageStyle->AddObserver(vtkCommand::LeftButtonPressEvent, callback);
imageStyle->AddObserver(vtkCommand::LeftButtonReleaseEvent, callback);
// Start interaction
// The Start() method doesn't return until the window is closed by the user
interactor->Start();
return EXIT_SUCCESS;
}
constexpr char TestSliderWidgetMultipleViewportsLog[] = "# StreamVersion 1\n"
"EnterEvent 292 46 0 0 0 0 0\n"
"MouseMoveEvent 273 65 0 0 0 0 0\n"
"MouseMoveEvent 252 88 0 0 0 0 0\n"
"MouseMoveEvent 148 299 0 0 0 0 0\n"
"LeaveEvent 147 301 0 0 0 0 0\n"
"EnterEvent 145 299 0 0 0 0 0\n"
"MouseMoveEvent 145 299 0 0 0 0 0\n"
"MouseMoveEvent 115 190 0 0 0 0 0\n"
"LeftButtonPressEvent 115 190 0 0 0 0 0\n"
"StartInteractionEvent 115 190 0 0 0 0 0\n"
"LeftButtonReleaseEvent 115 190 0 0 0 0 0\n"
"EndInteractionEvent 115 190 0 0 0 0 0\n"
"RenderEvent 115 190 0 0 0 0 0\n"
"KeyPressEvent 115 190 0 0 114 1 r\n"
"CharEvent 115 190 0 0 114 1 r\n"
"RenderEvent 115 190 0 0 114 1 r\n"
"KeyReleaseEvent 115 190 0 0 114 1 r\n"
"MouseMoveEvent 194 163 0 0 0 0 r\n"
"MouseMoveEvent 195 163 0 0 0 0 r\n"
"LeftButtonPressEvent 195 163 0 0 0 0 r\n"
"RenderEvent 195 163 0 0 0 0 r\n"
"MouseMoveEvent 195 163 0 0 0 0 r\n"
"MouseMoveEvent 201 151 0 0 0 0 r\n"
"RenderEvent 201 151 0 0 0 0 r\n"
"LeftButtonReleaseEvent 201 151 0 0 0 0 r\n"
"RenderEvent 201 151 0 0 0 0 r\n"
"LeftButtonPressEvent 204 29 0 0 0 0 r\n"
"RenderEvent 204 29 0 0 0 0 r\n"
"RenderEvent 210 30 0 0 0 0 r\n"
"LeftButtonReleaseEvent 210 30 0 0 0 0 r\n"
"LeftButtonPressEvent 158 159 0 0 0 0 r\n"
"RenderEvent 158 159 0 0 0 0 r\n"
"LeftButtonReleaseEvent 169 138 0 0 0 0 r\n"
"RenderEvent 169 138 0 0 0 0 r\n"
"RenderEvent 169 138 0 0 0 0 r\n"
"MouseMoveEvent 251 159 0 0 0 0 r\n"
"LeftButtonPressEvent 251 159 0 0 0 0 r\n"
"StartInteractionEvent 251 159 0 0 0 0 r\n"
"TimerEvent 251 159 0 0 0 0 r\n"
"RenderEvent 251 159 0 0 0 0 r\n"
"TimerEvent 251 159 0 0 0 0 r\n"
"RenderEvent 251 159 0 0 0 0 r\n"
"TimerEvent 251 159 0 0 0 0 r\n"
"RenderEvent 251 159 0 0 0 0 r\n"
"TimerEvent 251 159 0 0 0 0 r\n"
"RenderEvent 251 159 0 0 0 0 r\n"
"LeftButtonReleaseEvent 251 159 0 0 0 0 r\n"
"EndInteractionEvent 251 159 0 0 0 0 r\n"
"RenderEvent 251 159 0 0 0 0 r\n"
"LeftButtonPressEvent 250 159 0 0 0 0 r\n"
"StartInteractionEvent 250 159 0 0 0 0 r\n"
"TimerEvent 250 159 0 0 0 0 r\n"
"RenderEvent 250 159 0 0 0 0 r\n"
"TimerEvent 250 159 0 0 0 0 r\n"
"RenderEvent 250 159 0 0 0 0 r\n"
"TimerEvent 250 159 0 0 0 0 r\n"
"RenderEvent 250 159 0 0 0 0 r\n"
"TimerEvent 250 159 0 0 0 0 r\n"
"RenderEvent 250 159 0 0 0 0 r\n"
"TimerEvent 250 159 0 0 0 0 r\n"
"RenderEvent 250 159 0 0 0 0 r\n"
"TimerEvent 250 159 0 0 0 0 r\n"
"RenderEvent 250 159 0 0 0 0 r\n"
"LeftButtonReleaseEvent 250 159 0 0 0 0 r\n"
"EndInteractionEvent 250 159 0 0 0 0 r\n"
"RenderEvent 250 159 0 0 0 0 r\n"
"LeftButtonPressEvent 250 159 0 0 0 0 r\n"
"RenderEvent 250 159 0 0 0 0 r\n"
"LeftButtonReleaseEvent 250 159 0 0 0 0 r\n"
"RenderEvent 250 159 0 0 0 0 r\n"
"LeftButtonPressEvent 209 30 0 0 0 0 r\n"
"RenderEvent 209 30 0 0 0 0 r\n"
"MouseMoveEvent 209 30 0 0 0 0 r\n"
"RenderEvent 209 30 0 0 0 0 r\n"
"MouseMoveEvent 210 30 0 0 0 0 r\n"
"RenderEvent 210 30 0 0 0 0 r\n"
"MouseMoveEvent 210 30 0 0 0 0 r\n"
"RenderEvent 210 30 0 0 0 0 r\n"
"MouseMoveEvent 211 30 0 0 0 0 r\n"
"RenderEvent 211 30 0 0 0 0 r\n"
"MouseMoveEvent 212 30 0 0 0 0 r\n"
"RenderEvent 212 30 0 0 0 0 r\n"
"MouseMoveEvent 214 30 0 0 0 0 r\n"
"RenderEvent 214 30 0 0 0 0 r\n"
"MouseMoveEvent 214 30 0 0 0 0 r\n"
"RenderEvent 214 30 0 0 0 0 r\n"
"MouseMoveEvent 215 30 0 0 0 0 r\n"
"RenderEvent 215 30 0 0 0 0 r\n"
"MouseMoveEvent 233 30 0 0 0 0 r\n"
"RenderEvent 233 30 0 0 0 0 r\n"
"LeftButtonReleaseEvent 233 30 0 0 0 0 r\n"
"MouseMoveEvent 204 30 0 0 0 0 r\n"
"LeftButtonPressEvent 204 30 0 0 0 0 r\n"
"RenderEvent 204 30 0 0 0 0 r\n"
"LeftButtonReleaseEvent 204 30 0 0 0 0 r\n"
"RenderEvent 204 30 0 0 0 0 r\n"
"RenderEvent 204 30 0 0 0 0 r\n"
"MouseMoveEvent 239 83 0 0 0 0 r\n";
// This does the actual work: updates the probe.
// Callback for the interaction
class vtkSliderMultipleViewportsCallback : public vtkCommand
{
public:
static vtkSliderMultipleViewportsCallback* New()
{
return new vtkSliderMultipleViewportsCallback;
}
void Execute(vtkObject* caller, unsigned long, void*) override
{
vtkSliderWidget* sliderWidget = reinterpret_cast<vtkSliderWidget*>(caller);
this->Glyph->SetScaleFactor(
static_cast<vtkSliderRepresentation*>(sliderWidget->GetRepresentation())->GetValue());
}
vtkSliderMultipleViewportsCallback()
: Glyph(nullptr)
{
}
vtkGlyph3D* Glyph;
};
int tutorial_slider_1(int argc, char* argv[])
{
// Create a mace out of filters.
//
vtkSmartPointer<vtkSphereSource> sphereSource = vtkSmartPointer<vtkSphereSource>::New();
vtkSmartPointer<vtkConeSource> cone = vtkSmartPointer<vtkConeSource>::New();
vtkSmartPointer<vtkGlyph3D> glyph = vtkSmartPointer<vtkGlyph3D>::New();
glyph->SetInputConnection(sphereSource->GetOutputPort());
glyph->SetSourceConnection(cone->GetOutputPort());
glyph->SetVectorModeToUseNormal();
glyph->SetScaleModeToScaleByVector();
glyph->SetScaleFactor(0.25);
// The sphere and spikes are appended into a single polydata.
// This just makes things simpler to manage.
vtkSmartPointer<vtkAppendPolyData> apd = vtkSmartPointer<vtkAppendPolyData>::New();
apd->AddInputConnection(glyph->GetOutputPort());
apd->AddInputConnection(sphereSource->GetOutputPort());
vtkSmartPointer<vtkPolyDataMapper> maceMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
maceMapper->SetInputConnection(apd->GetOutputPort());
vtkSmartPointer<vtkLODActor> maceActor = vtkSmartPointer<vtkLODActor>::New();
maceActor->SetMapper(maceMapper);
maceActor->VisibilityOn();
maceActor->SetPosition(1, 1, 1);
// Create the RenderWindow, Renderer and both Actors
//
vtkSmartPointer<vtkRenderer> ren1 = vtkSmartPointer<vtkRenderer>::New();
ren1->SetViewport(0, 0, 0.5, 1.0);
vtkSmartPointer<vtkRenderWindow> renWin = vtkSmartPointer<vtkRenderWindow>::New();
renWin->AddRenderer(ren1);
vtkSmartPointer<vtkRenderer> ren2 = vtkSmartPointer<vtkRenderer>::New();
ren2->SetViewport(0.5, 0, 1.0, 1.0);
renWin->AddRenderer(ren2);
vtkSmartPointer<vtkRenderWindowInteractor> iren =
vtkSmartPointer<vtkRenderWindowInteractor>::New();
iren->SetRenderWindow(renWin);
// VTK widgets consist of two parts: the widget part that handles event
// processing; and the widget representation that defines how the widget
// appears in the scene (i.e., matters pertaining to geometry).
vtkSmartPointer<vtkSliderRepresentation2D> sliderRep =
vtkSmartPointer<vtkSliderRepresentation2D>::New();
sliderRep->SetValue(0.25);
sliderRep->SetTitleText("Spike Size");
sliderRep->GetPoint1Coordinate()->SetCoordinateSystemToNormalizedDisplay();
sliderRep->GetPoint1Coordinate()->SetValue(0.1, 0.1);
sliderRep->GetPoint2Coordinate()->SetCoordinateSystemToNormalizedDisplay();
sliderRep->GetPoint2Coordinate()->SetValue(0.4, 0.1);
sliderRep->SetSliderLength(0.02);
sliderRep->SetSliderWidth(0.03);
sliderRep->SetEndCapLength(0.01);
sliderRep->SetEndCapWidth(0.03);
sliderRep->SetTubeWidth(0.005);
vtkSmartPointer<vtkSliderWidget> sliderWidget = vtkSmartPointer<vtkSliderWidget>::New();
sliderWidget->SetInteractor(iren);
sliderWidget->SetRepresentation(sliderRep);
sliderWidget->SetCurrentRenderer(ren2);
sliderWidget->SetAnimationModeToAnimate();
vtkSmartPointer<vtkSliderMultipleViewportsCallback> callback =
vtkSmartPointer<vtkSliderMultipleViewportsCallback>::New();
callback->Glyph = glyph;
sliderWidget->AddObserver(vtkCommand::InteractionEvent, callback);
ren1->AddActor(maceActor);
sliderWidget->EnabledOn();
vtkSmartPointer<vtkSliderRepresentation3D> sliderRep3D =
vtkSmartPointer<vtkSliderRepresentation3D>::New();
sliderRep3D->SetValue(0.25);
sliderRep3D->SetTitleText("Spike Size");
sliderRep3D->GetPoint1Coordinate()->SetCoordinateSystemToWorld();
sliderRep3D->GetPoint1Coordinate()->SetValue(0, 0, 0);
sliderRep3D->GetPoint2Coordinate()->SetCoordinateSystemToWorld();
sliderRep3D->GetPoint2Coordinate()->SetValue(2, 0, 0);
sliderRep3D->SetSliderLength(0.075);
sliderRep3D->SetSliderWidth(0.05);
sliderRep3D->SetEndCapLength(0.05);
vtkSmartPointer<vtkSliderWidget> sliderWidget3D = vtkSmartPointer<vtkSliderWidget>::New();
sliderWidget3D->GetEventTranslator()->SetTranslation(
vtkCommand::RightButtonPressEvent, vtkWidgetEvent::Select);
sliderWidget3D->GetEventTranslator()->SetTranslation(
vtkCommand::RightButtonReleaseEvent, vtkWidgetEvent::EndSelect);
sliderWidget3D->SetInteractor(iren);
sliderWidget3D->SetRepresentation(sliderRep3D);
sliderWidget3D->SetCurrentRenderer(ren2);
sliderWidget3D->SetAnimationModeToAnimate();
sliderWidget3D->EnabledOn();
sliderWidget3D->AddObserver(vtkCommand::InteractionEvent, callback);
// Add the actors to the renderer, set the background and size
//
ren1->SetBackground(0.1, 0.2, 0.4);
ren2->SetBackground(0.9, 0.4, 0.2);
renWin->SetSize(300, 300);
// render the image
//
iren->Initialize();
renWin->Render();
return vtkTesting::InteractorEventLoop(argc, argv, iren, TestSliderWidgetMultipleViewportsLog);
}
相关推荐
C++ VTK加载DCM医学影像:从环境配置到三维可视化完整指南
医学影像处理是计算机视觉与图形学的重要应用领域,其核心在于对DICOM格式数据的解析与可视化。DICOM作为医学影像的通用标准,包含了丰富的患者信息与多层切片数据,其三维重建与交互浏览是医学诊断与科研的基础需求。VTK(Visualization Toolkit)作为开源的科学可视化库,提供了强大的数据处理与渲染能力,能够高效实现DICOM文件的读取、三维体数据重建及交互式浏览。通过C++集成VTK,开发者可以构建独立的医学影像处理软件,实现从底层数据解析到高级可视化功能的全流程开发。本文以vtkDICOM
VTK笔记——Widgets简介
VTK的交互器样式(vtkInteractorStyle)通常只是控制相机以及提供一些简单的键盘和鼠标事件的交互技术。交互器样式在渲染场景中并没有一种表达形式,也就是说,在交互时我们看不见交互器样式到底是什么样子的,用户在使用这些交互器样式时,必须事先知道哪些键盘和鼠标事件是控制哪些操作的。然而,渲染场景中的大部分操作都需要直接、简单。比如,如果某条线段的端点可以由用户放置的话,那么沿着某条线段改变倾斜度,就变得非常容易。
VTK 交互类介绍
cpppublic:// 获取点击位置// 执行拾取操作// 处理拾取结果// 调用父类方法保持原有功能// 使用自定义交互样式。
使用Vtk - Qt Creator - VS 编译简单项目
本文介绍了在Visual Studio 2022中配置VTK和Qt开发环境的方法。 1、创建Qt Widgets项目时需要选择QtOpenGL和QtOpenGLWidgets模块; 2、配置VTK包含目录和库文件的详细步骤; 3、提供最小可运行代码示例,包含头文件和cpp文件实现,展示如何通过QVTKOpenGLNativeWidget嵌入VTK渲染窗口; 4、最后给出两种渲染方式:加载STL文件或简单几何图形。 文章详细记录了
Python实现VTK - 自学笔记(4):用Widgets实现三维交互控制
本文介绍了使用VTK(Visualization Toolkit)进行三维可视化的核心交互技术。首先,通过创建圆锥体数据源、映射器和演员,构建了基本的可视化场景。接着,利用vtkRenderWindowInteractor作为交互基础,支持多种交互风格。文章重点展示了如何通过滑块控件(vtkSliderWidget)动态调整圆锥体的分辨率,以及使用包围盒控件(vtkBoxWidget)实现物体的变形操作。这些控件通过回调机制(AddObserver)与事件处理函数绑定,实现动态数据更新。
STM32多模式智能小车状态机设计与中断优先级实践
在嵌入式实时系统中,状态机是实现多任务协同与功能切换的核心范式。其本质是通过有限状态集合、明确转移条件和确定性动作,构建可预测、易维护的控制逻辑。基于STM32等资源受限MCU时,需兼顾状态调度效率、中断并发安全与硬件资源约束。关键技术价值体现在:提升系统模块解耦度、支持物理按键与蓝牙双源触发、保障实时响应不丢帧。典型应用场景包括智能小车多模运行(循迹、避障、遥控、定距跟随等)、工业设备工作模式切换及IoT终端低功耗状态管理。本文以STM32F103C8T6平台为例,深入解析全局模式变量设计、双通道状态切换
VTK-Widgets在医学图像交互测量中的研究
通过多平面显示工具可以从三维CT图像数据场中获取二维的组织切片,使用vtkLineWidget对二维切片中的组织进行距离测量,该类本身不具备测量功能,但我们可以借助其内部工具来完成测量。 生 物 医 学 工 程 研 究 第29卷第1期 戴振晖,等:VTK -Widgets在医学图像交互测量中的研究 vtkLineWidget定义了一个交互放置在三维场景内的线段,当对二维切片进行距离测量时,把线段交互式的放置在需要测量的组织切片上,设线段 的两个端点分别为p1和p2,p1的坐标为(x1,y1
OpenWRT软件源更换保姆级教程:从国内镜像到官方源一键切换(含常见报错解决)
本文提供OpenWRT软件源更换的详细教程,涵盖从国内镜像源到官方源的切换方法,并深度解析常见报错解决方案。针对国内网络环境,指导用户如何精准定位系统信息、备份配置、选择并配置清华等国内镜像源,以及处理签名验证失败、依赖缺失、404错误等典型问题,旨在提升软件包管理效率与稳定性。
编译使用VTK官网的VTKExamples
除了VTK源码包里包含了一些简单的examples,VTK的官网还有一些examples,源码在github上直接搜索VTKExamples即可得到,压缩包275m,没充钱科学上网的估计不好clone下来,我这里放个度盘的链接: 链接:https://pan.baidu.com/s/1XnLMeZXKpDKWjbilpcDo0A 提取码:h4uw 把clone下来的压缩包解压,到src里找cxx的,也就是c++版本的代码,如下图所示,我们用Widgets这个工程试试,在同级目录下新建一个Wi..
从零开始掌握Python机器学习:七步教程 基础篇
前言 「开始」往往是最难的,尤其是当选择太多的时候,一个人往往很难下定决定做出选择。本教程的目的是帮助几乎没有 Python 机器学习背景的新手成长为知识渊博的实践者,而且这个过程中仅需要使用免费的材料和资源即可。 第一步:基本 Python 技能 如果我们打算利用 Python 来执行机器学习,那么对 Python 有一些基本的了解就是至关重要的。 首先,你需要安装 Python。因为我们后...
别只当玩具!聊聊这个555金属探测器电路背后的电磁感应与RLC调谐原理
本文深入解析了555金属探测器电路的工作原理,重点探讨了电磁感应与RLC调谐原理。通过分析电感线圈的电磁特性、RLC谐振电路的行为以及555定时器的多重功能,揭示了这一看似简单的装置如何实现金属检测。文章还提供了灵敏度优化方案和常见问题解决方法,帮助读者从科学角度理解这一实用技术。
VTK.js Widgets完全手册:打造专业级3D交互体验的核心组件
VTK.js是基于Web的可视化工具包(Visualization Toolkit for the Web),其Widget组件系统为开发者提供了构建交互式3D应用的强大工具。本文将全面介绍VTK.js Widgets的核心架构、常用组件及实战应用,帮助你快速掌握这一技术,轻松实现专业级3D交互体验。 ## 一、VTK.js Widgets架构解析:MVC模式的创新应用 VTK.js的新风格W
手把手入门YOLO到改进优化教程 | 【P2基础篇】数据标注+环境搭建+模型训练
本节以 YOLO自定义目标检测训练为主线,带你从零开始完成 数据标注 → 环境搭建 → 模型训练 → 结果的流程。使用labelImg制作符合YOLO格式的自定义数据集。在Windows基于 Python + Conda 创建独立虚拟环境,安装 PyTorch + CUDA + ultralytics,配置 PyCharm 运行环境。本节不仅使用自定义数据集进行演示,同时也用公开数据集训练 YOLO,查看训练日志与可视化结果(PR、P/R/F1 曲线等)等。
第04章-VTK基础(6)
【译者:这个系列教程是以Kitware公司出版的《VTK User’s Guide -11th edition》一书作的中文翻译(出版时间2010年,ISBN: 978-1-930934-23-8),由于时间关系,我们不能保证每周都能更新本书内容,但尽量做到一周更新一篇到两篇内容。敬请期待^_^。欢迎转载,另请转载时注明本文出处,谢谢合作!同时,由于译者水平有限,出错之处在所难免,欢迎指出订正!】
Vue - 在纯 HTML 普通项目中实现组件化,让原生 html 项目支持引入 *.vue 组件 / 组件与组件间的互相引用等,完美解决了引入组件出现的跨域问题(保姆级详细教程,完整示例源码及插件)
html中使用vue组件,在HTML页面中引入vue组件,HTML界面利用http-vue-loader.js以组件方式引入vue文件,使用http-vue-loader引入组件出现报错,在html页面使用http-vue-loader插件引入组件报跨域错误,如何解决http-vue-loader引用组件时出现跨域问题,纯html原生web项目引入vue后如何实现组件引入,使用http-vue-loader插件控制台报错跨域,http-vue-loader跨域怎么办官方文档,html页面如何引入.vu
mojoPortal 路径穿越漏洞复现(CVE-2025-28367)(附脚本)
在 mojoPortal CMS 版本 <=2.9.0.1 中发现了一个导致 ViewState 反序列化的目录遍历漏洞。通过利用此问题,未经身份验证的攻击者可以泄露 Web 根目录中的敏感文件,包括应用程序的文件。此配置文件包含用于验证和解密 ViewState 数据的文件。知道此密钥后,网络攻击者可以构建恶意 ViewState 有效负载,从而导致在底层服务器上执行远程代码。(CVE-2025-28367)
从VTK官网示例到可运行的Qt项目:一个完整的工作流指南(以CylinderSource为例)
本文详细介绍了如何将VTK官网示例转换为可运行的Qt项目,以CylinderSource为例,涵盖开发环境搭建、项目配置、代码转换、模块初始化、UI设计及调试优化等关键步骤,帮助开发者快速掌握VTK与Qt的集成技术。
手把手教你学Simulink实例--使用 Simulink 进行电力电子系统的小信号模型仿真
电力电子系统(Power Electronics System)包括各种功率转换器(如 DC-DC 转换器、逆变器等)。这些设备中的关键组件(如 MOSFET、IGBT、电容器、电感器等)不仅影响系统的性能,还直接关系到系统的稳定性、效率和可靠性。因此,在设计阶段进行详细的建模和仿真至关重要。小信号模型仿真的目的是通过线性化非线性系统来评估其动态特性,包括增益、相位裕度、带宽等指标。通过本教程,我们介绍了如何使用 Simulink 进行电力电子系统的小信号模型仿真。背景介绍。
QT中使用QVTKOpenGLNativeWidget显示三维图形(VTK9.x以上版本)
首先通过cmake配置所示包含文件以及链接库链接库主要文件如下E:\NativeThirdParty\VTK_9_3\lib\vtkGUISupportQt-9.3.lib E:\NativeThirdParty\VTK_9_3\lib\vtkInteractionWidgets-9.3.lib E:\NativeThirdParty\VTK_9_3\lib\vtkRenderingOpenGL2-9.3.lib E:\NativeThirdParty\VTK_9_3\lib\vtkRenderingHyp
ssm框架搭建
这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载
IMSL CNL 7.0.0 (x86-64)Crack
IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件
VTK.js与传统VTK对比:Web端可视化的革命性突破与优势
VTK.js是Visualization Toolkit(VTK)的Web原生实现,专为浏览器环境设计的高性能可视化库。相比传统C++版VTK,它通过WebGL和WebGPU技术将科学可视化能力直接带到网页端,无需安装任何插件即可实现复杂3D模型渲染、医学影像处理等高级功能。 ## 核心架构差异:从桌面到浏览器的技术跃迁 传统VTK基于C++开发,依赖本地图形接口(如OpenGL)和操作系统资
精雕软件(JDpaint) 5.5 绿色版
精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版
CTK框架——CTK Widgets快速入门
CTK框架——CTK Widgets快速入门 天山老妖S关注0人评论27888人阅读2018-05-25 18:40:52 CTK框架——CTK Widgets快速入门 一、CTK Widgets模块简介 1、CTK Widgets模块简介 CTK Widgets模块是CTK封装的用于通用功能以及生物医学成像专用领域的Qt组件库。 CTK中所有部分都有大量的测试相关代码,在源码目录下Libs/xxx/Testin/Cpp目录中。 CTK官方文档:http://www.commont.
VB摄像头监控
该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制
VTK 框架架构
VTK 9.5.0框架采用模块化分层架构,主要分为六层:基础层(第三方库)、核心层(数据结构)、算法层(数据处理)、渲染层(可视化)、交互层(用户交互)和应用层(示例/GUI)。模块系统通过265个vtk.module文件管理依赖关系,支持五种依赖强度声明,并实现工厂模式的自动初始化。构建系统支持模块独立编译或合并为共享库(kit),默认采用细粒度模块化方案。该设计通过声明式配置实现了灵活的组件化管理和按需链接,同时保持核心功能的可扩展性。
VTK Python 开发环境配置完整指南 详细介绍pip安装与源码编译部署VTK,解决常见依赖问题
VTK(Visualization Toolkit)是一个开源的跨平台可视化工具包,广泛应用于科学计算和工程领域。本文详细介绍了VTK的安装配置方法,包括通过pip安装预编译版本和源码编译安装两种方式。对于pip安装,提供了Windows、Linux和macOS三大平台的具体操作指南;对于源码编译,详细说明了从获取源码到编译配置的全过程。文章还包含了环境验证方法、常见问题解决方案以及基础3D可视化、数据可视化和图像处理等实用示例代码。本指南基于VTK 9.x版本编写,适用于希望快速上手VTK开发的Pytho
常用的VTK工具/控件(VTK Widget)
Family of VTK Widgets 3D Slider widget 2D Slider widget Box widget Line widget Implicit plane widget
525



被折叠的 条评论
为什么被折叠?



