From 5b685e9066ccfbc432c29739b5524f1d42a20891 Mon Sep 17 00:00:00 2001
From: 张世豪 <979909237@qq.com>
Date: 星期一, 22 十二月 2025 19:37:30 +0800
Subject: [PATCH] 进一步优化边界管理页面功能

---
 src/bianjie/bianjieguihua2.java |  170 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 170 insertions(+), 0 deletions(-)

diff --git a/src/bianjie/bianjieguihua2.java b/src/bianjie/bianjieguihua2.java
index 0129d75..4d9e9c1 100644
--- a/src/bianjie/bianjieguihua2.java
+++ b/src/bianjie/bianjieguihua2.java
@@ -7,6 +7,176 @@
 
 public class bianjieguihua2 {
 	/**
+	 * 浼樺寲杈圭晫XY鍧愭爣瀛楃涓�
+	 * 
+	 * @param boundaryXYString 杈圭晫XY鍧愭爣瀛楃涓诧紝鏍煎紡锛�"X0,Y0;X1,Y1;X2,Y2;..."
+	 * @return 浼樺寲鍚庣殑杈圭晫鍧愭爣瀛楃涓诧紝鏍煎紡锛�"X0,Y0;X1,Y1;X2,Y2;..."
+	 */
+	public static String optimizeBoundaryXYString(String boundaryXYString) {
+		try {
+			// 妫�鏌ヨ緭鍏ユ暟鎹�
+			if (boundaryXYString == null || boundaryXYString.trim().isEmpty()) {
+				throw new IllegalArgumentException("杈圭晫鍧愭爣瀛楃涓蹭笉鑳戒负绌�");
+			}
+			
+			// 瑙f瀽XY鍧愭爣瀛楃涓�
+			List<BoundaryAlgorithm.Coordinate> localCoordinates = parseXYString(boundaryXYString);
+			
+			if (localCoordinates == null || localCoordinates.isEmpty()) {
+				throw new IllegalArgumentException("鏃犳硶瑙f瀽杈圭晫鍧愭爣瀛楃涓�");
+			}
+			
+			// 涓夎褰㈠皬鍖哄煙鐗规畩澶勭悊锛岄伩鍏嶈繃搴︽彃鍊煎鑷寸偣鏁版墿澧�
+			if (localCoordinates.size() == 3) {
+				double triangleArea = calculatePolygonArea(localCoordinates);
+				double trianglePerimeter = calculatePerimeter(localCoordinates);
+				
+				System.out.println("妫�娴嬪埌涓夎褰㈣竟鐣岋紝闈㈢Н=" + String.format("%.2f", triangleArea) +
+						"m虏, 鍛ㄩ暱=" + String.format("%.2f", trianglePerimeter) + "m");
+				
+				if (triangleArea < 100.0 || trianglePerimeter < 30.0) {
+					System.out.println("灏忎笁瑙掑舰锛岃烦杩囨彃鍊间紭鍖�");
+					BoundaryAlgorithm.Coordinate firstPoint = localCoordinates.get(0);
+					List<BoundaryAlgorithm.Coordinate> trianglePoints = new ArrayList<>(localCoordinates);
+					trianglePoints.add(new BoundaryAlgorithm.Coordinate(
+							firstPoint.x,
+							firstPoint.y,
+							firstPoint.lat,
+							firstPoint.lon));
+					return convertBoundaryPointsToString(trianglePoints);
+				}
+			}
+			
+			// 鍒涘缓绠楁硶瀹炰緥
+			BoundaryAlgorithm algorithm = new BoundaryAlgorithm();
+			
+			// 鑷姩鍦烘櫙鍒嗘瀽锛堝熀浜嶺Y鍧愭爣锛屾棤楂樼▼鏁版嵁锛�
+			BoundaryAlgorithm.SceneAnalysis sceneAnalysis = analyzeSceneFromXYCoordinates(localCoordinates);
+			System.out.println("鑷姩鍦烘櫙鍒嗘瀽缁撴灉:");
+			System.out.println(sceneAnalysis.toString());
+			
+			// 鏍规嵁鍦烘櫙鍒嗘瀽缁撴灉鑾峰彇鍙傛暟
+			BoundaryAlgorithm.BoundaryParameters params = 
+				algorithm.getParametersForPreset(sceneAnalysis.suggestedPreset);
+			
+			System.out.println("鑷姩閫夋嫨鐨勫弬鏁�: 闂撮殧=" + params.interval + "绫�, 瑙掑害闃堝��=" + 
+			                  params.angleThreshold + "搴�");
+			
+			// 浣跨敤浼樺寲绠楁硶澶勭悊杈圭晫
+			List<BoundaryAlgorithm.Coordinate> optimizedPoints = 
+				algorithm.optimizeBoundaryPointsAdvanced(localCoordinates, params);
+			
+			// 璐ㄩ噺璇勪及
+			BoundaryAlgorithm.BoundaryQuality boundaryQuality = 
+				algorithm.evaluateBoundaryQuality(optimizedPoints);
+			
+			System.out.println("杈圭晫璐ㄩ噺璇勪及缁撴灉:");
+			System.out.println(boundaryQuality.toString());
+			
+			// 杞崲涓鸿緭鍑哄瓧绗︿覆鏍煎紡
+			return convertBoundaryPointsToString(optimizedPoints);
+			
+		} catch (Exception e) {
+			throw new RuntimeException("浼樺寲杈圭晫鍧愭爣瀛楃涓叉椂鍙戠敓閿欒: " + e.getMessage(), e);
+		}
+	}
+	
+	/**
+	 * 瑙f瀽XY鍧愭爣瀛楃涓蹭负Coordinate鍒楄〃
+	 * 
+	 * @param xyString XY鍧愭爣瀛楃涓诧紝鏍煎紡锛�"X0,Y0;X1,Y1;X2,Y2;..."
+	 * @return Coordinate鍒楄〃
+	 */
+	private static List<BoundaryAlgorithm.Coordinate> parseXYString(String xyString) {
+		List<BoundaryAlgorithm.Coordinate> coordinates = new ArrayList<>();
+		
+		if (xyString == null || xyString.trim().isEmpty()) {
+			return coordinates;
+		}
+		
+		String[] points = xyString.split(";");
+		for (String point : points) {
+			point = point.trim();
+			if (point.isEmpty()) {
+				continue;
+			}
+			
+			String[] parts = point.split(",");
+			if (parts.length >= 2) {
+				try {
+					double x = Double.parseDouble(parts[0].trim());
+					double y = Double.parseDouble(parts[1].trim());
+					// lat鍜宭on璁句负0锛屽洜涓烘垜浠彧闇�瑕乆Y鍧愭爣
+					coordinates.add(new BoundaryAlgorithm.Coordinate(x, y, 0.0, 0.0));
+				} catch (NumberFormatException e) {
+					System.err.println("瑙f瀽鍧愭爣澶辫触: " + point + ", 閿欒: " + e.getMessage());
+				}
+			}
+		}
+		
+		return coordinates;
+	}
+	
+	/**
+	 * 鍩轰簬XY鍧愭爣杩涜鍦烘櫙鍒嗘瀽锛堟棤楂樼▼鏁版嵁锛�
+	 */
+	private static BoundaryAlgorithm.SceneAnalysis analyzeSceneFromXYCoordinates(
+			List<BoundaryAlgorithm.Coordinate> localCoords) {
+		
+		BoundaryAlgorithm.SceneAnalysis analysis = new BoundaryAlgorithm.SceneAnalysis();
+		
+		if (localCoords.size() < 3) {
+			analysis.suggestedPreset = "澶嶆潅灏忓尯鍩�";
+			return analysis;
+		}
+		
+		// 璁$畻鍩烘湰缁熻淇℃伅
+		calculateBasicStatisticsFromCoordinates(localCoords, analysis);
+		
+		// 璁$畻杈圭晫澶嶆潅搴�
+		calculateBoundaryComplexityFromCoordinates(localCoords, analysis);
+		
+		// 鏃犻珮绋嬫暟鎹紝璁剧疆涓�0
+		analysis.elevationRange = 0;
+		
+		// 鑷姩閫夋嫨棰勮鍦烘櫙锛堜笉鑰冭檻楂樼▼鍥犵礌锛�
+		selectPresetAutomaticallyFromXYCoordinates(analysis);
+		
+		return analysis;
+	}
+	
+	/**
+	 * 浠嶺Y鍧愭爣鑷姩閫夋嫨棰勮鍦烘櫙锛堜笉鑰冭檻楂樼▼鍥犵礌锛�
+	 */
+	private static void selectPresetAutomaticallyFromXYCoordinates(BoundaryAlgorithm.SceneAnalysis analysis) {
+		// 鍐崇瓥閫昏緫鍩轰簬闈㈢Н鍜屽鏉傚害
+		double areaWeight = 0.6;
+		double complexityWeight = 0.4;
+		
+		// 璁$畻缁煎悎寰楀垎
+		double score = 0;
+		
+		// 闈㈢Н鍥犵礌锛氶潰绉秺澶э紝瓒婇�傚悎澶ч棿闅�
+		double areaScore = Math.min(1.0, analysis.area / 1000.0); // 1000骞虫柟绫充负鍩哄噯
+		score += areaScore * areaWeight;
+		
+		// 澶嶆潅搴﹀洜绱狅細澶嶆潅搴﹁秺楂橈紝瓒婇渶瑕佸皬闂撮殧
+		double complexityScore = analysis.complexity;
+		score += complexityScore * complexityWeight;
+		
+		// 鏍规嵁寰楀垎閫夋嫨棰勮
+		if (score < 0.3) {
+			analysis.suggestedPreset = "骞冲潶澶у尯鍩�";
+		} else if (score < 0.6) {
+			analysis.suggestedPreset = "甯歌鍖哄煙";
+		} else {
+			analysis.suggestedPreset = "澶嶆潅灏忓尯鍩�";
+		}
+		
+		System.out.println("鑷姩鍦烘櫙閫夋嫨寰楀垎: " + String.format("%.2f", score) + " -> " + analysis.suggestedPreset);
+	}
+
+	/**
 	 * 鑷姩澶勭悊Coordinate鍒楄〃骞剁敓鎴愪紭鍖栧悗鐨勮竟鐣屽潗鏍囷紙鏃犻渶浼犲叆闂撮殧鍜岃搴﹂槇鍊硷級
 	 * 
 	 * @param coordinates Coordinate瀵硅薄鍒楄〃

--
Gitblit v1.10.0