/*! * @brief intersects a polygon with a map, adding any results to output map * * @param[out] resultMap output map (must be allocated) * @param[in] polygon to be intersected * @param[in] map intersected against * @param[in] lock to use when adding output polygons to result map * */ void OverlayOnePolygonWithMap(Polygon_map_t *resultMap, RPolygon *myPoly, Polygon_map_t *map2, tbb::spin_mutex *rMutex) { int r1, g1, b1, r2, g2, b2; int myr=0; int myg=0; int myb=0; int p1Area = myPoly->area(); for(unsigned int j=1; (j < map2->size()) && (p1Area > 0); j++) { RPolygon *p2 = (*map2)[j]; RPolygon *pnew; int newxMin, newxMax, newyMin, newyMax; myPoly->getColor(&r1, &g1, &b1); if(PolygonsOverlap(myPoly, p2, newxMin, newyMin, newxMax, newyMax)) { p2->getColor(&r2, &g2, &b2); myr = r1 + r2; myg = g1 + g2; myb = b1 + b2; pnew = RPolygon::alloc_RPolygon(newxMin, newyMin, newxMax, newyMax, myr, myg, myb); p1Area -= pnew->area(); // when all the area of the polygon is accounted for, we can quit. if(rMutex) { tbb::spin_mutex::scoped_lock lock(*rMutex); #if _DEBUG pnew->print(int(resultMap->size())); #endif resultMap->push_back(pnew); } else { #ifdef _DEBUG pnew->print(int(resultMap->size())); #endif resultMap->push_back(pnew); } } } }