Vector3DF PointSet::GetGradient ( float x, float y, float z ) { Vector3DF norm; float dx, dy, dz, dsq; float sum; int pndx; Point* pcurr; float R2 = (m_GridCellsize/2.0)*(m_GridCellsize/2.0); Grid_FindCells ( Vector3DF(x,y,z), m_GridCellsize/2.0 ); int cnt = 0; sum = 0.0; norm.Set (0,0,0); for (int cell=0; cell < 8; cell++ ) { if ( m_GridCell[cell] != -1 ) { pndx = m_Grid [ m_GridCell[cell] ]; while ( pndx != -1 ) { pcurr = (Point*) (mBuf[0].data + pndx*mBuf[0].stride); dx = x - pcurr->pos.x; dy = y - pcurr->pos.y; dz = z - pcurr->pos.z; dsq = dx*dx+dy*dy+dz*dz; if ( dsq > 0 && dsq < R2 ) { dsq = 2.0*R2 / (dsq*dsq); norm.x += dx * dsq; norm.y += dy * dsq; norm.z += dz * dsq; } pndx = pcurr->next; } } } norm.Normalize (); return norm; }
DWORD PointSet::GetColor ( float x, float y, float z ) { Vector3DF clr; float dx, dy, dz, dsq; float sum; int pndx; Point* pcurr; float R2 = (m_GridCellsize/2.0)*(m_GridCellsize/2.0); Grid_FindCells ( Vector3DF(x,y,z), m_GridCellsize/2.0 ); int cnt = 0; sum = 0.0; clr.Set (0,0,0); for (int cell=0; cell < 8; cell++ ) { if ( m_GridCell[cell] != -1 ) { pndx = m_Grid [ m_GridCell[cell] ]; while ( pndx != -1 ) { pcurr = (Point*) (mBuf[0].data + pndx*mBuf[0].stride); dx = x - pcurr->pos.x; dy = y - pcurr->pos.y; dz = z - pcurr->pos.z; dsq = dx*dx+dy*dy+dz*dz; if ( dsq < R2 ) { dsq = 2.0*R2 / (dsq*dsq); clr.x += RED(pcurr->clr) * dsq; clr.y += GRN(pcurr->clr) * dsq; clr.z += BLUE(pcurr->clr) * dsq; } pndx = pcurr->next; } } } clr.Normalize (); return COLORA(clr.x, clr.y, clr.z, 1.0); }