fix: bản đồ Vị trí auto-fit, không cắt điểm, căn giữa cân đối
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -2941,14 +2941,30 @@ function MiniMap({
|
|||||||
const nodeSize = compact ? 5.2 : 5.2;
|
const nodeSize = compact ? 5.2 : 5.2;
|
||||||
const edgeInset = nodeSize / 2;
|
const edgeInset = nodeSize / 2;
|
||||||
const clampMapPoint = (value: number) => THREE.MathUtils.clamp(value, edgeInset, 100 - edgeInset);
|
const clampMapPoint = (value: number) => THREE.MathUtils.clamp(value, edgeInset, 100 - edgeInset);
|
||||||
const compressOverviewY = (value: number) => 50 + (value - 50) * 0.86;
|
|
||||||
|
// Auto-fit overview: co toàn bộ điểm vào khung với lề an toàn để không bị cắt.
|
||||||
|
const OVERVIEW_MARGIN = 8;
|
||||||
|
const overviewPts = scenes
|
||||||
|
.map((s) => s.mapPosition)
|
||||||
|
.filter((p): p is { x: number; y: number } => Boolean(p));
|
||||||
|
const overviewBounds = {
|
||||||
|
minX: Math.min(...overviewPts.map((p) => p.x)),
|
||||||
|
maxX: Math.max(...overviewPts.map((p) => p.x)),
|
||||||
|
minY: Math.min(...overviewPts.map((p) => p.y)),
|
||||||
|
maxY: Math.max(...overviewPts.map((p) => p.y)),
|
||||||
|
};
|
||||||
|
const fitOverview = (value: number, min: number, max: number) =>
|
||||||
|
max - min < 0.0001
|
||||||
|
? 50
|
||||||
|
: OVERVIEW_MARGIN + ((value - min) / (max - min)) * (100 - 2 * OVERVIEW_MARGIN);
|
||||||
|
|
||||||
const getMapPosition = (scene: TourScene) => {
|
const getMapPosition = (scene: TourScene) => {
|
||||||
if (!scene.mapPosition || (!isOverview && !activeScene.mapPosition)) return null;
|
if (!scene.mapPosition || (!isOverview && !activeScene.mapPosition)) return null;
|
||||||
|
|
||||||
if (isOverview) {
|
if (isOverview) {
|
||||||
return {
|
return {
|
||||||
x: clampMapPoint(scene.mapPosition.x),
|
x: clampMapPoint(fitOverview(scene.mapPosition.x, overviewBounds.minX, overviewBounds.maxX)),
|
||||||
y: clampMapPoint(compressOverviewY(scene.mapPosition.y)),
|
y: clampMapPoint(fitOverview(scene.mapPosition.y, overviewBounds.minY, overviewBounds.maxY)),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user