| | |
| | | return ""; |
| | | } |
| | | StringBuilder sb = new StringBuilder(); |
| | | AoxinglujingNoObstacle.Point last = null; |
| | | for (AoxinglujingNoObstacle.PathSegment segment : segments) { |
| | | // 只添加割草工作段,跳过过渡段 |
| | | if (segment.isMowing) { |
| | | // 如果起点与上一个终点不同,添加起点 |
| | | if (last == null || !equals2D(last, segment.start)) { |
| | | appendPoint(sb, segment.start); |
| | | } |
| | | // 添加终点 |
| | | appendPoint(sb, segment.end); |
| | | last = segment.end; |
| | | AoxinglujingNoObstacle.Point lastEnd = null; |
| | | boolean firstWritten = false; |
| | | for (AoxinglujingNoObstacle.PathSegment s : segments) { |
| | | if (!firstWritten) { |
| | | appendPoint(sb, s.start); |
| | | firstWritten = true; |
| | | lastEnd = s.start; |
| | | } else if (lastEnd == null || !equals2D(lastEnd, s.start)) { |
| | | // 非连续段,开始新的子路径 |
| | | appendPoint(sb, s.start); |
| | | lastEnd = s.start; |
| | | } |
| | | appendPointWithType(sb, s.end, s.isMowing); |
| | | lastEnd = s.end; |
| | | } |
| | | return sb.toString(); |
| | | } |
| | |
| | | return ""; |
| | | } |
| | | StringBuilder sb = new StringBuilder(); |
| | | YixinglujingNoObstacle.Point last = null; |
| | | for (YixinglujingNoObstacle.PathSegment segment : segments) { |
| | | // 只添加割草工作段,跳过过渡段 |
| | | if (segment.isMowing) { |
| | | // 如果起点与上一个终点不同,添加起点 |
| | | if (last == null || !equalsYixingPoint(last, segment.start)) { |
| | | appendYixingPoint(sb, segment.start); |
| | | } |
| | | // 添加终点 |
| | | appendYixingPoint(sb, segment.end); |
| | | last = segment.end; |
| | | YixinglujingNoObstacle.Point lastEnd = null; |
| | | boolean firstWritten = false; |
| | | for (YixinglujingNoObstacle.PathSegment s : segments) { |
| | | if (!firstWritten) { |
| | | appendYixingPoint(sb, s.start); |
| | | firstWritten = true; |
| | | lastEnd = s.start; |
| | | } else if (lastEnd == null || !equalsYixingPoint(lastEnd, s.start)) { |
| | | // 非连续段,开始新的子路径 |
| | | appendYixingPoint(sb, s.start); |
| | | lastEnd = s.start; |
| | | } |
| | | appendYixingPointWithType(sb, s.end, s.isMowing); |
| | | lastEnd = s.end; |
| | | } |
| | | return sb.toString(); |
| | | } |
| | |
| | | return ""; |
| | | } |
| | | StringBuilder sb = new StringBuilder(); |
| | | YixinglujingHaveObstacel.Point last = null; |
| | | for (YixinglujingHaveObstacel.PathSegment segment : segments) { |
| | | // 如果是第一段,或者当前段起点与上一段终点不连续,则添加起点 |
| | | if (last == null || !equalsYixingHaveObstaclePoint(last, segment.start)) { |
| | | appendYixingHaveObstaclePoint(sb, segment.start); |
| | | YixinglujingHaveObstacel.Point lastEnd = null; |
| | | boolean firstWritten = false; |
| | | for (YixinglujingHaveObstacel.PathSegment s : segments) { |
| | | if (!firstWritten) { |
| | | appendYixingHaveObstaclePoint(sb, s.start); |
| | | firstWritten = true; |
| | | lastEnd = s.start; |
| | | } else if (lastEnd == null || !equalsYixingHaveObstaclePoint(lastEnd, s.start)) { |
| | | appendYixingHaveObstaclePoint(sb, s.start); |
| | | lastEnd = s.start; |
| | | } |
| | | // 添加终点 |
| | | appendYixingHaveObstaclePoint(sb, segment.end); |
| | | last = segment.end; |
| | | appendYixingHaveObstaclePointWithType(sb, s.end, s.isMowing); |
| | | lastEnd = s.end; |
| | | } |
| | | return sb.toString(); |
| | | } |
| | |
| | | sb.append(String.format(Locale.US, "%.2f,%.2f", point.x, point.y)); |
| | | } |
| | | |
| | | private void appendYixingHaveObstaclePointWithType(StringBuilder sb, YixinglujingHaveObstacel.Point point, boolean isMowing) { |
| | | if (sb.length() > 0) { |
| | | sb.append(";"); |
| | | } |
| | | sb.append(String.format(Locale.US, "%.2f,%.2f,%s", point.x, point.y, isMowing ? "M" : "T")); |
| | | } |
| | | |
| | | /** |
| | | * 比较两个点是否相同(使用小的容差) |
| | | */ |
| | |
| | | } |
| | | sb.append(String.format(Locale.US, "%.2f,%.2f", point.x, point.y)); |
| | | } |
| | | |
| | | private void appendPointWithType(StringBuilder sb, AoxinglujingNoObstacle.Point point, boolean isMowing) { |
| | | if (sb.length() > 0) { |
| | | sb.append(";"); |
| | | } |
| | | sb.append(String.format(Locale.US, "%.2f,%.2f,%s", point.x, point.y, isMowing ? "M" : "T")); |
| | | } |
| | | |
| | | /** |
| | | * 比较两个 YixinglujingNoObstacle.Point 是否相同(使用小的容差) |
| | |
| | | sb.append(String.format(Locale.US, "%.2f,%.2f", point.x, point.y)); |
| | | } |
| | | |
| | | private void appendYixingPointWithType(StringBuilder sb, YixinglujingNoObstacle.Point point, boolean isMowing) { |
| | | if (sb.length() > 0) { |
| | | sb.append(";"); |
| | | } |
| | | sb.append(String.format(Locale.US, "%.2f,%.2f,%s", point.x, point.y, isMowing ? "M" : "T")); |
| | | } |
| | | |
| | | /** |
| | | * 比较两个 AoxinglujingHaveObstacel.Point 是否相同(使用小的容差) |
| | | */ |