Files
better-genshin-impact/BetterGenshinImpact/GameTask/Common/Map/TeyvatMapCoordinate.cs
辉鸭蛋 9e41808326 独立与分层地图支持 (#1503)
* 抽象基础类

* 修改定义

* 抽象出Feature2D相关能力

* 新增地图基类实现

* 临时提交

* 迁移坐标计算

* 加载分层特征数据

* 新增独立地图 层岩巨渊,渊下宫,旧日之海

* 支持不切分特征点匹配

* 添加远古圣山,修改地图参数

* 提瓦特大陆的大地图匹配

* 提瓦特大陆地图大地图位置获取使用256级别的地图

* 替换大地图匹配类 BigMap.cs

* 替换小地图匹配类 EntireMap

* 修改tp的入参方式,删除无用类

* 兼容新提交的内容

* 修复类方法覆盖不生效的问题

* 修复定位问题,迁移部分 MapCoordinate 的代码。MapCoordinate 标记为废弃

* 更多坐标方法的迁移

* 修复不正确的坐标转换

* 是用正确的特征匹配

* 体积较小的地图动态生成特征

* 路径追踪窗体支持多地图

* 传送时切换独立地图地区

* 更新传送点信息

* 修改独立地图相关命名,使用 Scene(场景) 命名,和原神内部命名保持一致

* 录制支持多独立地图

* 修复地区切换失败的问题
2025-05-03 21:59:37 +08:00

136 lines
5.2 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using BetterGenshinImpact.Core.Recognition.OpenCv;
using OpenCvSharp;
using System;
namespace BetterGenshinImpact.GameTask.Common.Map;
/// <summary>
/// 地图坐标系转换
/// 1. 原神游戏坐标系 Game
/// 2. BetterGI主地图1024区块坐标系 Main1024
///
/// 已过时,请使用 TeyvatMap 替代
/// </summary>
[Obsolete]
public class TeyvatMapCoordinate
{
#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; // 游戏地图块的长宽
/// <summary>
/// 原神游戏坐标系 -> 主地图1024区块坐标系
/// </summary>
/// <param name="position">[a,b,c]</param>
/// <returns></returns>
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);
}
/// <summary>
/// 主地图1024区块坐标系 -> 原神游戏坐标系
/// </summary>
/// <param name="point"></param>
/// <returns></returns>
public static Point Main1024ToGame(Point point)
{
return new Point((GameMapLeftCols + 1) * GameMapBlockWidth - point.X, (GameMapUpRows + 1) * GameMapBlockWidth - point.Y);
}
/// <summary>
/// 原神游戏坐标系 -> 主地图2048区块坐标系
/// </summary>
/// <param name="position">[a,b,c]</param>
/// <returns></returns>
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));
}
/// <summary>
/// 原神游戏坐标系 -> 主地图2048区块坐标系
/// </summary>
/// <param name="point">(c,a)</param>
/// <returns></returns>
public static Point GameToMain2048(Point point)
{
return new Point(((GameMapLeftCols + 1) * GameMapBlockWidth - point.X) * 2, ((GameMapUpRows + 1) * GameMapBlockWidth - point.Y) * 2);
}
/// <summary>
/// 原神游戏坐标系 -> 主地图2048区块坐标系
/// </summary>
/// <returns></returns>
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);
}
/// <summary>
/// 主地图2048区块坐标系 -> 原神游戏坐标系
/// </summary>
/// <param name="point"></param>
/// <returns></returns>
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);
}
/// <summary>
/// 主地图2048区块坐标系 -> 原神游戏坐标系
/// </summary>
/// <param name="rect"></param>
/// <returns></returns>
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);
}
}