Algorithme de lissage

J'ai écrit ce code pour le lissage d'une courbe .
Il faut 5 points à côté d'un point et ajoute et moyennes .

/* Smoothing */
void smoothing(vector<Point2D> &a)
{
    //How many neighbours to smooth
    int NO_OF_NEIGHBOURS=10;
    vector<Point2D> tmp=a;
    for(int i=0;i<a.size();i++)
    {

        if(i+NO_OF_NEIGHBOURS+1<a.size())
        {
            for(int j=1;j<NO_OF_NEIGHBOURS;j++)
            {
                a.at(i).x+=a.at(i+j).x;
                a.at(i).y+=a.at(i+j).y;
            }
            a.at(i).x/=NO_OF_NEIGHBOURS;
            a.at(i).y/=NO_OF_NEIGHBOURS;

        }
        else
        {
            for(int j=1;j<NO_OF_NEIGHBOURS;j++)
            {
                a.at(i).x+=tmp.at(i-j).x;
                a.at(i).y+=tmp.at(i-j).y;
            }
            a.at(i).x/=NO_OF_NEIGHBOURS;
            a.at(i).y/=NO_OF_NEIGHBOURS;
        }

    }

}

Mais j'obtiens de très hautes valeurs pour chaque point, au lieu de les mêmes valeurs pour le point précédent . La forme est agrandie beaucoup , ce qui ne va pas dans cet algorithme ?

Utilisation += et /= il rend votre code plus lisible (et a moins d'appels à at(i)).
Qu'advient-il si vous nourrir de données simple, où les résultats sont prévisibles, et vous le corriger?
j est égal à zéro, donc dans votre intérieur des boucles que vous n'êtes pas en lissant avec ]i, i+NO_OF_NEIGHBOURS], mais avec [i, i+NO_OF_NEIGHBOURS]
Qui a fait le tour , merci 🙂 .
Gardez à l'esprit que, dans la clause else vous accédez à des éléments qui ont déjà été modifiée par votre algorithme de lissage! Notez également que la moyenne d'un point avec ses voisins, vous devez diviser la somme par 1 + NO_OF_NEIGHBORS, que le point lui-même est contenue à l'intérieur de cette somme.

OriginalL'auteur rajat | 2012-10-19