void Comb::getBasicCombingPath(unsigned int poly_idx, std::vector<Point>& pointList) { pointList.push_back(transformation_matrix.unapply(Point(minX[poly_idx] - MM2INT(0.2), transformed_startPoint.Y))); if ( (minIdx[poly_idx] - maxIdx[poly_idx] + boundary[poly_idx].size()) % boundary[poly_idx].size() > (maxIdx[poly_idx] - minIdx[poly_idx] + boundary[poly_idx].size()) % boundary[poly_idx].size()) { // follow the path in the same direction as the winding order of the boundary polygon for(unsigned int point_idx = minIdx[poly_idx]; point_idx != maxIdx[poly_idx]; point_idx = (point_idx < boundary[poly_idx].size() - 1) ? (point_idx + 1) : (0)) { pointList.push_back(getBoundaryPointWithOffset(poly_idx, point_idx)); } } else { if (minIdx[poly_idx] == 0) minIdx[poly_idx] = boundary[poly_idx].size() - 1; else minIdx[poly_idx]--; if (maxIdx[poly_idx] == 0) maxIdx[poly_idx] = boundary[poly_idx].size() - 1; else maxIdx[poly_idx]--; for(unsigned int i=minIdx[poly_idx]; i != maxIdx[poly_idx]; i = (i > 0) ? (i - 1) : (boundary[poly_idx].size() - 1)) { pointList.push_back(getBoundaryPointWithOffset(poly_idx, i)); } } pointList.push_back(transformation_matrix.unapply(Point(maxX[poly_idx] + MM2INT(0.2), transformed_startPoint.Y))); }
void LinePolygonsCrossings::getBasicCombingPath(PolyCrossings polyCrossings, CombPath& combPath) { PolygonRef poly = boundary[polyCrossings.poly_idx]; combPath.push_back(transformation_matrix.unapply(Point(polyCrossings.min.x, transformed_startPoint.Y))); if ( ( polyCrossings.max.point_idx - polyCrossings.min.point_idx + poly.size() ) % poly.size() < poly.size() / 2 ) { // follow the path in the same direction as the winding order of the boundary polygon for(unsigned int point_idx = polyCrossings.min.point_idx ; point_idx != polyCrossings.max.point_idx ; point_idx = (point_idx < poly.size() - 1) ? (point_idx + 1) : (0)) { combPath.push_back(getBoundaryPointWithOffset(poly, point_idx, dist_to_move_boundary_point_outside)); } } else { // follow the path in the opposite direction of the winding order of the boundary polygon unsigned int min_idx = (polyCrossings.min.point_idx == 0)? poly.size() - 1: polyCrossings.min.point_idx - 1; unsigned int max_idx = (polyCrossings.max.point_idx == 0)? poly.size() - 1: polyCrossings.max.point_idx - 1; for(unsigned int point_idx = min_idx; point_idx != max_idx; point_idx = (point_idx > 0) ? (point_idx - 1) : (poly.size() - 1)) { combPath.push_back(getBoundaryPointWithOffset(poly, point_idx, dist_to_move_boundary_point_outside)); } } combPath.push_back(transformation_matrix.unapply(Point(polyCrossings.max.x, transformed_startPoint.Y))); }