using BetterGenshinImpact.Core.Recognition.OpenCv; using OpenCvSharp; using System; namespace BetterGenshinImpact.GameTask.Common.Map; /// /// 地图坐标系转换 /// 1. 原神游戏坐标系 Game /// 2. BetterGI主地图1024区块坐标系 Main1024 /// public class MapCoordinate { #region 每次地图扩大都要更新的参数 public static readonly int GameMapRows = 13; // 游戏坐标下地图块的行数 public static readonly int GameMapCols = 18; // 游戏坐标下地图块的列数 public static readonly int GameMapUpRows = 5; // 游戏坐标下 左上角离地图原点的行数 public static readonly int GameMapLeftCols = 11; // 游戏坐标下 左上角离地图原点的列数 public static readonly int Main2048Width = GameMapCols * 2048; public static readonly int Main2048Height = GameMapRows * 2048; public static readonly int Main256Width = GameMapCols * 256; public static readonly int Main256Height = GameMapRows * 256; #endregion 每次地图扩大都要更新的参数 public static readonly int GameMapBlockWidth = 1024; // 游戏地图块的长宽 /// /// 原神游戏坐标系 -> 主地图1024区块坐标系 /// /// [a,b,c] /// public static Point GameToMain1024(decimal[] position) { // 四舍六入五取偶 var a = (int)Math.Round(position[0]); // 上 var c = (int)Math.Round(position[2]); // 左 // 转换1024区块坐标,大地图坐标系正轴是往左上方向的 // 这里写最左上角的区块坐标(GameMapUpRows,GameMapLeftCols)/(上,左),截止4.5版本,最左上角的区块坐标是(5,7) return new Point((GameMapLeftCols + 1) * GameMapBlockWidth - c, (GameMapUpRows + 1) * GameMapBlockWidth - a); } /// /// 主地图1024区块坐标系 -> 原神游戏坐标系 /// /// /// public static Point Main1024ToGame(Point point) { return new Point((GameMapLeftCols + 1) * GameMapBlockWidth - point.X, (GameMapUpRows + 1) * GameMapBlockWidth - point.Y); } /// /// 原神游戏坐标系 -> 主地图2048区块坐标系 /// /// [a,b,c] /// public static Point GameToMain2048(decimal[] position) { var a = position[0]; // 上 var c = position[2]; // 左 // 转换1024区块坐标,大地图坐标系正轴是往左上方向的 // 这里写最左上角的区块坐标(GameMapUpRows,GameMapLeftCols)/(上,左),截止4.5版本,最左上角的区块坐标是(5,7) return new Point((int)(((GameMapLeftCols + 1) * GameMapBlockWidth - c) * 2), (int)(((GameMapUpRows + 1) * GameMapBlockWidth - a) * 2)); } /// /// 原神游戏坐标系 -> 主地图2048区块坐标系 /// /// (c,a) /// public static Point GameToMain2048(Point point) { return new Point(((GameMapLeftCols + 1) * GameMapBlockWidth - point.X) * 2, ((GameMapUpRows + 1) * GameMapBlockWidth - point.Y) * 2); } /// /// 原神游戏坐标系 -> 主地图2048区块坐标系 /// /// public static (double x, double y) GameToMain2048(double c, double a) { // 转换1024区块坐标,大地图坐标系正轴是往左上方向的 // 这里写最左上角的区块坐标(GameMapUpRows,GameMapLeftCols)/(上,左),截止4.5版本,最左上角的区块坐标是(5,7) return new(((GameMapLeftCols + 1) * GameMapBlockWidth - c) * 2, ((GameMapUpRows + 1) * GameMapBlockWidth - a) * 2); } public static Rect GameToMain2048(Rect rect) { var center = rect.GetCenterPoint(); // 转换中心点坐标 (double newX, double newY) = GameToMain2048(center.X, center.Y); // 返回转换后的矩形坐标 return new Rect((int)Math.Round(newX) - rect.Width, (int)Math.Round(newY) - rect.Height, rect.Width * 2, rect.Height * 2); } /// /// 主地图2048区块坐标系 -> 原神游戏坐标系 /// /// /// public static Point Main2048ToGame(Point point) { return new Point((GameMapLeftCols + 1) * GameMapBlockWidth - point.X / 2, (GameMapUpRows + 1) * GameMapBlockWidth - point.Y / 2); } public static Point2f Main2048ToGame(Point2f point) { return new Point2f((GameMapLeftCols + 1) * GameMapBlockWidth - point.X / 2f, (GameMapUpRows + 1) * GameMapBlockWidth - point.Y / 2f); } /// /// 主地图2048区块坐标系 -> 原神游戏坐标系 /// /// /// public static Rect Main2048ToGame(Rect rect) { var center = rect.GetCenterPoint(); var point = Main2048ToGame(center); return new Rect(point.X - rect.Width / 4, point.Y - rect.Height / 4, rect.Width / 2, rect.Height / 2); } }