La simu multi-agents qui repeint une image, mais en c++ Boilerplate pompé ici : https://github.com/andrew-r-king/sfml-vscode-boilerplate
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

RepaintAgent.cpp 2.1KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. #include <Agents/Agent.hpp>
  2. #include <Environment/PictureEnvironment.hpp>
  3. RepaintAgent::RepaintAgent(PictureEnvironment* iEnvironment, int iDotSize, int iMoveSize) :
  4. Agent(iEnvironment, iDotSize, iMoveSize)
  5. {
  6. init();
  7. //Initalize list of possible movement vectors
  8. fMovements = std::vector<std::vector<int>>();
  9. fValidMovementIndexes = std::vector<int>();
  10. fCurrentMovement = std::vector<int>();
  11. for (int i = -fMoveSize; i <= fMoveSize; i++)
  12. {
  13. for (int j = -fMoveSize; j <= fMoveSize; j++)
  14. {
  15. fMovements.push_back({ i, j });
  16. }
  17. }
  18. }
  19. void RepaintAgent::init()
  20. {
  21. int vWidth = fEnvironment->getWidth();
  22. int vHeight = fEnvironment->getHeight();
  23. fXPos = (((double)rand() / RAND_MAX) * vWidth);
  24. fYPos = (((double)rand() / RAND_MAX) * vHeight);
  25. fColor = sf::Color(fEnvironment->getCellOriginal(fXPos, fYPos));
  26. }
  27. void RepaintAgent::move()
  28. {
  29. //Only move on cells having a sufficiently close color
  30. fValidMovementIndexes.clear();
  31. int tolerance = 5;
  32. for (int i = 0; i < static_cast<int>(fMovements.size()); i++)
  33. {
  34. sf::Uint32 va = fEnvironment->getCellOriginal(fXPos + fMovements.at(i).at(0), fYPos + fMovements.at(i).at(1));
  35. sf::Uint32 vb = (int)fColor.toInteger();
  36. bool vcomp =
  37. abs((int)(va >> 24) - (int)(vb >> 24)) <= tolerance && //R
  38. abs((int)(va << 8 >> 24) - (int)(vb << 8 >> 24)) <= tolerance && //G
  39. abs((int)(va << 16 >> 24) - (int)(vb << 16 >> 24)) <= tolerance; //B
  40. if (vcomp)
  41. {
  42. fValidMovementIndexes.push_back(i);
  43. }
  44. }
  45. if (fValidMovementIndexes.size() > 0)
  46. {
  47. int vRandIndex = rand() % static_cast<int>(fValidMovementIndexes.size());
  48. fCurrentMovement = fMovements.at(fValidMovementIndexes.at(vRandIndex));
  49. fXPos += fCurrentMovement.at(0);
  50. fYPos += fCurrentMovement.at(1);
  51. }
  52. else
  53. {
  54. init();
  55. }
  56. }
  57. void RepaintAgent::paint()
  58. {
  59. int vHalfBrush = fDotSize / 2;
  60. int vXLoopIndex = fXPos - vHalfBrush;
  61. int vYLoopIndex = fYPos - vHalfBrush;
  62. while (vXLoopIndex < (fXPos + vHalfBrush))
  63. {
  64. while (vYLoopIndex < fYPos + vHalfBrush)
  65. {
  66. fEnvironment->paint(vXLoopIndex, vYLoopIndex, fColor);
  67. vYLoopIndex++;
  68. }
  69. vYLoopIndex = fYPos - vHalfBrush;
  70. vXLoopIndex++;
  71. }
  72. }
  73. void RepaintAgent::loop()
  74. {
  75. move();
  76. this->paint();
  77. }