void Polygon::generateRegions() { std::cout << "generateRegions()" << std::endl; //(1) Find unknown elements //(2) expand with known neighbours //(3) find the convex hull //(4) create a polygonSegment //(5) add boundaryElements //Find unknown elements std::set<Element*> not_scanned; for(int i=0;i<nx;i++) { for(int j=0;j<ny;j++) { if(matrix[i][j]->getStatus() == 0) { not_scanned.insert(matrix[i][j]); //matrix[i][j]->setStatus(2); } } } std::cout << not_scanned.size() << " unscanned elements found" << std::endl; std::vector<std::set<Element*>> clusters; while(true) { if(not_scanned.empty()) break; std::set<Element*> cluster; cluster.insert(*not_scanned.begin()); not_scanned.erase(not_scanned.begin()); //std::cout << "cluster size:" << cluster.size() << std::endl; for(std::set<Element*>::iterator it=cluster.begin(); it!=cluster.end(); ++it) { for(int i=0;i< (*it)->getNeighbours()->size();i++) { if(not_scanned.find((*it)->getNeighbours()->at(i)) != not_scanned.end()) { cluster.insert((*it)->getNeighbours()->at(i)); not_scanned.erase(not_scanned.find((*it)->getNeighbours()->at(i))); //TODO kan göras bättre } } } clusters.push_back(cluster); } std::cout << clusters.size() << " new regions will be created" << std::endl; //expand with known neighbours for(int i=0;i<clusters.size();i++) { if(clusters.at(i).size() < 2) continue; std::set<Element*> neighbours; for(std::set<Element*>::iterator it=clusters.at(i).begin(); it!=clusters.at(i).end(); ++it) { for(int j=0;j<(*it)->getNeighbours()->size();j++) { if(clusters.at(i).find((*it)->getNeighbours()->at(j)) == clusters.at(i).end() && (*it)->getNeighbours()->at(j)->getStatus() == 1) { neighbours.insert((*it)->getNeighbours()->at(j)); } } } for(std::set<Element*>::iterator it=neighbours.begin(); it!=neighbours.end(); ++it) { clusters.at(i).insert(*it); } } for(int i=0;i<clusters.size();i++) { //TODO create a polygonSegment PolygonSegment* newRegion = createSegmentFromElements(clusters.at(i)); //skicka pekare/ref om det går för långsamt std::cout << "new region created" << std::endl; //TODO add boundaryElements if(newRegion != NULL) { addBoundaryElements(newRegion); polygonSegments.push_back(newRegion); } } //DEBUG //GUI->update(); //usleep(10000000); }
void Polygon::initialize() { std::cout << "Polygon initialize" << std::endl; if(!localSet) return; std::cout << "calculating min,max for x and y" << std::endl; maxX = std::numeric_limits<double>::min(); minX = std::numeric_limits<double>::max(); maxY = std::numeric_limits<double>::min(); minY = std::numeric_limits<double>::max(); for(int i=0;i<xPoints->size();i++) { double x = xPoints->at(i); double y = yPoints->at(i); if(x<minX) minX = x; if(x>maxX) maxX = x; if(y<minY) minY = y; if(y>maxY) maxY = y; } std::cout << "maxX: " << maxX << ", minX: " << minX << "\nmaxY: " << maxY << ", minY: " << minY << std::endl; //calculate grid size nx = (maxX-minX)/delta; ny = (maxY-minY)/delta; nx+=1; //compensate for truncation error ny+=1; std::cout << "delta=" << delta << "-> grid size is: " << nx << "x" << ny << std::endl; //(1) create a polygon-segment object for the entire polygon (searchCell in kexet) //create new vectors for the polygonsegment std::vector<double>* xPoints_copy = new std::vector<double>(); std::vector<double>* yPoints_copy = new std::vector<double>(); for(int i=0;i<xPoints->size();i++) { xPoints_copy->push_back(xPoints->at(i)); yPoints_copy->push_back(yPoints->at(i)); } polygonSegments.push_back(new PolygonSegment(xPoints_copy,yPoints_copy)); //TODO (2) (check if the segment is convex, if not it should be triangulated) kanske senare iaf //nx = 3; //ny = 2; // Create the 2d array: matrix = new Element**[nx]; for (int i = 0; i < nx; ++i) { matrix[i] = new Element*[ny]; } // Create the Elements: for (int i = 0; i < nx; ++i) { for (int j = 0; j < ny; ++j) { matrix[i][j] = new Element(minX + delta*i, minY + delta*j,i,j); bool inside = false; for(int k=0; k<polygonSegments.size();k++) { if(polygonSegments.at(k)->contains(minX + delta*i, minY + delta*j)) { inside = true; break; } } if(inside) matrix[i][j]->setStatus(0); else matrix[i][j]->setStatus(5); } } std::cout << nx*ny << " elements created" << std::endl; //add neighbours to elements that are inside the polygon for (int i = 0; i < nx; ++i) { for (int j = 0; j < ny; ++j) { int x[] = {i , i+1, i+1 ,i+1 ,i ,i-1 ,i-1 ,i-1}; int y[] = {j-1 , j-1, j ,j+1 ,j+1 ,j+1 ,j ,j-1}; for(int k=0;k<8;k++) { int ix = x[k]; int iy = y[k]; if(ix>=0 && ix<nx && iy>=0 && iy<ny) { matrix[i][j]->addNeighBour(matrix[ix][iy]); } } } } //TODO (add elements-pointers to the polygon segment objects) for(int i=0;i<polygonSegments.size();i++) addBoundaryElements(polygonSegments.at(i)); /* std::vector<PolygonSegment*>* tri = triangulateRegion(polygonSegments.at(0)); //removeRegion(polygonSegments.at(0)); if(tri != NULL) { for(int i=0;i<tri->size();i++) polygonSegments.push_back(tri->at(i)); } */ if(showGUI) { GUI = new PathView();//a1,a2 std::vector<PolygonSegment*>* pointer; pointer = &polygonSegments; GUI->start(500,std::max(maxX,maxY),matrix,nx,ny,pointer); GUI->drawPolygon(getXBoundaries(),getYBoundaries()); GUI->update(); } }