template <typename PointT, typename NormalT> int pcl::RegionGrowing<PointT, NormalT>::growRegion (int initial_seed, int segment_number) { std::queue<int> seeds; seeds.push (initial_seed); point_labels_[initial_seed] = segment_number; int num_pts_in_segment = 1; while (!seeds.empty ()) { int curr_seed; curr_seed = seeds.front (); seeds.pop (); size_t i_nghbr = 0; while ( i_nghbr < neighbour_number_ && i_nghbr < point_neighbours_[curr_seed].size () ) { int index = point_neighbours_[curr_seed][i_nghbr]; if (point_labels_[index] != -1) { i_nghbr++; continue; } bool is_a_seed = false; bool belongs_to_segment = validatePoint (initial_seed, curr_seed, index, is_a_seed); if (belongs_to_segment == false) { i_nghbr++; continue; } point_labels_[index] = segment_number; num_pts_in_segment++; if (is_a_seed) { seeds.push (index); } i_nghbr++; }// next neighbour }// next seed return (num_pts_in_segment); }
void RegionGrowingHSV::growRegion(int initial_seed, int segment_number,std::vector<std::vector<int> >& Area_cluster) { std::queue<int> seeds; seeds.push (initial_seed); Area_cluster[segment_number].push_back(initial_seed); point_labels_[initial_seed] = segment_number; while (!seeds.empty ()) { int curr_seed; curr_seed = seeds.front (); seeds.pop (); size_t i_nghbr = 0; while ( i_nghbr < point_neighbours_[curr_seed].size () ) { int index = point_neighbours_[curr_seed][i_nghbr]; if (point_labels_[index] != -1) { i_nghbr++; continue; } bool is_a_seed = false; bool belongs_to_segment = validatePoint (initial_seed, curr_seed, index, is_a_seed,segment_number,Area_cluster); if (belongs_to_segment == false) { i_nghbr++; continue; } Area_cluster[segment_number].push_back(index); point_labels_[index] = segment_number; if (is_a_seed) { seeds.push (index); } i_nghbr++; }// next neighbour }// next seed }
int getMovesCommands(board Game, Piece piece, Move *movesTable, Point point) { int n = 1; Move result = moveBuilder(point, piece, Game); int board_Size = boardSize(Game); int x = point->x; int y = point->y; result->command = MOVE; for (int j=-1; j<=1; j++) { for (int i=-1; i<=1; i++) { if ( (j != 0 || i != 0) && validatePoint(makePoint(x + i, y + j), board_Size)) { Piece piece1 = pieceOnPosition(Game, x + i, y + j); if (piece1 != NULL && piece1->owner == piece->owner) { continue; } constructMoveCommand(x+i, y+j, result, Game); movesTable[n] = newMove(); copyMoveData(movesTable[n], result); n++; } } } free(result); return n; }
int getPossibleMoves(board Game, Piece piece, Move *movesTable, Point point) { int n = 0; movesTable[n] = newMove(); n++; if (piece->lastMove == currentTurn(Game)) { return n; } n = getMovesCommands(Game, piece, movesTable, point); Move result = moveBuilder(point, piece, Game); int board_Size = boardSize(Game); int x = point->x; int y = point->y; if (toupper(piece->letter) == 'C' && currentTurn(Game) - piece->lastMove >=3 ) { for (int j=-1; j<=1; j++) { for (int i=-1; i<=1; i++) { if ( (j != 0 || i != 0) && validatePoint(makePoint(x + i, y + j), board_Size) && isPositionFree(Game, x + i, y + j)) { result->xTo = x + i; result->yTo = y + j; result->isPieceRemoved= NULL; char letter = piece->letter; Piece pieceCreated = createNewPiece(piece->owner, letter, currentTurn(Game)); result->isPieceCreated = pieceCreated; result->command = PRODUCE_PEASANT; movesTable[n] = newMove(); copyMoveData(movesTable[n], result); n++; free(result->isPieceCreated); letter = matchingKnightLetter(letter); pieceCreated = createNewPiece(piece->owner, letter, currentTurn(Game) - 1); result->isPieceCreated = pieceCreated; result->command = PRODUCE_KNIGHT; movesTable[n] = newMove(); copyMoveData(movesTable[n], result); n++; free(result->isPieceCreated); } } } } free(result); return n; }