Última pregunta para esta noche, lo prometo. Estos indicadores me están causando un gran dolor de cabeza.¿Cómo estoy sobrescribiendo accidentalmente al hacer referencia a estos punteros?
que tienen un std :: lista <Point
> llamado polígono y un std :: lista de polígonos define como:
typedef std::list<Point> Polygon;
typedef std::list<Polygon> PolygonList;
// List of all our polygons
PolygonList polygonList;
creé el método siguiente para intentar eliminar el punto más cercano de una (x, y), comprobando todos mis polígonos dentro de mi polygonList.
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();
}
Sin embargo, en algún lugar que tienen una variable puntero o una referencia mí meter la pata. Este código se compila pero actúa de una manera muy extraña.
He escrito una declaración de depuración y Digamos que tengo 3 polígonos en mi lista de polígonos de este modo:
Polígono #: 0
Point: (448, 43)
Point: (469 , 177)
Point: (374, 123)
Polygon #: 1
Point: (295, 360)
Point: (422, 350)
Point: (315, 266)
Point: (295, 360)
Polygon #: 2
Point: (143, 202)
Point: (301, 203)
Point: (222, 100)
Point: (143, 202)
Ahora, digamos que tratar de utilizar la función de eliminación dándole un x/y cerca del punto 422, 350 el resultado deseado sería simplemente borrar ese punto (422, 350) de Polígono # 1, pero en lugar de Entiendo esto:
Polygon #: 0
Point: (295, 360)
Point: (422, 350)
Point: (315, 266)
Point: (295, 360)
Polygon #: 1
Point: (295, 360)
Point: (315, 266)
Point: (295, 360)
Polygon #: 2
Point: (143, 202)
Point: (301, 203)
Point: (222, 100)
Punto: (1 43, 202)
Sí eliminó (422, 350) pero también tiene el extraño efecto secundario de sobrescribir el Polígono # 0 a lo que era el Polígono # 1 antes de la eliminación de su punto.
Sé que estoy usando un puntero o una referencia incorrectamente en mi método. ¿Puede alguien señalar lo que podría estar haciendo que está causando esto? Creo que es porque mi &Polygon más cercano está declarado como referencia, pero obtengo errores de compilación si intento establecerlo como cualquier otra cosa.
Como acotación al margen, y es de esperar con un poco de valor educativo: trabajar con el cuadrado de la distancia que le ahorrará sqrt caro() llama. Además, pow() es bastante caro; ya que solo está usando números enteros, es mejor que escriba su propia función square(). – Thomas