12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- #include <Agents/Agent.hpp>
- #include <Environment/PictureEnvironment.hpp>
-
- RepaintAgent::RepaintAgent(PictureEnvironment* iEnvironment, int iDotSize, int iMoveSize) :
- Agent(iEnvironment, iDotSize, iMoveSize)
- {
- init();
-
- //Initalize list of possible movement vectors
- fMovements = std::vector<std::vector<int>>();
- fValidMovementIndexes = std::vector<int>();
- fCurrentMovement = std::vector<int>();
- 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<int>(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<int>(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();
- }
|