#include #include RepaintAgent::RepaintAgent(PictureEnvironment* iEnvironment, int iDotSize, int iMoveSize) : Agent(iEnvironment, iDotSize, iMoveSize) { init(); //Initalize list of possible movement vectors fMovements = std::vector>(); fValidMovementIndexes = std::vector(); fCurrentMovement = std::vector(); for (int i = -fMoveSize; i <= fMoveSize; i++) { for (int j = -fMoveSize; j <= fMoveSize; j++) { fMovements.push_back({ i, j }); } } } void RepaintAgent::init() { int vWidth = fEnvironment->getWidth(); int vHeight = fEnvironment->getHeight(); fXPos = (((double)rand() / RAND_MAX) * vWidth); fYPos = (((double)rand() / RAND_MAX) * vHeight); fColor = sf::Color(fEnvironment->getCellOriginal(fXPos, fYPos)); } void RepaintAgent::move() { //Only move on cells having a sufficiently close color fValidMovementIndexes.clear(); int tolerance = 5; for (int i = 0; i < static_cast(fMovements.size()); i++) { sf::Uint32 va = fEnvironment->getCellOriginal(fXPos + fMovements.at(i).at(0), fYPos + fMovements.at(i).at(1)); sf::Uint32 vb = (int)fColor.toInteger(); bool vcomp = abs((int)(va >> 24) - (int)(vb >> 24)) <= tolerance && //R abs((int)(va << 8 >> 24) - (int)(vb << 8 >> 24)) <= tolerance && //G abs((int)(va << 16 >> 24) - (int)(vb << 16 >> 24)) <= tolerance; //B if (vcomp) { fValidMovementIndexes.push_back(i); } } if (fValidMovementIndexes.size() > 0) { int vRandIndex = rand() % static_cast(fValidMovementIndexes.size()); fCurrentMovement = fMovements.at(fValidMovementIndexes.at(vRandIndex)); fXPos += fCurrentMovement.at(0); fYPos += fCurrentMovement.at(1); } else { init(); } } void RepaintAgent::paint() { int vHalfBrush = fDotSize / 2; int vXLoopIndex = fXPos - vHalfBrush; int vYLoopIndex = fYPos - vHalfBrush; while (vXLoopIndex < (fXPos + vHalfBrush)) { while (vYLoopIndex < fYPos + vHalfBrush) { fEnvironment->paint(vXLoopIndex, vYLoopIndex, fColor); vYLoopIndex++; } vYLoopIndex = fYPos - vHalfBrush; vXLoopIndex++; } } void RepaintAgent::loop() { move(); this->paint(); }