// Меняем местами положение кубов (в том числе и в массиве целей)
void TEnkiEnvironment::swapCubesForColors(double r1, double g1, double b1, double r2, double g2, double b2) {
  // Находим кубы в массиве объектов ENKI по их цвету, а затем перекрашиваем их
  std::set<Enki::PhysicalObject *>objects = world->objects;
  std::set<Enki::PhysicalObject *>::iterator someObject;
  for (someObject=objects.begin(); someObject!=objects.end(); ++someObject) {
    Enki::PhysicalObject * actualObject = *someObject;
    Enki::Color color;
    color = actualObject->getColor();
    if ((color.components[0] == r1) && (color.components[1] == g1) && (color.components[2] == b1)) {
      color.components[0] = r2;
      color.components[1] = g2;
      color.components[2] = b2;
      actualObject->setColor(color);
      cout << "found first cube" << std::endl;
    } else if ((color.components[0] == r2) && (color.components[1] == g2) && (color.components[2] == b2)) {
      color.components[0] = r1;
      color.components[1] = g1;
      color.components[2] = b1;
      actualObject->setColor(color);
      cout << "found second cube" << std::endl;
    }
  }
  
  // Находим кубы в массиве объектов среды (который служит для определения достижения целей) и меняем их в нем местами
  /*int firstIndexToSwap = 0;
  int secondIndexToSwap = 0;
  for (int i=0; i<objectsArray.size(); i++) {
    TEnkiObject someEnkiObject = objectsArray[i];
    if ((someEnkiObject.color[0]/255.0 == r1) && (someEnkiObject.color[1]/255.0 == g1) && (someEnkiObject.color[2]/255.0 == b1)) {
      firstIndexToSwap = i;
    } else if ((someEnkiObject.color[0]/255.0 == r2) && (someEnkiObject.color[1]/255.0 == g2) && (someEnkiObject.color[2]/255.0 == b2)) {
      secondIndexToSwap = i;
    }
  }
  
  TEnkiObject storedObject = objectsArray.at(firstIndexToSwap);
  objectsArray.at(firstIndexToSwap) = objectsArray.at(secondIndexToSwap);
  objectsArray.at(secondIndexToSwap) = storedObject;*/
  
}
void TEnkiEnvironment::makeGnuplotScriptAndRunIt(std::string graphFilename, double xmin, double xmax, double ymin, double ymax) {
  // Чтобы замкнуть линии в гнуплоте
  std::set<Enki::PhysicalObject *>objects = world->objects;
  std::set<Enki::PhysicalObject *>::iterator someObject;
  for (someObject=objects.begin(); someObject!=objects.end(); ++someObject) {
    Enki::PhysicalObject * actualObject = *someObject;
	if (actualObject != ePuckBot) {
		ofstream objectsFile;
		stringstream buf;
		buf << "C:/enki-log-files/gnuplotObjects" << actualObject->objectNumber << ".txt";
		objectsFile.open(buf.str().c_str());
		objectsFile << actualObject->pos.x-cubeSize/2.0 << "\t" << actualObject->pos.y-cubeSize/2.0 << std::endl;
		objectsFile << actualObject->pos.x-cubeSize/2.0 << "\t" << actualObject->pos.y+cubeSize/2.0 << std::endl;
		objectsFile << actualObject->pos.x+cubeSize/2.0 << "\t" << actualObject->pos.y+cubeSize/2.0 << std::endl;
		objectsFile << actualObject->pos.x+cubeSize/2.0 << "\t" << actualObject->pos.y-cubeSize/2.0 << std::endl;
		objectsFile << actualObject->pos.x-cubeSize/2.0 << "\t" << actualObject->pos.y-cubeSize/2.0 << std::endl;
		objectsFile.close();
    }
  }

  ofstream gnuplotGraphFile;
  gnuplotGraphFile.open((graphFilename).c_str());
  gnuplotGraphFile << "set terminal pdf size 10cm," << 10*(ymax-ymin)/(xmax-xmin) << "cm font 'Times-New-Roman,5'" << std::endl;
  gnuplotGraphFile << "set output '" << graphFilename << ".pdf'" << std::endl;
  gnuplotGraphFile << "set xtics " << static_cast<int>(xmin) <<",50," << static_cast<int>(xmax) << std::endl;
  gnuplotGraphFile << "set ytics " << static_cast<int>(ymin) <<",50," << static_cast<int>(ymax) << std::endl;
  gnuplotGraphFile << "set mxtics 5\nset mytics 5" << std::endl;
  gnuplotGraphFile << "set grid xtics ytics mytics mxtics lt 1 lw 1 linecolor rgb \"gray\"" << std::endl;
  gnuplotGraphFile << "set palette defined ( 0 \"#660099\", 1 \"#0000CC\", 2 \"#3399FF\", 3 \"#00CC00\", 4 \"#FFFF33\", 5 \"#FF6600\", 6 \"#CC0000\" )" << std::endl;
  gnuplotGraphFile << "unset colorbox" << std::endl;
  std::string objectsColorsStrings[10];
  for (someObject=objects.begin(); someObject!=objects.end(); ++someObject) {
    Enki::PhysicalObject * actualObject = *someObject;
    if (actualObject->objectNumber >= 0) {
      const Enki::Color objectColor = actualObject->getColor();
	  std::string rColor = "00";
	  if (objectColor.components[0] == 1.0) {
		  rColor = "FF";
	  }
	  std::string gColor = "00";
	  if (objectColor.components[1] == 1.0) {
		  gColor = "FF";
	  }
	  std::string bColor = "00";
	  if (objectColor.components[2] == 1.0) {
		  bColor = "FF";
	  }
	  objectsColorsStrings[actualObject->objectNumber] = "#" + rColor + gColor + bColor;
      /*if ((objectColor.components[0] == 1.0) && (objectColor.components[1] == 0.0) && (objectColor.components[2] == 0.0)) {
        objectsColorsStrings[actualObject->objectNumber] = "red";
      } else if ((objectColor.components[0] == 1.0) && (objectColor.components[1] == 1.0) && (objectColor.components[2] == 0.0)) {
        objectsColorsStrings[actualObject->objectNumber] = "yellow";
      } else if ((objectColor.components[0] == 0.0) && (objectColor.components[1] == 1.0) && (objectColor.components[2] == 0.0)) {
        objectsColorsStrings[actualObject->objectNumber] = "green";
      } else if ((objectColor.components[0] == 0.0) && (objectColor.components[1] == 0.0) && (objectColor.components[2] == 1.0)) {
        objectsColorsStrings[actualObject->objectNumber] = "blue";
      }*/
    }
  }
  gnuplotGraphFile << "plot " << "[" << static_cast<int>(xmin) << ":" << static_cast<int>(xmax) << "] "
                              << "[" << static_cast<int>(ymin) << ":" << static_cast<int>(ymax) << "] "
                              << "'" << gnuplotOutputString << "'" << " u 1:2:(0.2):3 with circles palette notitle, ";
  for (int i = 0; i < 10; i++) {
	  if (objectsColorsStrings[i].length()) {
		if (i>=1) {
		  gnuplotGraphFile << ", ";
		}
		gnuplotGraphFile << "'C:/enki-log-files/gnuplotObjects" << i << ".txt' with filledcurves notitle linecolor rgb \"" << objectsColorsStrings[i].c_str() << "\"";
	  } else {
		  break;
	  }
  }
  gnuplotGraphFile << std::endl;
  /*<< "'C:/enki-log-files/gnuplotObjects1.txt' with filledcurves notitle linecolor rgb \"" << objectsColorsStrings[0] << "\", "
  << "'C:/enki-log-files/gnuplotObjects2.txt' with filledcurves notitle linecolor rgb \"" << objectsColorsStrings[1] << "\", "
  << "'C:/enki-log-files/gnuplotObjects3.txt' with filledcurves notitle linecolor rgb \"" << objectsColorsStrings[2] << "\", "
  << "'C:/enki-log-files/gnuplotObjects4.txt' with filledcurves notitle linecolor rgb \"" << objectsColorsStrings[3] << "\", " << std::endl;*/
  //gnuplotGraphFile << "__EOF" << std::endl;
  gnuplotGraphFile.close();
  //system(("chmod +x "+graphFilename+".sh").c_str());
  system(("gnuplot "+graphFilename).c_str());
}