From b272034a1fdbfe32b355fc6c264a4c45df107190 Mon Sep 17 00:00:00 2001
From: 张世豪 <979909237@qq.com>
Date: 星期二, 23 十二月 2025 14:55:03 +0800
Subject: [PATCH] 优化了新增地块功能
---
src/bianjie/BoundaryAlgorithm.java | 41 ++++++++++++++++++++++++++++++++---------
1 files changed, 32 insertions(+), 9 deletions(-)
diff --git a/src/bianjie/BoundaryAlgorithm.java b/src/bianjie/BoundaryAlgorithm.java
index a38f076..aa4254c 100644
--- a/src/bianjie/BoundaryAlgorithm.java
+++ b/src/bianjie/BoundaryAlgorithm.java
@@ -488,19 +488,22 @@
if (!optimized.get(0).equals(optimized.get(optimized.size() - 1))) {
Coordinate first = optimized.get(0);
Coordinate last = optimized.get(optimized.size() - 1);
- double closingDistance = calculateDistance(first, last);
-
+ double closingDistance = calculateDistance(last, first);
+
if (closingDistance > params.interval) {
- // 濡傛灉棣栧熬璺濈杈冭繙锛屾坊鍔犱腑闂寸偣
- List<Coordinate> interpolated = interpolateBoundary(
- List.of(last, first), params.interval
- );
- optimized.addAll(interpolated.subList(1, interpolated.size() - 1));
+ int segments = (int) Math.ceil(closingDistance / params.interval);
+ for (int i = 1; i < segments; i++) {
+ double ratio = (double) i / segments;
+ Coordinate interpolatedPoint = interpolate(last, first, ratio);
+ if (!interpolatedPoint.equals(last)) {
+ optimized.add(interpolatedPoint);
+ }
+ }
}
optimized.add(first);
}
-
- return optimized;
+
+ return removeConsecutiveDuplicates(optimized);
}
// 閬撴牸鎷夋柉-鏅厠绠楁硶
@@ -580,6 +583,26 @@
return interpolated;
}
+ private List<Coordinate> removeConsecutiveDuplicates(List<Coordinate> points) {
+ if (points == null || points.isEmpty()) {
+ return points;
+ }
+
+ List<Coordinate> cleaned = new ArrayList<>();
+ Coordinate previous = null;
+ for (Coordinate point : points) {
+ if (previous == null || !point.equals(previous)) {
+ cleaned.add(point);
+ previous = point;
+ }
+ }
+
+ if (!cleaned.isEmpty() && !cleaned.get(0).equals(cleaned.get(cleaned.size() - 1))) {
+ cleaned.add(cleaned.get(0));
+ }
+ return cleaned;
+ }
+
// 绾挎�ф彃鍊�
private Coordinate interpolate(Coordinate p1, Coordinate p2, double ratio) {
double x = p1.x + (p2.x - p1.x) * ratio;
--
Gitblit v1.10.0