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