int PathOrderOptimizer::getPolyStart(Point prev_point, int poly_idx) { switch (type) { case EZSeamType::BACK: return getClosestPointInPolygon(z_seam_pos, poly_idx); case EZSeamType::RANDOM: return getRandomPointInPolygon(poly_idx); case EZSeamType::SHORTEST: return getClosestPointInPolygon(prev_point, poly_idx); default: return getClosestPointInPolygon(prev_point, poly_idx); } }
void PathOrderOptimizer::optimize() { bool* picked=new bool[polygons.size()]; // bool picked[polygons.size()]; memset(picked, false, sizeof(bool) * polygons.size());/// initialized as falses for(unsigned int i_polygon=0 ; i_polygon<polygons.size() ; i_polygon++) /// find closest point to initial starting point within each polygon +initialize picked { int best = -1; float bestDist = std::numeric_limits<float>::infinity(); PolygonRef poly = polygons[i_polygon]; for(unsigned int i_point=0; i_point<poly.size(); i_point++) /// get closest point in polygon { float dist = vSize2f(poly[i_point] - startPoint); if (dist < bestDist) { best = i_point; bestDist = dist; } } polyStart.push_back(best); //picked.push_back(false); /// initialize all picked values as false assert(poly.size() != 2); } Point prev_point = startPoint; for(unsigned int i_polygon=0 ; i_polygon<polygons.size() ; i_polygon++) /// actual path order optimizer { int best = -1; float bestDist = std::numeric_limits<float>::infinity(); for(unsigned int i_polygon=0 ; i_polygon<polygons.size() ; i_polygon++) { if (picked[i_polygon] || polygons[i_polygon].size() < 1) /// skip single-point-polygons continue; assert (polygons[i_polygon].size() != 2); float dist = vSize2f(polygons[i_polygon][polyStart[i_polygon]] - prev_point); if (dist < bestDist) { best = i_polygon; bestDist = dist; } } if (best > -1) /// should always be true; we should have been able to identify the best next polygon { assert(polygons[best].size() != 2); prev_point = polygons[best][polyStart[best]]; picked[best] = true; polyOrder.push_back(best); } else logError("Failed to find next closest polygon.\n"); } prev_point = startPoint; for(unsigned int n=0; n<polyOrder.size(); n++) /// decide final starting points in each polygon { int i_polygon = polyOrder[n]; int best = getClosestPointInPolygon(prev_point, i_polygon); polyStart[i_polygon] = best; prev_point = polygons[i_polygon][best]; } }