// Devuelve el código Greenlee de la vecindad de un pixel uchar vect::codVecindad(Mat &img, Point pun) { uchar vecinos[8]; vecindad(img, pun, vecinos); return 128 * vecinos[0] + vecinos[1] + 2 * vecinos[2] + 4 * vecinos[3] + 8 * vecinos[4] + 16 * vecinos[5] + 32 * vecinos[6] + 64 * vecinos[7]; }
// Recorre un trazo desde pun y almacena sus puntos en trazo // No removemos puntos colineales para mejorar los resultados del Ramer-Douglas-Peuker void vect::recorrerTrazo(Mat &imgBase, Point pun, vector<Point2f> &trazo, bool trazoCerrado) { uchar cod; Point2f punIni; trazo.clear(); // Validamos el trazo a recorrer if (imgBase.at<uchar>(pun) == 255) return; if (codVecindad(imgBase, pun) == 0) return; punIni = pun; trazo.push_back(punIni); // Si es trazo cerrado, borramos 1 pixel e iniciamos desde el siguiente pixel detectado if (trazoCerrado) { uchar i = 0; uchar vecinos[8]; vecindad(imgBase, pun, vecinos); imgBase.at<uchar>(pun) = 255; while (vecinos[i] != 1) i++; moverPunto(pun, i); } while (imgBase.at<uchar>(pun) != 255) { cod = codVecindad(imgBase, pun); imgBase.at<uchar>(pun) = 255; // punto recorrido se borra if (cod != 0) { trazo.push_back(pun); moverPuntoCod(pun, cod); } else { if (trazo.size() > 0) trazo.push_back(pun); } } // Si es trazo cerrado, unir los últimos 2 puntos if (trazoCerrado) trazo.push_back(punIni); }
void Matriz::iniciar (Juego &game) { /*Inicia matriz de juego, Modifica el atributo Cuadrado.mina * de acuerdo al atributo Juego.prob de manera aleatoria * Notese el uso previo de la funcion vector.resize para modificar el tamaño * del vector de vectores y el uso del iterador. */ _matriz.resize (_fil); for (std::vector<std::vector<Cuadrado> >::iterator it = _matriz.begin(); it != _matriz.end(); ++it) { it->resize (_col); } time_t t; for (int i=0; i<_fil;i++) { for (int j=0; j<_col; j++) { srand(time_seed()+i*i-j); float x = static_cast <float> (rand()) / static_cast <float> (RAND_MAX); if (x < game.get_prob() ) { _matriz[i][j].set_mina(true); game.set_cuantas_minas( game.get_cuantas_minas() +1); } } } vecindad(); }