static void printRegion(const char* str, Region<T> region, bool newline = true) { printf("\n%s (offset: 0x%X, size: 0x%X, v: %s, e: %s)", str, region.Offset(), region.Size(), region.Valid() ? "true" : "false", region.Empty() ? "true" : "false"); if (newline) puts(""); }
Region* buildRegion(vector< vector<Point> >& cycles){ // first step create a single region from each cycle vector<pair<Region*, bool> > sc_regions; // single cycle regions for(unsigned int i=0;i<cycles.size(); i++){ vector<Point> cycle = cycles[i]; addRegion(sc_regions,cycle); } // split the vector into faces and holes vector<Region*> faces; vector<Region*> holes; for(unsigned int i=0;i<sc_regions.size();i++){ if(sc_regions[i].second){ faces.push_back(sc_regions[i].first); } else { holes.push_back(sc_regions[i].first); } } // subtract all holes from each face if nessecary vector<Region*> faces2; for(unsigned int i=0;i<faces.size();i++){ Region* face = faces[i]; for(unsigned int j=0; j< holes.size(); j++){ Region* hole = holes[j]; if(face->BoundingBox().Intersects(hole->BoundingBox())){ if(!topops::wcontains(hole,face)){ // may be an island Region* tmp = SetOp(*face,*hole,avlseg::difference_op); delete face; face = tmp; } } } if((face->Size())!=0){ faces2.push_back(face); } else { // face was removed completely delete face; } } // the hole regions are not longer needed, delete them for(unsigned int i=0;i<holes.size();i++){ delete holes[i]; } if(faces2.size()<1){ cerr << "no face found within the cycles" << endl; return new Region(0); } // build the union of all faces Region* reg = faces2[0]; for(unsigned int i=1;i<faces2.size();i++){ Region* face2 = faces2[i]; Region* tmp = SetOp(*reg, *face2, avlseg::union_op); delete reg; delete face2; reg = tmp; } return reg; }