安徽城乡建设厅网站证件,电子商务网站建设核心,诸暨市住房建设局网站,cpa网站怎么做文章目录 3D空间坐标转换例程心得 3D空间坐标转换
在冠状图、矢状面、横截面等创建的角度组件的三个端点坐标#xff0c;不能直接用在3D视图中。这是因为2D切片的坐标是基于像素的#xff0c;而3D空间的坐标可能是基于实际物理尺寸的。 解决方案是使用2D点的坐标、切片的物理… 文章目录 3D空间坐标转换例程心得 3D空间坐标转换
在冠状图、矢状面、横截面等创建的角度组件的三个端点坐标不能直接用在3D视图中。这是因为2D切片的坐标是基于像素的而3D空间的坐标可能是基于实际物理尺寸的。 解决方案是使用2D点的坐标、切片的物理位置和方向以及可能的其他参数例如切片厚度或间距来计算空间坐标。将计算好的空间坐标p1、p2、p3传入下面的函数中就可以在3D视图中画出角度组件。
例程
get3DViewAngle(double* p1, double* p2, double* mid, int* indexVal) {double modifiedPoints[3][3]; int currentAngleIndex *indexVal;auto iter threeDActors.find(currentAngleIndex);if (iter ! threeDActors.end()) {for (auto act : iter-second) {threeDRenderer-RemoveActor(act);}threeDActors.erase(iter);}double* pts[] {p1, p2, mid};for(int i 0; i 3; i) {modifiedPoints[i][0] pts[i][0] * xRange[1] / imageDims[0];modifiedPoints[i][1] pts[i][1] * yRange[1] / imageDims[1];modifiedPoints[i][2] pts[i][2] * zRange[1] / imageDims[2];}vtkSmartPointervtkSphereSource src1 vtkSmartPointervtkSphereSource::New();src1-SetCenter(modifiedPoints[0]);src1-SetRadius(2);vtkSmartPointervtkPolyDataMapper map1 vtkSmartPointervtkPolyDataMapper::New();map1-SetInputConnection(src1-GetOutputPort());vtkSmartPointervtkActor act1 vtkSmartPointervtkActor::New();act1-SetMapper(map1);vtkSmartPointervtkSphereSource src2 vtkSmartPointervtkSphereSource::New();src2-SetCenter(modifiedPoints[1]);src2-SetRadius(2);vtkSmartPointervtkPolyDataMapper map2 vtkSmartPointervtkPolyDataMapper::New();map2-SetInputConnection(src2-GetOutputPort());vtkSmartPointervtkActor act2 vtkSmartPointervtkActor::New();act2-SetMapper(map2);vtkSmartPointervtkSphereSource src3 vtkSmartPointervtkSphereSource::New();src3-SetCenter(modifiedPoints[2]);src3-SetRadius(2);vtkSmartPointervtkPolyDataMapper map3 vtkSmartPointervtkPolyDataMapper::New();map3-SetInputConnection(src3-GetOutputPort());vtkSmartPointervtkActor act3 vtkSmartPointervtkActor::New();act3-SetMapper(map3);vtkSmartPointervtkLineSource lnSrc1 vtkSmartPointervtkLineSource::New();lnSrc1-SetPoint1(modifiedPoints[0]);lnSrc1-SetPoint2(modifiedPoints[2]);vtkSmartPointervtkPolyDataMapper lnMap1 vtkSmartPointervtkPolyDataMapper::New();lnMap1-SetInputConnection(lnSrc1-GetOutputPort());vtkSmartPointervtkActor lnAct1 vtkSmartPointervtkActor::New();lnAct1-SetMapper(lnMap1);vtkSmartPointervtkLineSource lnSrc2 vtkSmartPointervtkLineSource::New();lnSrc2-SetPoint1(modifiedPoints[1]);lnSrc2-SetPoint2(modifiedPoints[2]);vtkSmartPointervtkPolyDataMapper lnMap2 vtkSmartPointervtkPolyDataMapper::New();lnMap2-SetInputConnection(lnSrc2-GetOutputPort());vtkSmartPointervtkActor lnAct2 vtkSmartPointervtkActor::New();lnAct2-SetMapper(lnMap2);threeDRenderer-AddActor(act1);threeDRenderer-AddActor(act2);threeDRenderer-AddActor(act3);threeDRenderer-AddActor(lnAct1);threeDRenderer-AddActor(lnAct2);std::vectorvtkSmartPointervtkActor acts {act1, act2, act3, lnAct1, lnAct2};threeDActors[currentAngleIndex] acts;for (auto act : acts) {threeDRenderer-AddActor(act);}renderWidget[3]-interactor()-Render();
}}心得
在创建角度组件后不能直接读取组件的端点坐标来用于计算空间坐标因为此时的端点坐标还是空。需要等到鼠标左键点击三次后才会得到完整的端点坐标。这个时候可以写在角度组件的回调函数中然后使用成员变量来获取创建好的端点坐标。在角度组件的回调函数中可以使用信号槽机制来保证拖动组件后能够实时更新角度组件位置。如果是创建线条组件需要手动触发一次回调函数因为线条组件的端点位置是可以直接读取的。 lineCallback-Execute(lineWidget, vtkCommand::EndInteractionEvent, nullptr); //手动触发回调4.如果想要保证实时删除2D和3D视图中的角度组件可以使用map只需要记住创建的索引就能直接删除组件。这样可以与页面上的组件数量和组件索引独立开来.
std::mapint,vtkSmartPointervtkAngleWidget ngleWidgets;