Ultima domanda per stasera, lo prometto. Questi suggerimenti mi stanno dando un forte mal di testa.Come faccio a sovrascrivere accidentalmente quando faccio riferimento a questi puntatori?
Ho uno std :: list <Point
> chiamato poligono e uno std :: elenco di poligoni definito come:
typedef std::list<Point> Polygon;
typedef std::list<Polygon> PolygonList;
// List of all our polygons
PolygonList polygonList;
ho creato il metodo seguito per tentare di eliminare il punto più vicino da un (x, y), controllando tutti i miei poligoni nella mia lista poligonali.
void deleteNearestPoint(int x, int y)
{
y = screenHeight - y;
Polygon &closestPolygon = polygonList.front();
Polygon::iterator closestPoint = closestPolygon.begin();
float closestDistance = sqrt(pow(x - closestPoint->x, 2) + pow(y - closestPoint->y, 2));
// Search PolygonList
PolygonList::iterator listIter;
Polygon::iterator iter;
for(listIter = polygonList.begin(); listIter != polygonList.end(); listIter++)
{
Polygon &tempPolygon = *listIter;
for(iter = tempPolygon.begin(); iter != tempPolygon.end(); iter++)
{
const float distance = sqrt(pow(x - iter->x, 2) + pow(y - iter->y, 2));
if (distance < closestDistance)
{
closestPolygon = *listIter;
closestPoint = iter;
closestDistance = distance;
}
}
}
closestPolygon.erase(closestPoint);
redraw();
}
Tuttavia, da qualche parte ho un puntatore o una variabile di riferimento che mi incasina. Questo codice compila ma agisce in un modo molto strano.
ho scritto una dichiarazione di debug e permette di dire che ho 3 poligoni nella mia lista di poligoni in questo modo:
Poligono #: 0
Point: (448, 43)
Point: (469 , 177)
Point: (374, 123)
poligono #: 1
Point: (295, 360)
Point: (422, 350)
Point: (315, 266)
Point (295, 360)
Poligono #: 2
Point (143, 202)
Point (301, 203)
Point (222, 100)
Point (143, 202)
Ora, consente di dire che cercare di utilizzare la funzione di eliminazione dandogli un x/y vicino al punto 422, 350 il risultato desiderato sarebbe semplicemente cancellando quel punto (422, 350) dal poligono # 1 ma invece ottengo questo:
Poligono #: 0 01.238. Point: (295, 360)
Point: (422, 350)
Point: (315, 266)
Point: (295, 360)
poligono #: 1
Point: (295, 360)
Point (315, 266)
Point (295, 360)
Poligono #: 2
Point (143, 202)
Point (301, 203)
Point (222, 100)
Punto: (1 43, 202)
Cancellato (422, 350) ma ha anche lo strano effetto collaterale di sovrascrivere Poligono # 0 a quello che Poligono # 1 era prima dell'eliminazione del suo punto.
So che sto usando un puntatore o riferimento in modo errato nel mio metodo. Qualcuno può far notare quello che potrei fare che sta causando questo? Penso che sia perché il mio & closestPolygon è dichiarato come riferimento, ma ottengo errori di compilazione se provo a impostarlo come qualsiasi altra cosa.
Per inciso, e, auspicabilmente, con un valore educativo: lavorare con quadrato della distanza vi farà risparmiare costoso sqrt() chiama. Inoltre, pow() è piuttosto costoso; dal momento che utilizzi solo numeri interi, è meglio scrivere la tua funzione square(). – Thomas