From dc9dce0555beb85d1262893fd5d56747d6a83855 Mon Sep 17 00:00:00 2001
From: 张世豪 <979909237@qq.com>
Date: 星期五, 19 十二月 2025 11:48:37 +0800
Subject: [PATCH] 新增了导航预览功能
---
src/dikuai/ObstacleManagementPage.java | 107 ++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 105 insertions(+), 2 deletions(-)
diff --git a/src/dikuai/ObstacleManagementPage.java b/src/dikuai/ObstacleManagementPage.java
index 9dc7c5d..96c801a 100644
--- a/src/dikuai/ObstacleManagementPage.java
+++ b/src/dikuai/ObstacleManagementPage.java
@@ -299,7 +299,17 @@
JTextArea xyArea = createDataTextArea(genCoords, 3); // 寮曠敤浠ヤ究鏇存柊
JScrollPane scrollXY = new JScrollPane(xyArea);
scrollXY.setBorder(BorderFactory.createEmptyBorder()); // 澶栭儴鐢盤anel鎻愪緵杈规
-
+ // 璁剧疆婊氬姩鏉$瓥鐣ワ細闇�瑕佹椂鏄剧ず鍨傜洿婊氬姩鏉★紝涓嶄娇鐢ㄦ按骞虫粴鍔ㄦ潯锛堝洜涓哄惎鐢ㄤ簡鑷姩鎹㈣锛�
+ scrollXY.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
+ scrollXY.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
+ // 璁剧疆婊氬姩鏉″崟浣嶅閲忥紝浣挎粴鍔ㄦ洿娴佺晠
+ scrollXY.getVerticalScrollBar().setUnitIncrement(16);
+ // 璁剧疆婊氬姩闈㈡澘鐨勯閫夊ぇ灏忥紝纭繚鍦ㄥ唴瀹硅秴鍑烘椂鏄剧ず婊氬姩鏉�
+ int lineHeight = xyArea.getFontMetrics(xyArea.getFont()).getHeight();
+ int preferredHeight = 3 * lineHeight + 10; // 3琛岀殑楂樺害
+ scrollXY.setPreferredSize(new Dimension(Integer.MAX_VALUE, preferredHeight));
+ scrollXY.setMaximumSize(new Dimension(Integer.MAX_VALUE, 200)); // 鏈�澶ч珮搴�200鍍忕礌
+
JPanel xyWrapper = createWrapperPanel("鐢熸垚鍧愭爣 (XY绫�)", scrollXY);
card.add(xyWrapper);
card.add(Box.createVerticalStrut(15));
@@ -338,6 +348,16 @@
JTextArea area = createDataTextArea(content, rows);
JScrollPane scroll = new JScrollPane(area);
scroll.setBorder(BorderFactory.createEmptyBorder());
+ // 璁剧疆婊氬姩鏉$瓥鐣ワ細闇�瑕佹椂鏄剧ず鍨傜洿婊氬姩鏉★紝涓嶄娇鐢ㄦ按骞虫粴鍔ㄦ潯锛堝洜涓哄惎鐢ㄤ簡鑷姩鎹㈣锛�
+ scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
+ scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
+ // 璁剧疆婊氬姩鏉″崟浣嶅閲忥紝浣挎粴鍔ㄦ洿娴佺晠
+ scroll.getVerticalScrollBar().setUnitIncrement(16);
+ // 璁剧疆婊氬姩闈㈡澘鐨勯閫夊ぇ灏忥紝纭繚鍦ㄥ唴瀹硅秴鍑烘椂鏄剧ず婊氬姩鏉�
+ int lineHeight = area.getFontMetrics(area.getFont()).getHeight();
+ int preferredHeight = rows * lineHeight + 10; // 鏍规嵁琛屾暟璁$畻棣栭�夐珮搴�
+ scroll.setPreferredSize(new Dimension(Integer.MAX_VALUE, preferredHeight));
+ scroll.setMaximumSize(new Dimension(Integer.MAX_VALUE, 200)); // 鏈�澶ч珮搴�200鍍忕礌
return createWrapperPanel(title, scroll);
}
@@ -366,12 +386,13 @@
JTextArea area = new JTextArea(text);
area.setRows(rows);
area.setEditable(false);
+ // 鍚敤鑷姩鎹㈣
area.setLineWrap(true);
area.setWrapStyleWord(true);
area.setBackground(BG_INPUT);
area.setForeground(new Color(50, 50, 50));
// 浣跨敤绛夊瀛椾綋鏄剧ず鏁版嵁锛岀湅璧锋潵鏇翠笓涓�
- area.setFont(new Font("Monospaced", Font.PLAIN, 12));
+ area.setFont(new Font("Monospaced", Font.PLAIN, 12));
return area;
}
@@ -545,6 +566,9 @@
return;
}
+ // 璁$畻闅滅鐗╃殑涓績鐐瑰潗鏍�
+ double[] centerCoords = calculateObstacleCenter(obstacle);
+
List<Obstacledge.Obstacle> allObstacles = loadObstacles();
String allObstaclesCoords = buildAllObstaclesCoordinates(allObstacles);
@@ -568,11 +592,85 @@
newPage.setVisible(true);
})
);
+
+ // 灏嗗湴鍥捐鍥句腑蹇冭缃负闅滅鐗╃殑涓績浣嶇疆
+ if (centerCoords != null && shouye.getMapRenderer() != null) {
+ double currentScale = shouye.getMapRenderer().getScale();
+ // 灏嗚鍥句腑蹇冭缃负闅滅鐗╀腑蹇冿紙浣跨敤璐熷�硷紝鍥犱负translate鏄浉瀵逛簬鍘熺偣鐨勫亸绉伙級
+ shouye.getMapRenderer().setViewTransform(currentScale, -centerCoords[0], -centerCoords[1]);
+ }
} else {
JOptionPane.showMessageDialog(null, "鏃犳硶鎵撳紑涓婚〉闈㈣繘琛岄瑙�", "鎻愮ず", JOptionPane.WARNING_MESSAGE);
}
});
}
+
+ /**
+ * 璁$畻闅滅鐗╃殑涓績鐐瑰潗鏍�
+ * @param obstacle 闅滅鐗�
+ * @return 涓績鐐瑰潗鏍� [centerX, centerY]锛屽鏋滄棤娉曡绠楀垯杩斿洖null
+ */
+ private double[] calculateObstacleCenter(Obstacledge.Obstacle obstacle) {
+ if (obstacle == null) {
+ return null;
+ }
+
+ List<Obstacledge.XYCoordinate> xyCoords = obstacle.getXyCoordinates();
+ if (xyCoords == null || xyCoords.isEmpty()) {
+ return null;
+ }
+
+ Obstacledge.ObstacleShape shape = obstacle.getShape();
+ double centerX, centerY;
+
+ if (shape == Obstacledge.ObstacleShape.CIRCLE) {
+ // 鍦嗗舰闅滅鐗╋細绗竴涓潗鏍囩偣灏辨槸鍦嗗績
+ if (xyCoords.size() < 1) {
+ return null;
+ }
+ Obstacledge.XYCoordinate centerCoord = xyCoords.get(0);
+ centerX = centerCoord.getX();
+ centerY = centerCoord.getY();
+ } else if (shape == Obstacledge.ObstacleShape.POLYGON) {
+ // 澶氳竟褰㈤殰纰嶇墿锛氳绠楅噸蹇�
+ centerX = 0.0;
+ centerY = 0.0;
+ double area = 0.0;
+ int n = xyCoords.size();
+
+ for (int i = 0; i < n; i++) {
+ Obstacledge.XYCoordinate current = xyCoords.get(i);
+ Obstacledge.XYCoordinate next = xyCoords.get((i + 1) % n);
+ double x0 = current.getX();
+ double y0 = current.getY();
+ double x1 = next.getX();
+ double y1 = next.getY();
+ double cross = x0 * y1 - x1 * y0;
+ area += cross;
+ centerX += (x0 + x1) * cross;
+ centerY += (y0 + y1) * cross;
+ }
+
+ double areaFactor = area * 0.5;
+ if (Math.abs(areaFactor) < 1e-9) {
+ // 濡傛灉闈㈢Н涓�0鎴栨帴杩�0锛屼娇鐢ㄧ畝鍗曞钩鍧�
+ for (Obstacledge.XYCoordinate coord : xyCoords) {
+ centerX += coord.getX();
+ centerY += coord.getY();
+ }
+ int size = Math.max(1, xyCoords.size());
+ centerX /= size;
+ centerY /= size;
+ } else {
+ centerX = centerX / (6.0 * areaFactor);
+ centerY = centerY / (6.0 * areaFactor);
+ }
+ } else {
+ return null;
+ }
+
+ return new double[]{centerX, centerY};
+ }
private String buildAllObstaclesCoordinates(List<Obstacledge.Obstacle> obstacles) {
if (obstacles == null || obstacles.isEmpty()) return null;
@@ -897,3 +995,8 @@
return value != null && !value.trim().isEmpty() && !"-1".equals(value.trim());
}
}
+
+
+
+
+
--
Gitblit v1.10.0