| | |
| | | // 绘制状态 |
| | | private boolean drawingActive = false; |
| | | private boolean paused = false; |
| | | private boolean isHandheldMode = false; // 是否使用手持设备模式 |
| | | |
| | | // 基准坐标 |
| | | private double[] baseLatLon; |
| | |
| | | /** |
| | | * 启动往返路径绘制 |
| | | * @param finishCallback 完成绘制时的回调 |
| | | * @param isHandheld 是否使用手持设备模式 |
| | | * @return 是否成功启动 |
| | | */ |
| | | public boolean start(Runnable finishCallback) { |
| | | public boolean start(Runnable finishCallback, boolean isHandheld) { |
| | | if (mapRenderer == null || helper == null) { |
| | | return false; |
| | | } |
| | |
| | | paused = false; |
| | | this.finishCallback = finishCallback; |
| | | this.baseLatLon = baseLatLonCandidate; |
| | | this.isHandheldMode = isHandheld; |
| | | |
| | | // 如果是手持设备模式,切换图标 |
| | | if (isHandheld && shouye != null) { |
| | | shouye.setHandheldMowerIconActive(true); |
| | | } |
| | | |
| | | // 清空路径点 |
| | | synchronized (returnPathPoints) { |
| | |
| | | if (helper != null) { |
| | | helper.enterDrawingControlMode(); |
| | | } |
| | | |
| | | // 设置状态提示为"正在绘制往返路径" |
| | | if (shouye != null) { |
| | | shouye.setStatusLabelText("正在绘制往返路径"); |
| | | } |
| | | |
| | | startMonitor(); |
| | | return true; |
| | | } |
| | |
| | | |
| | | double lat = helper.parseDMToDecimal(latest.getLatitude(), latest.getLatDirection()); |
| | | double lon = helper.parseDMToDecimal(latest.getLongitude(), latest.getLonDirection()); |
| | | if (!Double.isFinite(lat) || !Double.isFinite(lon)) { |
| | | if (!isFinite(lat) || !isFinite(lon)) { |
| | | return; |
| | | } |
| | | |
| | | double[] local = helper.convertLatLonToLocal(lat, lon, baseLatLon[0], baseLatLon[1]); |
| | | Point2D.Double candidate = new Point2D.Double(local[0], local[1]); |
| | | if (!Double.isFinite(candidate.x) || !Double.isFinite(candidate.y)) { |
| | | if (!isFinite(candidate.x) || !isFinite(candidate.y)) { |
| | | return; |
| | | } |
| | | |
| | |
| | | if (helper != null) { |
| | | helper.exitDrawingControlMode(); |
| | | } |
| | | |
| | | // 恢复割草机图标 |
| | | if (isHandheldMode && shouye != null) { |
| | | shouye.setHandheldMowerIconActive(false); |
| | | } |
| | | isHandheldMode = false; |
| | | } |
| | | |
| | | /** |
| | |
| | | g2d.setStroke(new BasicStroke(dashWidth, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND, 10.0f, dashPattern, 0.0f)); |
| | | g2d.draw(path); |
| | | } |
| | | |
| | | /** |
| | | * 检查double值是否有限(不是NaN或无穷大) |
| | | * 兼容低版本Java |
| | | */ |
| | | private static boolean isFinite(double value) { |
| | | return !Double.isNaN(value) && !Double.isInfinite(value); |
| | | } |
| | | } |
| | | |