Opencv - Conway's Game Of Life(Gosper glider gun)
阿新 • • 發佈:2020-08-24
程式碼:
#include <iostream> #include <vector> #include "opencv2/opencv.hpp" using namespace cv; using std::string; using std::vector; using std::pair; vector<pair<int, int>> points{ {-1, -1}, {-1, 0}, {-1, 1}, {0, -1}, {0, 1}, {1, -1}, {1, 0}, {1, 1} }; void gameOfLife(Mat& board) { Mat copy = board; for (int i = 0; i < copy.size().width; i++) { for (int j = 0; j < copy.size().height; j++) { int count = 0; for (auto p : points) { int x = i + p.first, y = j + p.second; if (x < 0 || x >= copy.size().width || y < 0 || y >= copy.size().height) continue; count += (int)copy.at<float>(x, y); } if ((int)copy.at<float>(i, j) == 1) { if (count < 2) board.at<float>(i, j) = 0; else if (count > 3) board.at<float>(i, j) = 0; } else { if (count == 3) board.at<float>(i, j) = 1; } } } } int main() { Mat b = Mat::zeros(Size(64, 64), CV_32FC1); b.at<float>(9, 13) = 1; b.at<float>(9, 14) = 1; b.at<float>(10, 12) = 1; b.at<float>(10, 16) = 1; b.at<float>(11, 11) = 1; b.at<float>(11, 17) = 1; b.at<float>(12, 11) = 1; b.at<float>(12, 15) = 1; b.at<float>(12, 17) = 1; b.at<float>(12, 18) = 1; b.at<float>(13, 11) = 1; b.at<float>(13, 17) = 1; b.at<float>(14, 12) = 1; b.at<float>(14, 16) = 1; b.at<float>(15, 13) = 1; b.at<float>(15, 14) = 1; b.at<float>(7, 25) = 1; b.at<float>(8, 23) = 1; b.at<float>(8, 25) = 1; b.at<float>(9, 21) = 1; b.at<float>(9, 22) = 1; b.at<float>(10, 21) = 1; b.at<float>(10, 22) = 1; b.at<float>(11, 21) = 1; b.at<float>(11, 22) = 1; b.at<float>(12, 23) = 1; b.at<float>(12, 25) = 1; b.at<float>(13, 25) = 1; b.at<float>(9, 35) = 1; b.at<float>(9, 36) = 1; b.at<float>(10, 35) = 1; b.at<float>(10, 36) = 1; b.at<float>(11, 1) = 1; b.at<float>(11, 2) = 1; b.at<float>(12, 1) = 1; b.at<float>(12, 2) = 1; for (;;) { gameOfLife(b); Mat f; resize(b, f, Size(600, 600)); imshow("tv", f); if (waitKey(60) == 27) break; } return 0; }