void ResamplingSampler::sampleValues(Sample& sample, const Mat& image) { double sizeFactor = realDistribution(generator) * (static_cast<double>(maxSize) / static_cast<double>(minSize) - 1.0) + 1.0; int size = cvRound(sizeFactor * minSize); int halfSize = size / 2; sample.setSize(size); sample.setX(intDistribution(generator, image.cols - size) + halfSize); sample.setY(intDistribution(generator, image.rows - size) + halfSize); sample.setVx(0); sample.setVy(0); sample.setVSize(1); }
/* * metoda generujaca dane. */ void DataGenerator::generateData() { unsigned int generate = 0; //wskaznik zapelnienia. Dla kazdego pojemnika bedzie obliczany oddzielnie float degree = 0; //loteria zaokraglenia liczby. float lottery = 0; //tablica z przedzialami do rodzielania kolorow wg rozkladu normalnego. float* colorsInterval = new float[colorsNumber + 1]; //rozk³ad równomierny do pojemnoœci pojemników std::uniform_int_distribution<int> intDistribution(static_cast<int>(minCapacity), static_cast<int>(maxCapacity)); //rozk³ad równomierny do kolorów pojemników std::uniform_real_distribution<double> realDistribution(0.0, 1.0); //Aktualnie wylosowany kolor float color; //Mapa z mo¿liwoœci¹ wstawiania konkretnych kolorów. std::map<unsigned int, unsigned int > colorsMap; for (size_t i = 0; i < static_cast<size_t>(colorsNumber); i++) { colorsMap.insert({ i, numberOfContainers }); } //Inicjalizacja przedzia³ów dla rozk³adu normalnego colorsInterval[colorsNumber] = 1.0; for (size_t i = 0; i < static_cast<size_t>(colorsNumber); i++) { colorsInterval[i] = static_cast<float>(i) / static_cast<float>(colorsNumber); } //generowanie pojemnosci dla pojemnikow for (size_t i = 0; i < numberOfContainers; i++) { containersCapacity.push_back(intDistribution(engine)); } //zapelnianie includingLista pustymi vectorami... for (size_t i = 0; i < numberOfContainers; i++) { includingList.push_back(std::vector<unsigned int>()); } //zapelnianie wszystkich pojemników. for (size_t i = 0; i < static_cast<size_t>(includingList.size()); i++) {//jesli generowane dane musza byc takie jak w opisie zadania tzn zadnego koloru nie moze byc wiecej niz n to musi zostac to co odkomentowane. //w innym przypadku ³adniejsze jest to co jest zakomentowane i tego nalezy sie trzymac. //degree = containerscapacity[i] * fillingdegree; //for (size_t k = 0; k < static_cast<size_t>(degree) ; k++) //{ // color = realdistribution(engine); // for (size_t m = 0; m < static_cast<size_t>(colorsnumber + 1); m++) // { // if (color < colorsinterval[m]) // { // includinglist[i].push_back(m-1); // break; // } // } //} bool flag = false; int counter = 0; degree = containersCapacity[i] * fillingDegree; //loteria dotyczaca zapelniania kube³ka. lottery = realDistribution(engine); if (lottery <= 0.33) { degree--; } else if (lottery <= 0.66) { degree++; } while (true) { if (counter >= static_cast<int>(degree)) { counter = 0; break; } color = realDistribution(engine); for (size_t m = 0; m < static_cast<size_t>(colorsNumber + 1); m++) { if (color < colorsInterval[m]) { //sprawdzenie czy mozna jeszcze wstawiac if (colorsMap[m - 1]) { includingList[i].push_back(m - 1); colorsMap[m - 1]--; flag = true; } else { flag = false; } break; } } if (flag) { counter++; } } } }