第 4 阶段练习与参考答案
按教程目录完成第 12–15 章后运行阶段示例。先独立作答,再查看每题答案。
练习 1:选择输入连接方式
情景 A:你已经手工创建一个 vtkPolyData。情景 B:一个 vtkSphereSource 的半径会随界面滑块变化。两种情况下应怎样给 vtkMapper 输入?修改 Source 半径之后需要注意什么?
参考答案
情景 A 使用 mapper.setInputData(polyData);情景 B 使用 mapper.setInputConnection(sphereSource.getOutputPort()),保留上游算法连接。半径改变后调用 renderWindow.render(),让管线更新并重绘。只把某次取出的输出数据交给 setInputData,不代表持续连接到 Source。
练习 2:为什么 Actor 的金色没有出现
示例已执行 actor.getProperty().setColor(0.92, 0.72, 0.28),初始仍显示蓝红渐变。找出负责当前颜色的对象,并写出切换到 Actor 单色的两行关键代码。此操作是否删除 Temperature 数组?
参考答案
Mapper 启用了标量着色,并选中了 Point Data 的 Temperature。切换到单色:
surfaceMapper.setScalarVisibility(false);
surfaceWindow.render();
数组仍保存在 surface.getPointData() 中,没有被删除。Actor Property 提供单色,Mapper 决定何时按数据着色。
练习 3:同色能否代表同值
甲数据温度范围 [10, 40],乙数据范围 [20, 80]。两幅图分别调用 setScalarRange(dataArray.getRange())。两幅图最红的区域是否同为一个温度?若要比较绝对温度,怎样设置?
参考答案
不一定。两幅图的红端分别可能代表 40 和 80。应使用相同颜色表和共同固定的数值范围,例如两幅都设 mapper.setScalarRange(0, 100),再给出一致的图例与单位。自动使用各自范围适合看内部变化,不适合直接按颜色比较绝对值。
练习 4:在多个点数组中切换
示例中的 Temperature 与 Distance 都属于 Point Data。写出让 Mapper 通过名称使用 Distance,并把它的全部范围映射到颜色表的代码。若名称拼错,应该先检查什么?
参考答案
surfaceMapper.setScalarModeToUsePointFieldData();
surfaceMapper.setColorByArrayName("Distance");
surfaceMapper.setScalarRange(distance.getRange());
surfaceMapper.setScalarVisibility(true);
surfaceWindow.render();
先检查 surface.getPointData().getArrayByName("Distance") 是否返回数组,并确认该数组的元组数等于点数。示例用 Point Field Data 模式明确按名称取点数组;名称错误时不会通过该模式自动选中活动标量。
练习 5:层号、世界坐标和数组元素
阶段示例的图像尺寸为 [32, 24, 12],origin 为 [0, 0, 0],spacing 为 [0.8, 1.2, 2],方向为默认单位矩阵。求采样点 (i,j,k)=(3,4,5) 的扁平索引与世界坐标。滑块设为 K=5 时,它会位于当前切片上吗?
参考答案
扁平索引为 3 + 32 × (4 + 24 × 5) = 3971。世界坐标为 [3×0.8, 4×1.2, 5×2] = [2.4, 4.8, 10]。K=5 切片固定第三维为 5,因此包含该采样点。若 image 的 direction 或 extent 改变,应重新用数据对象的方法核对,不能继续套用本题简式。
练习 6:窗宽窗位与原始数据
把窗宽设为 40、窗位设为 80。直观关注的数值窗口约是什么?与初始窗宽 100、窗位 80 相比,为什么局部对比可能更强?调窗宽后 image.getPointData().getScalars().getData() 会发生什么变化?
参考答案
窗口约为 [80−20,80+20]=[60,100]。同样的屏幕灰度范围分配给更窄的数值区间,区间内差别更明显,区间外则更容易被压到黑端或白端。原始 TypedArray 不变;改变的是 vtkImageProperty 的显示映射。
练习 7:切片能否当作体渲染
有人移动 K 层滑块,看到亮斑位置随层变化,于是说“我已经做了体渲染”。解释这句话哪里不准确,并说出以后体渲染至少还要决定什么。
参考答案
当前每帧只显示一张二维截面。体渲染要沿每个屏幕像素对应的三维视线采样多个深度位置,再结合颜色与不透明度累积。至少要确定数值到颜色、不透明度的映射,以及视线采样和合成方式。第 16–20 章会分别处理这些概念和对象。