71 template<
typename VolumeType,
typename Callback>
74 typename VolumeType::Sampler sampler(volData);
79 float x1 = v3dStart.
getX() + 0.5f;
80 float y1 = v3dStart.
getY() + 0.5f;
81 float z1 = v3dStart.
getZ() + 0.5f;
82 float x2 = v3dEnd.
getX() + 0.5f;
83 float y2 = v3dEnd.
getY() + 0.5f;
84 float z2 = v3dEnd.
getZ() + 0.5f;
86 int i = (int)floorf(x1);
87 int j = (int)floorf(y1);
88 int k = (int)floorf(z1);
90 int iend = (int)floorf(x2);
91 int jend = (int)floorf(y2);
92 int kend = (int)floorf(z2);
94 int di = ((x1 < x2) ? 1 : ((x1 > x2) ? -1 : 0));
95 int dj = ((y1 < y2) ? 1 : ((y1 > y2) ? -1 : 0));
96 int dk = ((z1 < z2) ? 1 : ((z1 > z2) ? -1 : 0));
98 float deltatx = 1.0f / std::abs(x2 - x1);
99 float deltaty = 1.0f / std::abs(y2 - y1);
100 float deltatz = 1.0f / std::abs(z2 - z1);
102 float minx = floorf(x1), maxx = minx + 1.0f;
103 float tx = ((x1 > x2) ? (x1 - minx) : (maxx - x1)) * deltatx;
104 float miny = floorf(y1), maxy = miny + 1.0f;
105 float ty = ((y1 > y2) ? (y1 - miny) : (maxy - y1)) * deltaty;
106 float minz = floorf(z1), maxz = minz + 1.0f;
107 float tz = ((z1 > z2) ? (z1 - minz) : (maxz - z1)) * deltatz;
109 sampler.setPosition(i,j,k);
113 if(!callback(sampler))
118 if(tx <= ty && tx <= tz)
124 if(di == 1) sampler.movePositiveX();
125 if(di == -1) sampler.moveNegativeX();
132 if(dj == 1) sampler.movePositiveY();
133 if(dj == -1) sampler.moveNegativeY();
140 if(dk == 1) sampler.movePositiveZ();
141 if(dk == -1) sampler.moveNegativeZ();
172 template<
typename VolumeType,
typename Callback>
176 return raycastWithEndpoints<VolumeType, Callback>(volData, v3dStart, v3dEnd, callback);