Commit d850d76d authored by gilles's avatar gilles

Corrections diverses :

* les paramètres minbound et maxbound étaient écrasés et utilisées
  comme des variables locales et donc les paramètres ne servaient à rien
* ajustement des distances d'entrée et de sortie avec minbound et maxbound
* dans le calcul du numéro du voxel d'entrée, il y avait des cast en
  int en plein milieu des formules qui faussaient tout
* dans le calcul initial de Dz, dans le cas "dir.z < 0", il y avait
  un "-1" superflu et faux
* dans la boucle, on en sort lorsque le voxel courant est à une
  distance supérieures à maxbound
parent 79a19f38
......@@ -23,6 +23,7 @@
#define NEXT_X 1
#define NEXT_Y 2
#define NEXT_Z 3
#define NEXT_FIN 4
using namespace std;
......@@ -156,7 +157,7 @@ void LrBinderRegularGrid::initBinder()
bool LrBinderRegularGrid::getIntersection(const LrRay &ray, LrHit *hit, Real minbound, Real maxbound) const
{
Real lminbound, lmaxbound;
Real distEntry = -INFINITY;
Real distExit = INFINITY;
bool origInBinder = false;
......@@ -323,6 +324,12 @@ bool LrBinderRegularGrid::getIntersection(const LrRay &ray, LrHit *hit, Real min
}
// ### Fin : Intersection en Z
// on ajuste les distances d'entrée et de sortie en fonction de minbound et maxbound
if (maxbound < distExit)
distExit = maxbound;
if (minbound > distEntry)
distEntry = minbound;
if (distExit < EPSILON) {
return false;
}
......@@ -333,16 +340,19 @@ bool LrBinderRegularGrid::getIntersection(const LrRay &ray, LrHit *hit, Real min
pointEntry = ray.getPoint(distEntry + EPSILON);
curVoxelX = (int)((((int)(pointEntry.x - min.x)) / m_lenBinder.x) * m_nbVoxelX);
curVoxelY = (int)((((int)(pointEntry.y - min.y)) / m_lenBinder.y) * m_nbVoxelY);
curVoxelZ = (int)((((int)(pointEntry.z - min.z)) / m_lenBinder.z) * m_nbVoxelZ);
curVoxelX = (int)(((pointEntry.x - min.x) / m_lenBinder.x) * m_nbVoxelX);
curVoxelY = (int)(((pointEntry.y - min.y) / m_lenBinder.y) * m_nbVoxelY);
curVoxelZ = (int)(((pointEntry.z - min.z) / m_lenBinder.z) * m_nbVoxelZ);
lminbound = distEntry + 2 * EPSILON;
/*
if (origInBinder) {
minbound = 2 * EPSILON;
lminbound = 2 * EPSILON;
} else {
minbound = distEntry;
lminbound = distEntry;
}
maxbound = minbound;
*/
lmaxbound = lminbound;
// ## Initialisation de la progression en X
if (dir.x > EPSILON) {
......@@ -405,7 +415,7 @@ bool LrBinderRegularGrid::getIntersection(const LrRay &ray, LrHit *hit, Real min
incVoxelZ = -(m_nbVoxelX * m_nbVoxelY);
dz = -m_lenVoxel.z / dir.z;
Dz = (min.z + m_lenVoxel.z * (curVoxelZ-1) - orig.z) / dir.z;
Dz = (min.z + m_lenVoxel.z * (curVoxelZ) - orig.z) / dir.z;
} else {
......@@ -419,19 +429,25 @@ bool LrBinderRegularGrid::getIntersection(const LrRay &ray, LrHit *hit, Real min
do {
minbound = maxbound;
lminbound = lmaxbound;
if (Dx < Dy && Dx < Dz) {
maxbound = Dx;
lmaxbound = Dx;
next = NEXT_X;
} else if (Dy <Dz) {
maxbound = Dy;
lmaxbound = Dy;
next = NEXT_Y;
} else {
maxbound = Dz;
lmaxbound = Dz;
next = NEXT_Z;
}
if (lmaxbound > maxbound)
{
next = NEXT_FIN;
lmaxbound = maxbound;
}
intersection = false;
for (unsigned int i = 0; i < m_tabVoxel[curLineVoxel].size(); i++) {
......@@ -439,12 +455,12 @@ bool LrBinderRegularGrid::getIntersection(const LrRay &ray, LrHit *hit, Real min
LrEntity* entity = m_tabVoxel[curLineVoxel][i].m_entite;
int numFrag = m_tabVoxel[curLineVoxel][i].m_numFragment;
impact = entity->getIntersection(ray, hit, numFrag, minbound-EPSILON, maxbound+EPSILON);
impact = entity->getIntersection(ray, hit, numFrag, lminbound-EPSILON, lmaxbound+EPSILON);
intersection = intersection || impact;
if (impact) {
if (hit != NULL) {
maxbound = hit->distance;
lmaxbound = hit->distance;
} else {
break;
}
......@@ -485,6 +501,10 @@ bool LrBinderRegularGrid::getIntersection(const LrRay &ray, LrHit *hit, Real min
Dz += dz;
break;
case NEXT_FIN :
fin = true;
break;
default : break;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment