Ejemplo n.º 1
0
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);

}
Ejemplo n.º 2
0
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();
  }
}