| | |
| | | List<PathSegment> zigZag = generateFixedZigZag(workArea, obstacles, bestAngle, width, currentPos); |
| | | finalPath.addAll(zigZag); |
| | | |
| | | // 格式化坐标:保留两位小数 |
| | | for (PathSegment segment : finalPath) { |
| | | segment.start.x = Math.round(segment.start.x * 100.0) / 100.0; |
| | | segment.start.y = Math.round(segment.start.y * 100.0) / 100.0; |
| | | segment.end.x = Math.round(segment.end.x * 100.0) / 100.0; |
| | | segment.end.y = Math.round(segment.end.y * 100.0) / 100.0; |
| | | } |
| | | |
| | | return finalPath; |
| | | } |
| | | |
| | |
| | | private static List<Obstacle> parseObstacles(String obsStr, double margin) { |
| | | List<Obstacle> list = new ArrayList<>(); |
| | | if (obsStr == null || obsStr.isEmpty()) return list; |
| | | for (String part : obsStr.split("\\$")) { |
| | | |
| | | // 兼容两种格式: |
| | | // 1. 括号分隔:(x1,y1;x2,y2)(x3,y3;x4,y4) |
| | | // 2. $分隔:x1,y1;x2,y2$x3,y3;x4,y4 |
| | | |
| | | String[] groups; |
| | | if (obsStr.contains("(") && obsStr.contains(")")) { |
| | | // 处理括号格式 |
| | | // 移除所有空白字符 |
| | | String cleanStr = obsStr.replaceAll("\\s+", ""); |
| | | // 提取括号内的内容 |
| | | List<String> parts = new ArrayList<>(); |
| | | java.util.regex.Matcher m = java.util.regex.Pattern.compile("\\(([^)]+)\\)").matcher(cleanStr); |
| | | while (m.find()) { |
| | | parts.add(m.group(1)); |
| | | } |
| | | groups = parts.toArray(new String[0]); |
| | | } else { |
| | | // 处理$分隔格式 |
| | | groups = obsStr.split("\\$"); |
| | | } |
| | | |
| | | for (String part : groups) { |
| | | if (part == null || part.trim().isEmpty()) continue; |
| | | List<Point> pts = parseCoords(part); |
| | | if (pts.size() == 2) { |
| | | double r = dist(pts.get(0), pts.get(1)); |