Search code examples
vector3dgeometrymeshsampling

Sampling points in a vector


I have a vector _pts that contains values for (x,y,z), i.e. a point in 3D. Starting with _pts[0], I want to select those points whose distance between previously selected points is bigger than sampleRadius.

Here is my code but apparently something's wrong because is selecting a lot of points instead of just selecting a few. Can anyone see what am I doing wrong? Probably you would need more code to see what can be missed, but I would also appreciate any idea on how can I implement this.

float distance;
bool distanceIsOk;

//PICK A POINT IN VECTOR _pts
for (int cPIdx = 0; cPIdx < _pts.size(); cPIdx++) {
    distanceIsOk = true;
    //CHECK DISTANCE AGAINST PREVIOUSLY PICKED POINTS
    for (int dPIdx = 0; dPIdx < indeces.size(); dPIdx++) {
        distance = sqrt(
                        (_pts[cPIdx].v[0] - _pts[dPIdx].v[0])*(_pts[cPIdx].v[0] - _pts[dPIdx].v[0]) +
                        (_pts[cPIdx].v[1] - _pts[dPIdx].v[1])*(_pts[cPIdx].v[1] - _pts[dPIdx].v[1]) +
                        (_pts[cPIdx].v[2] - _pts[dPIdx].v[2])*(_pts[cPIdx].v[2] - _pts[dPIdx].v[2])
                        );
        //IF DISTANCE IS <= SUBSAMPLERADIUS FOR AT LEAST ONE PREVIOUSLY SELECTED POINT
        if (distance <= subsampleRadius) {
            //DISCARD THE POINT
            distanceIsOk = false;
            dPIdx += indeces.size();
        }
    }
    //OTHERWISE INCLUDE THAT POINT
    if (distanceIsOk == true) {
        indeces.push_back(cPIdx);
    }
}

Solution

  • Found the error. Instead of

            distance = sqrt(
                            (_pts[cPIdx].v[0] - _pts[dPIdx].v[0])*(_pts[cPIdx].v[0] - _pts[dPIdx].v[0]) +
                            (_pts[cPIdx].v[1] - _pts[dPIdx].v[1])*(_pts[cPIdx].v[1] - _pts[dPIdx].v[1]) +
                            (_pts[cPIdx].v[2] - _pts[dPIdx].v[2])*(_pts[cPIdx].v[2] - _pts[dPIdx].v[2])
    

    it should be

            distance = sqrt(
                            (_pts[cPIdx].v[0] - _pts[indeces[dPIdx]].v[0])*(_pts[cPIdx].v[0] - _pts[indeces[dPIdx]].v[0]) +
                            (_pts[cPIdx].v[1] - _pts[indeces[dPIdx]].v[1])*(_pts[cPIdx].v[1] - _pts[indeces[dPIdx]].v[1]) +
                            (_pts[cPIdx].v[2] - _pts[indeces[dPIdx]].v[2])*(_pts[cPIdx].v[2] - _pts[indeces[dPIdx]].v[2])