VTK三维测量

    系统版本:Win8.1

    Qt版本:5.2.1

    Qt Creator版本:3.0.1

    VTK版本:6.2.0

1 空间距离测量

1.1 实例

    在VTK中,专门用于测量距离的类为vtkDistanceWidget,具体的使用方法在VTK源码提供的实QtVTKRenderWindows中说明,此外,参考资料[2][3]中也对vtkDistanceWidget的使用进行了实例说明。然而,上述的实例都是针对2D的,关于3D的测量,见实例TestDistanceWidget3D.cxx,为了便于测试,对其进行一些小修改后,如下所示:

#include <QCoreApplication>
#include <QDebug>
#define vtkRenderingCore_AUTOINIT 4(vtkInteractionStyle,vtkRenderingFreeType,vtkRenderingFreeTypeOpenGL,vtkRenderingOpenGL)
#define vtkRenderingVolume_AUTOINIT 1(vtkRenderingVolumeOpenGL)
#include "vtkDistanceWidget.h"
#include "vtkDistanceRepresentation3D.h"
#include "vtkSphereSource.h"
#include "vtkPolyDataMapper.h"
#include "vtkActor.h"
#include "vtkRenderer.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkSmartPointer.h"
#include "vtkCommand.h"
#include "vtkInteractorEventRecorder.h"
#include "vtkRegressionTestImage.h"
#include "vtkDebugLeaks.h"
#include "vtkCoordinate.h"
#include "vtkMath.h"
#include "vtkHandleWidget.h"
#include "vtkPointHandleRepresentation3D.h"
#include "vtkProperty.h"
#include "vtkCamera.h"
#include "vtkFollower.h"

#define VTK_CREATE(type, name) \
  vtkSmartPointer<type> name = vtkSmartPointer<type>::New()

int TestDistanceWidget3D(int, char*[]);

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    TestDistanceWidget3D(argc, argv );

    return a.exec();
}

const char TestDistanceWidget3DEventLog[] =
"# StreamVersion 1\n"
"RenderEvent 0 0 0 0 0 0 0\n"
"EnterEvent 292 123 0 0 0 0 0\n"
"MouseMoveEvent 280 131 0 0 0 0 0\n"
"MouseMoveEvent 268 137 0 0 0 0 0\n"
"MouseMoveEvent 258 143 0 0 0 0 0\n"
"MouseMoveEvent 250 147 0 0 0 0 0\n"
"MouseMoveEvent 246 153 0 0 0 0 0\n"
"MouseMoveEvent 245 155 0 0 0 0 0\n"
"MouseMoveEvent 244 157 0 0 0 0 0\n"
"MouseMoveEvent 240 161 0 0 0 0 0\n"
"MouseMoveEvent 239 163 0 0 0 0 0\n"
"MouseMoveEvent 235 167 0 0 0 0 0\n"
"MouseMoveEvent 233 173 0 0 0 0 0\n"
"MouseMoveEvent 229 177 0 0 0 0 0\n"
"MouseMoveEvent 223 183 0 0 0 0 0\n"
"MouseMoveEvent 222 184 0 0 0 0 0\n"
"MouseMoveEvent 221 186 0 0 0 0 0\n"
"MouseMoveEvent 220 187 0 0 0 0 0\n"
"MouseMoveEvent 219 188 0 0 0 0 0\n"
"MouseMoveEvent 219 189 0 0 0 0 0\n"
"LeftButtonPressEvent 219 189 0 0 0 0 0\n"
"RenderEvent 219 189 0 0 0 0 0\n"
"LeftButtonReleaseEvent 219 189 0 0 0 0 0\n"
"MouseMoveEvent 218 189 0 0 0 0 0\n"
"RenderEvent 218 189 0 0 0 0 0\n"
"MouseMoveEvent 218 188 0 0 0 0 0\n"
"RenderEvent 218 188 0 0 0 0 0\n"
"MouseMoveEvent 216 187 0 0 0 0 0\n"
"RenderEvent 216 187 0 0 0 0 0\n"
"MouseMoveEvent 212 183 0 0 0 0 0\n"
"RenderEvent 212 183 0 0 0 0 0\n"
"MouseMoveEvent 206 179 0 0 0 0 0\n"
"RenderEvent 206 179 0 0 0 0 0\n"
"MouseMoveEvent 202 175 0 0 0 0 0\n"
"RenderEvent 202 175 0 0 0 0 0\n"
"MouseMoveEvent 194 169 0 0 0 0 0\n"
"RenderEvent 194 169 0 0 0 0 0\n"
"MouseMoveEvent 188 165 0 0 0 0 0\n"
"RenderEvent 188 165 0 0 0 0 0\n"
"MouseMoveEvent 182 159 0 0 0 0 0\n"
"RenderEvent 182 159 0 0 0 0 0\n"
"MouseMoveEvent 174 153 0 0 0 0 0\n"
"RenderEvent 174 153 0 0 0 0 0\n"
"MouseMoveEvent 166 149 0 0 0 0 0\n"
"RenderEvent 166 149 0 0 0 0 0\n"
"MouseMoveEvent 162 143 0 0 0 0 0\n"
"RenderEvent 162 143 0 0 0 0 0\n"
"MouseMoveEvent 156 137 0 0 0 0 0\n"
"RenderEvent 156 137 0 0 0 0 0\n"
"MouseMoveEvent 148 135 0 0 0 0 0\n"
"RenderEvent 148 135 0 0 0 0 0\n"
"MouseMoveEvent 144 129 0 0 0 0 0\n"
"RenderEvent 144 129 0 0 0 0 0\n"
"MouseMoveEvent 140 125 0 0 0 0 0\n"
"RenderEvent 140 125 0 0 0 0 0\n"
"MouseMoveEvent 136 119 0 0 0 0 0\n"
"RenderEvent 136 119 0 0 0 0 0\n"
"MouseMoveEvent 134 118 0 0 0 0 0\n"
"RenderEvent 134 118 0 0 0 0 0\n"
"MouseMoveEvent 130 114 0 0 0 0 0\n"
"RenderEvent 130 114 0 0 0 0 0\n"
"MouseMoveEvent 128 113 0 0 0 0 0\n"
"RenderEvent 128 113 0 0 0 0 0\n"
"MouseMoveEvent 124 109 0 0 0 0 0\n"
"RenderEvent 124 109 0 0 0 0 0\n"
"MouseMoveEvent 118 105 0 0 0 0 0\n"
"RenderEvent 118 105 0 0 0 0 0\n"
"MouseMoveEvent 116 104 0 0 0 0 0\n"
"RenderEvent 116 104 0 0 0 0 0\n"
"MouseMoveEvent 112 100 0 0 0 0 0\n"
"RenderEvent 112 100 0 0 0 0 0\n"
"MouseMoveEvent 110 99 0 0 0 0 0\n"
"RenderEvent 110 99 0 0 0 0 0\n"
"MouseMoveEvent 106 95 0 0 0 0 0\n"
"RenderEvent 106 95 0 0 0 0 0\n"
"MouseMoveEvent 105 94 0 0 0 0 0\n"
"RenderEvent 105 94 0 0 0 0 0\n"
"MouseMoveEvent 104 93 0 0 0 0 0\n"
"RenderEvent 104 93 0 0 0 0 0\n"
"MouseMoveEvent 102 92 0 0 0 0 0\n"
"RenderEvent 102 92 0 0 0 0 0\n"
"MouseMoveEvent 101 91 0 0 0 0 0\n"
"RenderEvent 101 91 0 0 0 0 0\n"
"MouseMoveEvent 99 90 0 0 0 0 0\n"
"RenderEvent 99 90 0 0 0 0 0\n"
"MouseMoveEvent 97 89 0 0 0 0 0\n"
"RenderEvent 97 89 0 0 0 0 0\n"
"MouseMoveEvent 96 87 0 0 0 0 0\n"
"RenderEvent 96 87 0 0 0 0 0\n"
"MouseMoveEvent 94 86 0 0 0 0 0\n"
"RenderEvent 94 86 0 0 0 0 0\n"
"MouseMoveEvent 93 85 0 0 0 0 0\n"
"RenderEvent 93 85 0 0 0 0 0\n"
"MouseMoveEvent 92 85 0 0 0 0 0\n"
"RenderEvent 92 85 0 0 0 0 0\n"
"MouseMoveEvent 92 84 0 0 0 0 0\n"
"RenderEvent 92 84 0 0 0 0 0\n"
"MouseMoveEvent 90 84 0 0 0 0 0\n"
"RenderEvent 90 84 0 0 0 0 0\n"
"MouseMoveEvent 90 83 0 0 0 0 0\n"
"RenderEvent 90 83 0 0 0 0 0\n"
"MouseMoveEvent 89 83 0 0 0 0 0\n"
"RenderEvent 89 83 0 0 0 0 0\n"
"MouseMoveEvent 89 82 0 0 0 0 0\n"
"RenderEvent 89 82 0 0 0 0 0\n"
"LeftButtonPressEvent 89 82 0 0 0 0 0\n"
"RenderEvent 89 82 0 0 0 0 0\n"
"LeftButtonReleaseEvent 89 82 0 0 0 0 0\n"
"MouseMoveEvent 89 81 0 0 0 0 0\n"
"RenderEvent 89 81 0 0 0 0 0\n"
"MouseMoveEvent 89 80 0 0 0 0 0\n"
"RenderEvent 89 80 0 0 0 0 0\n"
"MouseMoveEvent 88 80 0 0 0 0 0\n"
"RenderEvent 88 80 0 0 0 0 0\n"
"MouseMoveEvent 88 79 0 0 0 0 0\n"
"RenderEvent 88 79 0 0 0 0 0\n"
"MouseMoveEvent 87 78 0 0 0 0 0\n"
"RenderEvent 87 78 0 0 0 0 0\n"
"MouseMoveEvent 87 77 0 0 0 0 0\n"
"RenderEvent 87 77 0 0 0 0 0\n"
"MouseMoveEvent 86 76 0 0 0 0 0\n"
"RenderEvent 86 76 0 0 0 0 0\n"
"MouseMoveEvent 86 74 0 0 0 0 0\n"
"RenderEvent 86 74 0 0 0 0 0\n"
"MouseMoveEvent 85 72 0 0 0 0 0\n"
"RenderEvent 85 72 0 0 0 0 0\n"
"MouseMoveEvent 85 71 0 0 0 0 0\n"
"RenderEvent 85 71 0 0 0 0 0\n"
"MouseMoveEvent 81 67 0 0 0 0 0\n"
"RenderEvent 81 67 0 0 0 0 0\n"
"MouseMoveEvent 81 64 0 0 0 0 0\n"
"RenderEvent 81 64 0 0 0 0 0\n"
"MouseMoveEvent 80 62 0 0 0 0 0\n"
"RenderEvent 80 62 0 0 0 0 0\n"
"MouseMoveEvent 79 60 0 0 0 0 0\n"
"RenderEvent 79 60 0 0 0 0 0\n"
"MouseMoveEvent 79 58 0 0 0 0 0\n"
"RenderEvent 79 58 0 0 0 0 0\n"
"MouseMoveEvent 78 56 0 0 0 0 0\n"
"RenderEvent 78 56 0 0 0 0 0\n"
"MouseMoveEvent 77 55 0 0 0 0 0\n"
"RenderEvent 77 55 0 0 0 0 0\n"
"MouseMoveEvent 77 54 0 0 0 0 0\n"
"RenderEvent 77 54 0 0 0 0 0\n"
"MouseMoveEvent 77 53 0 0 0 0 0\n"
"RenderEvent 77 53 0 0 0 0 0\n"
"MouseMoveEvent 78 53 0 0 0 0 0\n"
"RenderEvent 78 53 0 0 0 0 0\n"
"MouseMoveEvent 78 52 0 0 0 0 0\n"
"RenderEvent 78 52 0 0 0 0 0\n"
"MouseMoveEvent 79 52 0 0 0 0 0\n"
"RenderEvent 79 52 0 0 0 0 0\n"
"MouseMoveEvent 80 52 0 0 0 0 0\n"
"RenderEvent 80 52 0 0 0 0 0\n"
"MouseMoveEvent 80 53 0 0 0 0 0\n"
"RenderEvent 80 53 0 0 0 0 0\n"
"MouseMoveEvent 81 53 0 0 0 0 0\n"
"RenderEvent 81 53 0 0 0 0 0\n"
"MouseMoveEvent 81 54 0 0 0 0 0\n"
"RenderEvent 81 54 0 0 0 0 0\n"
"MouseMoveEvent 83 55 0 0 0 0 0\n"
"RenderEvent 83 55 0 0 0 0 0\n"
"MouseMoveEvent 84 56 0 0 0 0 0\n"
"RenderEvent 84 56 0 0 0 0 0\n"
"MouseMoveEvent 90 58 0 0 0 0 0\n"
"RenderEvent 90 58 0 0 0 0 0\n"
"MouseMoveEvent 92 59 0 0 0 0 0\n"
"RenderEvent 92 59 0 0 0 0 0\n"
"MouseMoveEvent 94 60 0 0 0 0 0\n"
"RenderEvent 94 60 0 0 0 0 0\n"
"MouseMoveEvent 102 64 0 0 0 0 0\n"
"RenderEvent 102 64 0 0 0 0 0\n"
"MouseMoveEvent 106 68 0 0 0 0 0\n"
"RenderEvent 106 68 0 0 0 0 0\n"
"MouseMoveEvent 114 74 0 0 0 0 0\n"
"RenderEvent 114 74 0 0 0 0 0\n"
"MouseMoveEvent 122 80 0 0 0 0 0\n"
"RenderEvent 122 80 0 0 0 0 0\n"
"MouseMoveEvent 130 86 0 0 0 0 0\n"
"RenderEvent 130 86 0 0 0 0 0\n"
"MouseMoveEvent 140 94 0 0 0 0 0\n"
"RenderEvent 140 94 0 0 0 0 0\n"
"MouseMoveEvent 150 102 0 0 0 0 0\n"
"RenderEvent 150 102 0 0 0 0 0\n"
"MouseMoveEvent 156 106 0 0 0 0 0\n"
"RenderEvent 156 106 0 0 0 0 0\n"
"MouseMoveEvent 166 112 0 0 0 0 0\n"
"RenderEvent 166 112 0 0 0 0 0\n"
"MouseMoveEvent 174 120 0 0 0 0 0\n"
"RenderEvent 174 120 0 0 0 0 0\n"
"MouseMoveEvent 182 128 0 0 0 0 0\n"
"RenderEvent 182 128 0 0 0 0 0\n"
"MouseMoveEvent 188 132 0 0 0 0 0\n"
"RenderEvent 188 132 0 0 0 0 0\n"
"MouseMoveEvent 194 138 0 0 0 0 0\n"
"RenderEvent 194 138 0 0 0 0 0\n"
"MouseMoveEvent 198 144 0 0 0 0 0\n"
"RenderEvent 198 144 0 0 0 0 0\n"
"MouseMoveEvent 199 146 0 0 0 0 0\n"
"RenderEvent 199 146 0 0 0 0 0\n"
"MouseMoveEvent 203 152 0 0 0 0 0\n"
"RenderEvent 203 152 0 0 0 0 0\n"
"MouseMoveEvent 204 154 0 0 0 0 0\n"
"RenderEvent 204 154 0 0 0 0 0\n"
"MouseMoveEvent 205 156 0 0 0 0 0\n"
"RenderEvent 205 156 0 0 0 0 0\n"
"MouseMoveEvent 206 157 0 0 0 0 0\n"
"RenderEvent 206 157 0 0 0 0 0\n"
"MouseMoveEvent 207 158 0 0 0 0 0\n"
"RenderEvent 207 158 0 0 0 0 0\n"
"MouseMoveEvent 207 159 0 0 0 0 0\n"
"RenderEvent 207 159 0 0 0 0 0\n"
"MouseMoveEvent 207 161 0 0 0 0 0\n"
"RenderEvent 207 161 0 0 0 0 0\n"
"MouseMoveEvent 208 162 0 0 0 0 0\n"
"RenderEvent 208 162 0 0 0 0 0\n"
"MouseMoveEvent 209 163 0 0 0 0 0\n"
"RenderEvent 209 163 0 0 0 0 0\n"
"MouseMoveEvent 210 164 0 0 0 0 0\n"
"RenderEvent 210 164 0 0 0 0 0\n"
"MouseMoveEvent 211 165 0 0 0 0 0\n"
"RenderEvent 211 165 0 0 0 0 0\n"
"MouseMoveEvent 211 166 0 0 0 0 0\n"
"RenderEvent 211 166 0 0 0 0 0\n"
"MouseMoveEvent 212 166 0 0 0 0 0\n"
"RenderEvent 212 166 0 0 0 0 0\n"
"MouseMoveEvent 212 167 0 0 0 0 0\n"
"RenderEvent 212 167 0 0 0 0 0\n"
"MouseMoveEvent 213 167 0 0 0 0 0\n"
"RenderEvent 213 167 0 0 0 0 0\n"
"MouseMoveEvent 213 168 0 0 0 0 0\n"
"RenderEvent 213 168 0 0 0 0 0\n"
"MouseMoveEvent 214 169 0 0 0 0 0\n"
"RenderEvent 214 169 0 0 0 0 0\n"
"MouseMoveEvent 215 170 0 0 0 0 0\n"
"RenderEvent 215 170 0 0 0 0 0\n"
"MouseMoveEvent 215 171 0 0 0 0 0\n"
"RenderEvent 215 171 0 0 0 0 0\n"
"MouseMoveEvent 216 172 0 0 0 0 0\n"
"RenderEvent 216 172 0 0 0 0 0\n"
"MouseMoveEvent 216 173 0 0 0 0 0\n"
"RenderEvent 216 173 0 0 0 0 0\n"
"MouseMoveEvent 217 174 0 0 0 0 0\n"
"RenderEvent 217 174 0 0 0 0 0\n"
"MouseMoveEvent 217 175 0 0 0 0 0\n"
"RenderEvent 217 175 0 0 0 0 0\n"
"MouseMoveEvent 217 176 0 0 0 0 0\n"
"RenderEvent 217 176 0 0 0 0 0\n"
"MouseMoveEvent 217 177 0 0 0 0 0\n"
"RenderEvent 217 177 0 0 0 0 0\n"
"MouseMoveEvent 217 178 0 0 0 0 0\n"
"RenderEvent 217 178 0 0 0 0 0\n"
"MouseMoveEvent 217 179 0 0 0 0 0\n"
"RenderEvent 217 179 0 0 0 0 0\n"
"MouseMoveEvent 217 180 0 0 0 0 0\n"
"RenderEvent 217 180 0 0 0 0 0\n"
"MouseMoveEvent 217 181 0 0 0 0 0\n"
"RenderEvent 217 181 0 0 0 0 0\n"
"MouseMoveEvent 217 182 0 0 0 0 0\n"
"RenderEvent 217 182 0 0 0 0 0\n"
"MouseMoveEvent 217 183 0 0 0 0 0\n"
"RenderEvent 217 183 0 0 0 0 0\n"
"MouseMoveEvent 217 184 0 0 0 0 0\n"
"RenderEvent 217 184 0 0 0 0 0\n"
"MouseMoveEvent 217 185 0 0 0 0 0\n"
"RenderEvent 217 185 0 0 0 0 0\n"
"MouseMoveEvent 217 186 0 0 0 0 0\n"
"RenderEvent 217 186 0 0 0 0 0\n"
"MouseMoveEvent 217 187 0 0 0 0 0\n"
"RenderEvent 217 187 0 0 0 0 0\n"
"MouseMoveEvent 216 188 0 0 0 0 0\n"
"RenderEvent 216 188 0 0 0 0 0\n"
"MouseMoveEvent 216 189 0 0 0 0 0\n"
"RenderEvent 216 189 0 0 0 0 0\n"
"LeftButtonPressEvent 216 189 0 0 0 0 0\n"
"RenderEvent 216 189 0 0 0 0 0\n"
"MouseMoveEvent 215 190 0 0 0 0 0\n"
"RenderEvent 215 190 0 0 0 0 0\n"
"MouseMoveEvent 213 191 0 0 0 0 0\n"
"RenderEvent 213 191 0 0 0 0 0\n"
"MouseMoveEvent 207 193 0 0 0 0 0\n"
"RenderEvent 207 193 0 0 0 0 0\n"
"MouseMoveEvent 199 197 0 0 0 0 0\n"
"RenderEvent 199 197 0 0 0 0 0\n"
"MouseMoveEvent 191 199 0 0 0 0 0\n"
"RenderEvent 191 199 0 0 0 0 0\n"
"MouseMoveEvent 183 203 0 0 0 0 0\n"
"RenderEvent 183 203 0 0 0 0 0\n"
"MouseMoveEvent 173 207 0 0 0 0 0\n"
"RenderEvent 173 207 0 0 0 0 0\n"
"MouseMoveEvent 165 211 0 0 0 0 0\n"
"RenderEvent 165 211 0 0 0 0 0\n"
"MouseMoveEvent 155 215 0 0 0 0 0\n"
"RenderEvent 155 215 0 0 0 0 0\n"
"MouseMoveEvent 147 219 0 0 0 0 0\n"
"RenderEvent 147 219 0 0 0 0 0\n"
"MouseMoveEvent 139 221 0 0 0 0 0\n"
"RenderEvent 139 221 0 0 0 0 0\n"
"MouseMoveEvent 131 223 0 0 0 0 0\n"
"RenderEvent 131 223 0 0 0 0 0\n"
"MouseMoveEvent 125 227 0 0 0 0 0\n"
"RenderEvent 125 227 0 0 0 0 0\n"
"MouseMoveEvent 119 229 0 0 0 0 0\n"
"RenderEvent 119 229 0 0 0 0 0\n"
"MouseMoveEvent 113 231 0 0 0 0 0\n"
"RenderEvent 113 231 0 0 0 0 0\n"
"MouseMoveEvent 107 233 0 0 0 0 0\n"
"RenderEvent 107 233 0 0 0 0 0\n"
"MouseMoveEvent 101 235 0 0 0 0 0\n"
"RenderEvent 101 235 0 0 0 0 0\n"
"MouseMoveEvent 99 236 0 0 0 0 0\n"
"RenderEvent 99 236 0 0 0 0 0\n"
"MouseMoveEvent 97 237 0 0 0 0 0\n"
"RenderEvent 97 237 0 0 0 0 0\n"
"MouseMoveEvent 95 237 0 0 0 0 0\n"
"RenderEvent 95 237 0 0 0 0 0\n"
"MouseMoveEvent 94 238 0 0 0 0 0\n"
"RenderEvent 94 238 0 0 0 0 0\n"
"MouseMoveEvent 92 239 0 0 0 0 0\n"
"RenderEvent 92 239 0 0 0 0 0\n"
"MouseMoveEvent 90 239 0 0 0 0 0\n"
"RenderEvent 90 239 0 0 0 0 0\n"
"MouseMoveEvent 88 239 0 0 0 0 0\n"
"RenderEvent 88 239 0 0 0 0 0\n"
"MouseMoveEvent 87 240 0 0 0 0 0\n"
"RenderEvent 87 240 0 0 0 0 0\n"
"MouseMoveEvent 86 240 0 0 0 0 0\n"
"RenderEvent 86 240 0 0 0 0 0\n"
"MouseMoveEvent 85 240 0 0 0 0 0\n"
"RenderEvent 85 240 0 0 0 0 0\n"
"MouseMoveEvent 84 240 0 0 0 0 0\n"
"RenderEvent 84 240 0 0 0 0 0\n"
"MouseMoveEvent 83 240 0 0 0 0 0\n"
"RenderEvent 83 240 0 0 0 0 0\n"
"MouseMoveEvent 82 240 0 0 0 0 0\n"
"RenderEvent 82 240 0 0 0 0 0\n"
"MouseMoveEvent 81 240 0 0 0 0 0\n"
"RenderEvent 81 240 0 0 0 0 0\n"
"MouseMoveEvent 80 241 0 0 0 0 0\n"
"RenderEvent 80 241 0 0 0 0 0\n"
"MouseMoveEvent 79 241 0 0 0 0 0\n"
"RenderEvent 79 241 0 0 0 0 0\n"
"MouseMoveEvent 77 241 0 0 0 0 0\n"
"RenderEvent 77 241 0 0 0 0 0\n"
"MouseMoveEvent 75 241 0 0 0 0 0\n"
"RenderEvent 75 241 0 0 0 0 0\n"
"MouseMoveEvent 74 241 0 0 0 0 0\n"
"RenderEvent 74 241 0 0 0 0 0\n"
"MouseMoveEvent 74 242 0 0 0 0 0\n"
"RenderEvent 74 242 0 0 0 0 0\n"
"MouseMoveEvent 73 242 0 0 0 0 0\n"
"RenderEvent 73 242 0 0 0 0 0\n"
"MouseMoveEvent 72 242 0 0 0 0 0\n"
"RenderEvent 72 242 0 0 0 0 0\n"
"MouseMoveEvent 71 242 0 0 0 0 0\n"
"RenderEvent 71 242 0 0 0 0 0\n"
"MouseMoveEvent 70 242 0 0 0 0 0\n"
"RenderEvent 70 242 0 0 0 0 0\n"
"MouseMoveEvent 69 242 0 0 0 0 0\n"
"RenderEvent 69 242 0 0 0 0 0\n"
"MouseMoveEvent 68 242 0 0 0 0 0\n"
"RenderEvent 68 242 0 0 0 0 0\n"
"MouseMoveEvent 67 242 0 0 0 0 0\n"
"RenderEvent 67 242 0 0 0 0 0\n"
"MouseMoveEvent 66 242 0 0 0 0 0\n"
"RenderEvent 66 242 0 0 0 0 0\n"
"MouseMoveEvent 65 242 0 0 0 0 0\n"
"RenderEvent 65 242 0 0 0 0 0\n"
"MouseMoveEvent 64 242 0 0 0 0 0\n"
"RenderEvent 64 242 0 0 0 0 0\n"
"MouseMoveEvent 64 241 0 0 0 0 0\n"
"RenderEvent 64 241 0 0 0 0 0\n"
"MouseMoveEvent 63 241 0 0 0 0 0\n"
"RenderEvent 63 241 0 0 0 0 0\n"
"MouseMoveEvent 63 240 0 0 0 0 0\n"
"RenderEvent 63 240 0 0 0 0 0\n"
"MouseMoveEvent 62 240 0 0 0 0 0\n"
"RenderEvent 62 240 0 0 0 0 0\n"
"MouseMoveEvent 62 239 0 0 0 0 0\n"
"RenderEvent 62 239 0 0 0 0 0\n"
"MouseMoveEvent 61 239 0 0 0 0 0\n"
"RenderEvent 61 239 0 0 0 0 0\n"
"MouseMoveEvent 60 239 0 0 0 0 0\n"
"RenderEvent 60 239 0 0 0 0 0\n"
"MouseMoveEvent 60 238 0 0 0 0 0\n"
"RenderEvent 60 238 0 0 0 0 0\n"
"MouseMoveEvent 60 237 0 0 0 0 0\n"
"RenderEvent 60 237 0 0 0 0 0\n"
"MouseMoveEvent 60 236 0 0 0 0 0\n"
"RenderEvent 60 236 0 0 0 0 0\n"
"MouseMoveEvent 60 235 0 0 0 0 0\n"
"RenderEvent 60 235 0 0 0 0 0\n"
"MouseMoveEvent 60 234 0 0 0 0 0\n"
"RenderEvent 60 234 0 0 0 0 0\n"
"MouseMoveEvent 60 233 0 0 0 0 0\n"
"RenderEvent 60 233 0 0 0 0 0\n"
"MouseMoveEvent 60 232 0 0 0 0 0\n"
"RenderEvent 60 232 0 0 0 0 0\n"
"MouseMoveEvent 60 231 0 0 0 0 0\n"
"RenderEvent 60 231 0 0 0 0 0\n"
"MouseMoveEvent 60 230 0 0 0 0 0\n"
"RenderEvent 60 230 0 0 0 0 0\n"
"MouseMoveEvent 60 229 0 0 0 0 0\n"
"RenderEvent 60 229 0 0 0 0 0\n"
"MouseMoveEvent 60 228 0 0 0 0 0\n"
"RenderEvent 60 228 0 0 0 0 0\n"
"MouseMoveEvent 60 227 0 0 0 0 0\n"
"RenderEvent 60 227 0 0 0 0 0\n"
"MouseMoveEvent 60 226 0 0 0 0 0\n"
"RenderEvent 60 226 0 0 0 0 0\n"
"MouseMoveEvent 60 225 0 0 0 0 0\n"
"RenderEvent 60 225 0 0 0 0 0\n"
"MouseMoveEvent 60 224 0 0 0 0 0\n"
"RenderEvent 60 224 0 0 0 0 0\n"
"MouseMoveEvent 60 223 0 0 0 0 0\n"
"RenderEvent 60 223 0 0 0 0 0\n"
"MouseMoveEvent 61 222 0 0 0 0 0\n"
"RenderEvent 61 222 0 0 0 0 0\n"
"MouseMoveEvent 61 221 0 0 0 0 0\n"
"RenderEvent 61 221 0 0 0 0 0\n"
"MouseMoveEvent 61 220 0 0 0 0 0\n"
"RenderEvent 61 220 0 0 0 0 0\n"
"MouseMoveEvent 61 219 0 0 0 0 0\n"
"RenderEvent 61 219 0 0 0 0 0\n"
"MouseMoveEvent 62 219 0 0 0 0 0\n"
"RenderEvent 62 219 0 0 0 0 0\n"
"MouseMoveEvent 62 218 0 0 0 0 0\n"
"RenderEvent 62 218 0 0 0 0 0\n"
"MouseMoveEvent 62 217 0 0 0 0 0\n"
"RenderEvent 62 217 0 0 0 0 0\n"
"LeftButtonReleaseEvent 62 217 0 0 0 0 0\n"
"RenderEvent 62 217 0 0 0 0 0\n"
"MouseMoveEvent 62 216 0 0 0 0 0\n"
"RenderEvent 62 216 0 0 0 0 0\n"
"MouseMoveEvent 62 215 0 0 0 0 0\n"
"RenderEvent 62 215 0 0 0 0 0\n"
"MouseMoveEvent 62 214 0 0 0 0 0\n"
"RenderEvent 62 214 0 0 0 0 0\n"
"MouseMoveEvent 63 214 0 0 0 0 0\n"
"RenderEvent 63 214 0 0 0 0 0\n"
"MouseMoveEvent 63 213 0 0 0 0 0\n"
"RenderEvent 63 213 0 0 0 0 0\n"
"MouseMoveEvent 64 211 0 0 0 0 0\n"
"RenderEvent 64 211 0 0 0 0 0\n"
"MouseMoveEvent 64 209 0 0 0 0 0\n"
"RenderEvent 64 209 0 0 0 0 0\n"
"MouseMoveEvent 65 207 0 0 0 0 0\n"
"RenderEvent 65 207 0 0 0 0 0\n"
"MouseMoveEvent 67 199 0 0 0 0 0\n"
"RenderEvent 67 199 0 0 0 0 0\n"
"MouseMoveEvent 67 191 0 0 0 0 0\n"
"RenderEvent 67 191 0 0 0 0 0\n"
"MouseMoveEvent 69 183 0 0 0 0 0\n"
"RenderEvent 69 183 0 0 0 0 0\n"
"MouseMoveEvent 71 175 0 0 0 0 0\n"
"RenderEvent 71 175 0 0 0 0 0\n"
"MouseMoveEvent 73 165 0 0 0 0 0\n"
"RenderEvent 73 165 0 0 0 0 0\n"
"MouseMoveEvent 73 155 0 0 0 0 0\n"
"RenderEvent 73 155 0 0 0 0 0\n"
"MouseMoveEvent 75 145 0 0 0 0 0\n"
"RenderEvent 75 145 0 0 0 0 0\n"
"MouseMoveEvent 77 133 0 0 0 0 0\n"
"RenderEvent 77 133 0 0 0 0 0\n"
"MouseMoveEvent 79 123 0 0 0 0 0\n"
"RenderEvent 79 123 0 0 0 0 0\n"
"MouseMoveEvent 81 113 0 0 0 0 0\n"
"RenderEvent 81 113 0 0 0 0 0\n"
"MouseMoveEvent 83 103 0 0 0 0 0\n"
"RenderEvent 83 103 0 0 0 0 0\n"
"MouseMoveEvent 83 95 0 0 0 0 0\n"
"RenderEvent 83 95 0 0 0 0 0\n"
"MouseMoveEvent 87 89 0 0 0 0 0\n"
"RenderEvent 87 89 0 0 0 0 0\n"
"MouseMoveEvent 89 83 0 0 0 0 0\n"
"RenderEvent 89 83 0 0 0 0 0\n"
"MouseMoveEvent 89 80 0 0 0 0 0\n"
"RenderEvent 89 80 0 0 0 0 0\n"
"MouseMoveEvent 89 78 0 0 0 0 0\n"
"RenderEvent 89 78 0 0 0 0 0\n"
"MouseMoveEvent 90 76 0 0 0 0 0\n"
"RenderEvent 90 76 0 0 0 0 0\n"
"MouseMoveEvent 90 75 0 0 0 0 0\n"
"RenderEvent 90 75 0 0 0 0 0\n"
"MouseMoveEvent 90 74 0 0 0 0 0\n"
"RenderEvent 90 74 0 0 0 0 0\n"
"MouseMoveEvent 90 73 0 0 0 0 0\n"
"RenderEvent 90 73 0 0 0 0 0\n"
"MouseMoveEvent 91 73 0 0 0 0 0\n"
"RenderEvent 91 73 0 0 0 0 0\n"
"MouseMoveEvent 91 74 0 0 0 0 0\n"
"RenderEvent 91 74 0 0 0 0 0\n"
"MouseMoveEvent 91 75 0 0 0 0 0\n"
"RenderEvent 91 75 0 0 0 0 0\n"
"MouseMoveEvent 91 76 0 0 0 0 0\n"
"RenderEvent 91 76 0 0 0 0 0\n"
"MouseMoveEvent 92 77 0 0 0 0 0\n"
"RenderEvent 92 77 0 0 0 0 0\n"
"MouseMoveEvent 92 78 0 0 0 0 0\n"
"RenderEvent 92 78 0 0 0 0 0\n"
"MouseMoveEvent 92 79 0 0 0 0 0\n"
"RenderEvent 92 79 0 0 0 0 0\n"
"MouseMoveEvent 92 80 0 0 0 0 0\n"
"RenderEvent 92 80 0 0 0 0 0\n"
"MouseMoveEvent 92 81 0 0 0 0 0\n"
"RenderEvent 92 81 0 0 0 0 0\n"
"LeftButtonPressEvent 92 81 0 0 0 0 0\n"
"RenderEvent 92 81 0 0 0 0 0\n"
"MouseMoveEvent 93 81 0 0 0 0 0\n"
"RenderEvent 93 81 0 0 0 0 0\n"
"MouseMoveEvent 94 81 0 0 0 0 0\n"
"RenderEvent 94 81 0 0 0 0 0\n"
"MouseMoveEvent 94 82 0 0 0 0 0\n"
"RenderEvent 94 82 0 0 0 0 0\n"
"MouseMoveEvent 95 83 0 0 0 0 0\n"
"RenderEvent 95 83 0 0 0 0 0\n"
"MouseMoveEvent 97 84 0 0 0 0 0\n"
"RenderEvent 97 84 0 0 0 0 0\n"
"MouseMoveEvent 98 86 0 0 0 0 0\n"
"RenderEvent 98 86 0 0 0 0 0\n"
"MouseMoveEvent 99 88 0 0 0 0 0\n"
"RenderEvent 99 88 0 0 0 0 0\n"
"MouseMoveEvent 101 89 0 0 0 0 0\n"
"RenderEvent 101 89 0 0 0 0 0\n"
"MouseMoveEvent 107 93 0 0 0 0 0\n"
"RenderEvent 107 93 0 0 0 0 0\n"
"MouseMoveEvent 113 97 0 0 0 0 0\n"
"RenderEvent 113 97 0 0 0 0 0\n"
"MouseMoveEvent 115 98 0 0 0 0 0\n"
"RenderEvent 115 98 0 0 0 0 0\n"
"MouseMoveEvent 119 102 0 0 0 0 0\n"
"RenderEvent 119 102 0 0 0 0 0\n"
"MouseMoveEvent 125 106 0 0 0 0 0\n"
"RenderEvent 125 106 0 0 0 0 0\n"
"MouseMoveEvent 129 110 0 0 0 0 0\n"
"RenderEvent 129 110 0 0 0 0 0\n"
"MouseMoveEvent 135 112 0 0 0 0 0\n"
"RenderEvent 135 112 0 0 0 0 0\n"
"MouseMoveEvent 139 116 0 0 0 0 0\n"
"RenderEvent 139 116 0 0 0 0 0\n"
"MouseMoveEvent 143 120 0 0 0 0 0\n"
"RenderEvent 143 120 0 0 0 0 0\n"
"MouseMoveEvent 145 121 0 0 0 0 0\n"
"RenderEvent 145 121 0 0 0 0 0\n"
"MouseMoveEvent 149 125 0 0 0 0 0\n"
"RenderEvent 149 125 0 0 0 0 0\n"
"MouseMoveEvent 151 126 0 0 0 0 0\n"
"RenderEvent 151 126 0 0 0 0 0\n"
"MouseMoveEvent 155 130 0 0 0 0 0\n"
"RenderEvent 155 130 0 0 0 0 0\n"
"MouseMoveEvent 157 131 0 0 0 0 0\n"
"RenderEvent 157 131 0 0 0 0 0\n"
"MouseMoveEvent 160 131 0 0 0 0 0\n"
"RenderEvent 160 131 0 0 0 0 0\n"
"MouseMoveEvent 162 132 0 0 0 0 0\n"
"RenderEvent 162 132 0 0 0 0 0\n"
"MouseMoveEvent 163 134 0 0 0 0 0\n"
"RenderEvent 163 134 0 0 0 0 0\n"
"MouseMoveEvent 165 135 0 0 0 0 0\n"
"RenderEvent 165 135 0 0 0 0 0\n"
"MouseMoveEvent 169 139 0 0 0 0 0\n"
"RenderEvent 169 139 0 0 0 0 0\n"
"MouseMoveEvent 171 140 0 0 0 0 0\n"
"RenderEvent 171 140 0 0 0 0 0\n"
"MouseMoveEvent 173 141 0 0 0 0 0\n"
"RenderEvent 173 141 0 0 0 0 0\n"
"MouseMoveEvent 174 143 0 0 0 0 0\n"
"RenderEvent 174 143 0 0 0 0 0\n"
"MouseMoveEvent 176 144 0 0 0 0 0\n"
"RenderEvent 176 144 0 0 0 0 0\n"
"MouseMoveEvent 178 144 0 0 0 0 0\n"
"RenderEvent 178 144 0 0 0 0 0\n"
"MouseMoveEvent 180 145 0 0 0 0 0\n"
"RenderEvent 180 145 0 0 0 0 0\n"
"MouseMoveEvent 182 146 0 0 0 0 0\n"
"RenderEvent 182 146 0 0 0 0 0\n"
"MouseMoveEvent 184 146 0 0 0 0 0\n"
"RenderEvent 184 146 0 0 0 0 0\n"
"MouseMoveEvent 186 147 0 0 0 0 0\n"
"RenderEvent 186 147 0 0 0 0 0\n"
"MouseMoveEvent 187 148 0 0 0 0 0\n"
"RenderEvent 187 148 0 0 0 0 0\n"
"MouseMoveEvent 189 148 0 0 0 0 0\n"
"RenderEvent 189 148 0 0 0 0 0\n"
"MouseMoveEvent 190 149 0 0 0 0 0\n"
"RenderEvent 190 149 0 0 0 0 0\n"
"MouseMoveEvent 191 149 0 0 0 0 0\n"
"RenderEvent 191 149 0 0 0 0 0\n"
"MouseMoveEvent 192 150 0 0 0 0 0\n"
"RenderEvent 192 150 0 0 0 0 0\n"
"MouseMoveEvent 194 150 0 0 0 0 0\n"
"RenderEvent 194 150 0 0 0 0 0\n"
"MouseMoveEvent 195 151 0 0 0 0 0\n"
"RenderEvent 195 151 0 0 0 0 0\n"
"MouseMoveEvent 196 151 0 0 0 0 0\n"
"RenderEvent 196 151 0 0 0 0 0\n"
"MouseMoveEvent 198 151 0 0 0 0 0\n"
"RenderEvent 198 151 0 0 0 0 0\n"
"MouseMoveEvent 199 152 0 0 0 0 0\n"
"RenderEvent 199 152 0 0 0 0 0\n"
"MouseMoveEvent 201 152 0 0 0 0 0\n"
"RenderEvent 201 152 0 0 0 0 0\n"
"MouseMoveEvent 203 153 0 0 0 0 0\n"
"RenderEvent 203 153 0 0 0 0 0\n"
"MouseMoveEvent 205 153 0 0 0 0 0\n"
"RenderEvent 205 153 0 0 0 0 0\n"
"MouseMoveEvent 207 153 0 0 0 0 0\n"
"RenderEvent 207 153 0 0 0 0 0\n"
"MouseMoveEvent 209 153 0 0 0 0 0\n"
"RenderEvent 209 153 0 0 0 0 0\n"
"MouseMoveEvent 210 153 0 0 0 0 0\n"
"RenderEvent 210 153 0 0 0 0 0\n"
"MouseMoveEvent 213 153 0 0 0 0 0\n"
"RenderEvent 213 153 0 0 0 0 0\n"
"MouseMoveEvent 215 153 0 0 0 0 0\n"
"RenderEvent 215 153 0 0 0 0 0\n"
"MouseMoveEvent 217 153 0 0 0 0 0\n"
"RenderEvent 217 153 0 0 0 0 0\n"
"MouseMoveEvent 219 153 0 0 0 0 0\n"
"RenderEvent 219 153 0 0 0 0 0\n"
"MouseMoveEvent 220 153 0 0 0 0 0\n"
"RenderEvent 220 153 0 0 0 0 0\n"
"MouseMoveEvent 221 153 0 0 0 0 0\n"
"RenderEvent 221 153 0 0 0 0 0\n"
"MouseMoveEvent 222 153 0 0 0 0 0\n"
"RenderEvent 222 153 0 0 0 0 0\n"
"MouseMoveEvent 224 153 0 0 0 0 0\n"
"RenderEvent 224 153 0 0 0 0 0\n"
"MouseMoveEvent 227 153 0 0 0 0 0\n"
"RenderEvent 227 153 0 0 0 0 0\n"
"MouseMoveEvent 228 153 0 0 0 0 0\n"
"RenderEvent 228 153 0 0 0 0 0\n"
"MouseMoveEvent 229 153 0 0 0 0 0\n"
"RenderEvent 229 153 0 0 0 0 0\n"
"MouseMoveEvent 230 153 0 0 0 0 0\n"
"RenderEvent 230 153 0 0 0 0 0\n"
"MouseMoveEvent 231 153 0 0 0 0 0\n"
"RenderEvent 231 153 0 0 0 0 0\n"
"MouseMoveEvent 232 153 0 0 0 0 0\n"
"RenderEvent 232 153 0 0 0 0 0\n"
"MouseMoveEvent 233 153 0 0 0 0 0\n"
"RenderEvent 233 153 0 0 0 0 0\n"
"MouseMoveEvent 234 153 0 0 0 0 0\n"
"RenderEvent 234 153 0 0 0 0 0\n"
"MouseMoveEvent 235 153 0 0 0 0 0\n"
"RenderEvent 235 153 0 0 0 0 0\n"
"MouseMoveEvent 236 153 0 0 0 0 0\n"
"RenderEvent 236 153 0 0 0 0 0\n"
"MouseMoveEvent 237 153 0 0 0 0 0\n"
"RenderEvent 237 153 0 0 0 0 0\n"
"MouseMoveEvent 238 153 0 0 0 0 0\n"
"RenderEvent 238 153 0 0 0 0 0\n"
"MouseMoveEvent 239 153 0 0 0 0 0\n"
"RenderEvent 239 153 0 0 0 0 0\n"
"MouseMoveEvent 240 153 0 0 0 0 0\n"
"RenderEvent 240 153 0 0 0 0 0\n"
"MouseMoveEvent 241 153 0 0 0 0 0\n"
"RenderEvent 241 153 0 0 0 0 0\n"
"MouseMoveEvent 242 153 0 0 0 0 0\n"
"RenderEvent 242 153 0 0 0 0 0\n"
"MouseMoveEvent 243 153 0 0 0 0 0\n"
"RenderEvent 243 153 0 0 0 0 0\n"
"MouseMoveEvent 244 153 0 0 0 0 0\n"
"RenderEvent 244 153 0 0 0 0 0\n"
"MouseMoveEvent 245 153 0 0 0 0 0\n"
"RenderEvent 245 153 0 0 0 0 0\n"
"MouseMoveEvent 246 153 0 0 0 0 0\n"
"RenderEvent 246 153 0 0 0 0 0\n"
"MouseMoveEvent 247 153 0 0 0 0 0\n"
"RenderEvent 247 153 0 0 0 0 0\n"
"MouseMoveEvent 248 153 0 0 0 0 0\n"
"RenderEvent 248 153 0 0 0 0 0\n"
"MouseMoveEvent 249 153 0 0 0 0 0\n"
"RenderEvent 249 153 0 0 0 0 0\n"
"MouseMoveEvent 250 153 0 0 0 0 0\n"
"RenderEvent 250 153 0 0 0 0 0\n"
"MouseMoveEvent 251 153 0 0 0 0 0\n"
"RenderEvent 251 153 0 0 0 0 0\n"
"MouseMoveEvent 252 153 0 0 0 0 0\n"
"RenderEvent 252 153 0 0 0 0 0\n"
"MouseMoveEvent 253 153 0 0 0 0 0\n"
"RenderEvent 253 153 0 0 0 0 0\n"
"MouseMoveEvent 254 153 0 0 0 0 0\n"
"RenderEvent 254 153 0 0 0 0 0\n"
"MouseMoveEvent 255 153 0 0 0 0 0\n"
"RenderEvent 255 153 0 0 0 0 0\n"
"MouseMoveEvent 256 153 0 0 0 0 0\n"
"RenderEvent 256 153 0 0 0 0 0\n"
"LeftButtonReleaseEvent 256 153 0 0 0 0 0\n"
"RenderEvent 256 153 0 0 0 0 0\n"
"MouseMoveEvent 256 152 0 0 0 0 0\n"
"RenderEvent 256 152 0 0 0 0 0\n"
"MouseMoveEvent 255 152 0 0 0 0 0\n"
"RenderEvent 255 152 0 0 0 0 0\n"
"MouseMoveEvent 255 150 0 0 0 0 0\n"
"RenderEvent 255 150 0 0 0 0 0\n"
"MouseMoveEvent 254 149 0 0 0 0 0\n"
"RenderEvent 254 149 0 0 0 0 0\n"
"MouseMoveEvent 253 148 0 0 0 0 0\n"
"RenderEvent 253 148 0 0 0 0 0\n"
"MouseMoveEvent 251 147 0 0 0 0 0\n"
"RenderEvent 251 147 0 0 0 0 0\n"
"MouseMoveEvent 250 146 0 0 0 0 0\n"
"RenderEvent 250 146 0 0 0 0 0\n"
"MouseMoveEvent 249 145 0 0 0 0 0\n"
"RenderEvent 249 145 0 0 0 0 0\n"
"MouseMoveEvent 247 144 0 0 0 0 0\n"
"RenderEvent 247 144 0 0 0 0 0\n"
"MouseMoveEvent 246 143 0 0 0 0 0\n"
"RenderEvent 246 143 0 0 0 0 0\n"
"MouseMoveEvent 244 142 0 0 0 0 0\n"
"RenderEvent 244 142 0 0 0 0 0\n"
"MouseMoveEvent 243 140 0 0 0 0 0\n"
"RenderEvent 243 140 0 0 0 0 0\n"
"MouseMoveEvent 241 139 0 0 0 0 0\n"
"RenderEvent 241 139 0 0 0 0 0\n"
"MouseMoveEvent 239 133 0 0 0 0 0\n"
"RenderEvent 239 133 0 0 0 0 0\n"
"MouseMoveEvent 235 127 0 0 0 0 0\n"
"RenderEvent 235 127 0 0 0 0 0\n"
"MouseMoveEvent 231 121 0 0 0 0 0\n"
"RenderEvent 231 121 0 0 0 0 0\n"
"MouseMoveEvent 229 113 0 0 0 0 0\n"
"RenderEvent 229 113 0 0 0 0 0\n"
"MouseMoveEvent 227 107 0 0 0 0 0\n"
"RenderEvent 227 107 0 0 0 0 0\n"
"MouseMoveEvent 223 101 0 0 0 0 0\n"
"RenderEvent 223 101 0 0 0 0 0\n"
"MouseMoveEvent 221 95 0 0 0 0 0\n"
"RenderEvent 221 95 0 0 0 0 0\n"
"MouseMoveEvent 219 87 0 0 0 0 0\n"
"RenderEvent 219 87 0 0 0 0 0\n"
"MouseMoveEvent 215 83 0 0 0 0 0\n"
"RenderEvent 215 83 0 0 0 0 0\n"
"MouseMoveEvent 213 77 0 0 0 0 0\n"
"RenderEvent 213 77 0 0 0 0 0\n"
"MouseMoveEvent 211 71 0 0 0 0 0\n"
"RenderEvent 211 71 0 0 0 0 0\n"
"MouseMoveEvent 209 65 0 0 0 0 0\n"
"RenderEvent 209 65 0 0 0 0 0\n"
"MouseMoveEvent 208 63 0 0 0 0 0\n"
"RenderEvent 208 63 0 0 0 0 0\n"
"MouseMoveEvent 207 61 0 0 0 0 0\n"
"RenderEvent 207 61 0 0 0 0 0\n"
"MouseMoveEvent 206 59 0 0 0 0 0\n"
"RenderEvent 206 59 0 0 0 0 0\n"
"MouseMoveEvent 206 56 0 0 0 0 0\n"
"RenderEvent 206 56 0 0 0 0 0\n"
"MouseMoveEvent 205 55 0 0 0 0 0\n"
"RenderEvent 205 55 0 0 0 0 0\n"
"MouseMoveEvent 204 53 0 0 0 0 0\n"
"RenderEvent 204 53 0 0 0 0 0\n"
"MouseMoveEvent 204 52 0 0 0 0 0\n"
"RenderEvent 204 52 0 0 0 0 0\n"
"MouseMoveEvent 203 50 0 0 0 0 0\n"
"RenderEvent 203 50 0 0 0 0 0\n"
"MouseMoveEvent 202 49 0 0 0 0 0\n"
"RenderEvent 202 49 0 0 0 0 0\n"
"MouseMoveEvent 201 48 0 0 0 0 0\n"
"RenderEvent 201 48 0 0 0 0 0\n"
"MouseMoveEvent 200 48 0 0 0 0 0\n"
"RenderEvent 200 48 0 0 0 0 0\n"
"KeyPressEvent 222 88 0 0 113 1 q\n"
"CharEvent 222 88 0 0 113 1 q\n"
"ExitEvent 222 88 0 0 113 1 q\n"
;

// This callback is responsible for adjusting the point position.
// It looks in the region around the point and finds the maximum or
// minimum value.
class vtkDistanceWidget3DCallback : public vtkCommand
{
public:
  static vtkDistanceWidget3DCallback *New()
    { return new vtkDistanceWidget3DCallback; }
  virtual void Execute(vtkObject *caller, unsigned long, void*);
  vtkDistanceWidget3DCallback():Renderer(0),RenderWindow(0),DistanceWidget(0),Distance(0) {}
  vtkRenderer *Renderer;
  vtkRenderWindow *RenderWindow;
  vtkDistanceWidget *DistanceWidget;
  vtkDistanceRepresentation3D *Distance;
};


// Method re-positions the points using random perturbation
void vtkDistanceWidget3DCallback::Execute(vtkObject*, unsigned long eid, void* callData)
{
  if ( eid == vtkCommand::InteractionEvent ||
       eid == vtkCommand::EndInteractionEvent )
    {
        double pos1[3], pos2[3];
    // Modify the measure axis
    this->Distance->GetPoint1WorldPosition(pos1);
    this->Distance->GetPoint2WorldPosition(pos2);
    double dist=sqrt(vtkMath::Distance2BetweenPoints(pos1,pos2));

    char title[256];
//    this->Distance->GetAxis()->SetRange(0.0,dist);
//    sprintf(title,"%-#6.3g",dist);            // commented by liyihai
//    this->Distance->GetAxis()->SetTitle(title);
      qDebug() << "dist:" << dist;              // added by liyihai
    }
  else
    {
    int pid = *(reinterpret_cast<int*>(callData));

    //From the point id, get the display coordinates
    double pos1[3], pos2[3], *pos;
    this->Distance->GetPoint1DisplayPosition(pos1);
    this->Distance->GetPoint2DisplayPosition(pos2);
    if ( pid == 0 )
      {
      pos = pos1;
      }
    else
      {
      pos = pos2;
      }

    // Okay, render without the widget, and get the color buffer
    int enabled = this->DistanceWidget->GetEnabled();
    if ( enabled )
      {
      this->DistanceWidget->SetEnabled(0); //does a Render() as a side effect
      }

    // Pretend we are doing something serious....just randomly bump the
    // location of the point.
    double p[3];
    p[0] = pos[0] + static_cast<int>(vtkMath::Random(-5.5,5.5));
    p[1] = pos[1] + static_cast<int>(vtkMath::Random(-5.5,5.5));
    p[2] = 0.0;

    // Set the new position
    if ( pid == 0 )
      {
      this->Distance->SetPoint1DisplayPosition(p);
      }
    else
      {
      this->Distance->SetPoint2DisplayPosition(p);
      }

    // Side effect of a render here
    if ( enabled )
      {
      this->DistanceWidget->SetEnabled(1);
      }
    }
}

// The actual test function
int TestDistanceWidget3D( int argc, char *argv[] )
{
  // Create the RenderWindow, Renderer and both Actors
  //
  VTK_CREATE(vtkRenderer, ren1);
  VTK_CREATE(vtkRenderWindow, renWin);
  renWin->AddRenderer(ren1);

  VTK_CREATE(vtkRenderWindowInteractor, iren);;
  iren->SetRenderWindow(renWin);

  // Create a test pipeline
  //
  VTK_CREATE(vtkSphereSource, ss);
  VTK_CREATE(vtkPolyDataMapper, mapper);
  mapper->SetInputConnection(ss->GetOutputPort());
  VTK_CREATE(vtkActor, actor);
  actor->SetMapper(mapper);

  // Create the widget and its representation
  VTK_CREATE(vtkPointHandleRepresentation3D, handle);
  handle->GetProperty()->SetColor(1,0,0);
  VTK_CREATE(vtkDistanceRepresentation3D, rep);
  rep->SetHandleRepresentation(handle);
  rep->RulerModeOn();
  rep->SetRulerDistance(0.1);
  rep->SetNumberOfRulerTicks(4);
  double glyphScale = rep->GetGlyphScale();
  rep->SetGlyphScale(2.0);
  if (rep->GetGlyphScale() != 2.0)
    {
    std::cerr << "Error setting glyph scale to 2.0, returned " << rep->GetGlyphScale() << std::endl;
    return EXIT_FAILURE;
    }
  rep->SetGlyphScale(glyphScale);
  if (rep->GetGlyphScale() != glyphScale)
    {
    std::cerr << "Error setting glyph scale to " << glyphScale << ", returned " << rep->GetGlyphScale() << std::endl;
    return EXIT_FAILURE;
    }
  rep->SetGlyphScale(0.1);
  if (rep->GetGlyphScale() != 0.1)
    {
    cerr << "Error setting glyph scale to 0.1, returned " << rep->GetGlyphScale() << std::endl;
    return EXIT_FAILURE;
    }


  if (!rep->GetLineProperty())
    {
    std::cerr << "Error getting representation line property" << endl;
    return EXIT_FAILURE;
    }
  rep->GetLineProperty()->SetColor(1.0, 0.0, 1.0);
  rep->SetLabelPosition(0.45);
  if (rep->GetLabelPosition() != 0.45)
    {
    std::cerr << "Error setting label position to 0.45, returned : " << rep->GetLabelPosition() << std::endl;
    return EXIT_FAILURE;
    }
  for (int maxTicks = 1; maxTicks < 100; maxTicks += 10)
    {
    rep->SetMaximumNumberOfRulerTicks(maxTicks);
    if (rep->GetMaximumNumberOfRulerTicks() != maxTicks)
      {
      std::cerr << "Error setting maximum number of ruler ticks to " << maxTicks << ", get returned " << rep->GetMaximumNumberOfRulerTicks() << std::endl;
      return EXIT_FAILURE;
      }
    }
  vtkActor *glyphActor = rep->GetGlyphActor();
  if (!glyphActor)
    {
    std::cerr << "Error getting glyph actor" << std::endl;
    return EXIT_FAILURE;
    }
  glyphActor->GetProperty()->SetColor(1.0, 0.0, 0.0);
  vtkFollower *labelActor = rep->GetLabelActor();
  if (!labelActor)
    {
    std::cerr << "Error getting label actor" << std::endl;
    return EXIT_FAILURE;
    }
  labelActor->GetProperty()->SetColor(0.0, 1.0, 0.0);

  VTK_CREATE(vtkDistanceWidget, widget);
  widget->SetInteractor(iren);
  widget->SetRepresentation(rep);

  VTK_CREATE(vtkDistanceWidget3DCallback, mcbk);
  mcbk->Renderer = ren1;
  mcbk->RenderWindow = renWin;
  mcbk->Distance = rep;
  mcbk->DistanceWidget = widget;

  // Add Observer
  //
  widget->AddObserver(vtkCommand::InteractionEvent, mcbk); // added by liyihai

  // Add the actors to the renderer, set the background and size
  //
  ren1->AddActor(actor);
  ren1->SetBackground(0.1, 0.2, 0.4);
  renWin->SetSize(300, 300);

  // record events
  VTK_CREATE(vtkInteractorEventRecorder, recorder);
  recorder->SetInteractor(iren);
  recorder->On();
  //recorder->SetFileName("/tmp/record2.log");
  //recorder->Record();
  recorder->ReadFromInputStringOn();
  recorder->SetInputString(TestDistanceWidget3DEventLog);

  // render the image
  //
  iren->Initialize();
  renWin->Render();
  widget->On();
  renWin->Render();
  renWin->Start();
  recorder->Play();

  // Remove the observers so we can go interactive. Without this the "-I"
  // testing option fails.

 // int retVal = vtkRegressionTestImage( renWin );
 // if ( retVal == vtkRegressionTester::DO_INTERACTOR) // commented by liyihai
    {
    iren->Start();
    }

  recorder->Off();
  widget->Off();
  widget->RemoveObserver(mcbk);

  return 0;         // added by liyihai
//  return !retVal; // commented by liyihai
}

    运行效果如图1.1所示


                       图1.1

1.2 vtkDistanceRepresentation3D函数分析

    在1.1小节所示的代码中,用到了vtkDistanceRepresentation3D这个类,在回调函数中使用了两个函数:

void vtkDistanceRepresentation3D::GetPoint1WorldPosition(double pos[3])
void vtkDistanceRepresentation3D::GetPoint2WorldPosition(double pos[3])
    这两个函数获得的坐标分别是图1.1中pos1和pos2两个端点处的世界坐标。图1.1中的绿色标号1.28就是pos1与pos2之间的世界坐标距离。

    此外,还可以通过下面的函数来获取端点pos1和pos2的屏幕坐标:

void vtkDistanceRepresentation3D::GetPoint1DisplayPosition(double pos[3])
void vtkDistanceRepresentation3D::GetPoint2DisplayPosition(double pos[3])

1.3 实际距离

    正如参考资料[10]所言的,上述例子测量的只是体数之间的坐标距离,并非实际的距离。在CT图像三维显示中,往往需要测量空间实际距离。那么,该如何实现呢?

    经过测试发现,并不需要对vtkDistanceWidget做任何设置,只需要在使用图像读取类(例如vtkTIFFReader)读取图像的时候设置通过其SetDataSpacing()将像素间的距离设置为实际距离即可!这时候再测量距离时,得到的就是实际距离。

2 角度测量

    关于角度的测量,有不同的实现方法。参考资料[12]中,通过定义两条直线,然后计算线之间的夹角的方法来实现角度的测量。然而在VTK6.2.0中,有更加方便快捷的方法,就是使用vtkAngleWidget类,具体使用方法见实例TestAngleWidget3D.cxx

3 体积&表面积测量

    由于篇幅限制,详见《VTK体积&表面积测量》。

4 曲线长度测量

    由于篇幅限制,详见《VTK曲线长度测量》。

参考资料

[1]vtk计算Polydata的面积和体积

[2]VTK距离测量

[3]VTK中实现距离测量

[4]DistanceWidget

[5]VTK DICOM 图像显示以及距离角度测量

[6]VTK-Widgets在医学图像交互测量中的研究

[7]基于VTK的医学图像交互式三维测量技术研究

[8]VTK-Widgets在医学图像交互测量中的研究

[9]DistanceBetweenPoints

[10]real distance with diantance widget

[11]DistanceWidget

[12]VTK的角度测量

[13]vtk计算Polydata的面积和体积

[14]ExtractOutsideSurface

[15]Calculating the area of a polygon

[16]Automated collection of volume and area info from vtk models

[17]How to calculate volume of convex hull and volume of a 3D object

[18]如何求三维重建后的表面积和体积????

[19]Visualization, volume and surface area calculation of three dimensional (3D) ultrasound images

[20]Measurement of surface area of biological structures, based on 3D microscopic image data

您可以使用VTK的线性测量工具来测量三维模型中的长度。以下是一个简单的示例代码,它使用vtkDistanceWidget和vtkDistanceRepresentation来实现线性测量。 ```python import vtk # 读取三维模型 reader = vtk.vtkSTLReader() reader.SetFileName("模型文件路径") reader.Update() # 创建渲染器和RenderWindow renderer = vtk.vtkRenderer() renderWindow = vtk.vtkRenderWindow() renderWindow.AddRenderer(renderer) # 创建交互器和RenderWindowInteractor interactor = vtk.vtkRenderWindowInteractor() interactor.SetRenderWindow(renderWindow) # 添加三维模型到渲染器中 mapper = vtk.vtkPolyDataMapper() mapper.SetInputConnection(reader.GetOutputPort()) actor = vtk.vtkActor() actor.SetMapper(mapper) renderer.AddActor(actor) # 创建线性测量工具 widget = vtk.vtkDistanceWidget() widget.SetInteractor(interactor) widget.CreateDefaultRepresentation() rep = widget.GetRepresentation() rep.SetLabelFormat("%-0.3f mm") rep.SetHandleSize(0.01) # 设置测量起点和终点的属性 rep.GetPoint1Representation().SetPointPlacer(None) rep.GetPoint2Representation().SetPointPlacer(None) rep.GetPoint1Representation().SetPickable(1) rep.GetPoint2Representation().SetPickable(1) # 启动交互器 interactor.Initialize() renderWindow.Render() widget.On() interactor.Start() ``` 在这个示例代码中,您需要将“模型文件路径”替换为您的三维模型文件的路径。运行代码后,您可以使用鼠标在三维模型上选择起点和终点,然后线性测量工具将显示测量结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

OneSea

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值