我正在使用 Fortnite API(参见此处)并使用其地图位置端点,我可以检索包含名称和 XYZ 坐标的位置。该端点还提供地图,可返回...
我正在使用 Fortnite API( 参见此处 ),并使用其地图位置端点,我可以检索包含名称和 XYZ 坐标的位置。该端点还提供地图,返回地图的图像 URL( 此 )。
我尝试使用提供的坐标的地图图像在 XYZ 坐标处的地图位置上绘制一个 X。但是给出的坐标示例为:(-78214, -70796, 112)。由于它是 2D 图像,因此仅使用 X 和 Y,但这些 5 位负数对我处理的图像大小没有多大帮助。
因此,我联系了 Discord 中之前尝试过的人,他们最终给了我一个我尝试过的缩放数字。以下是代码:
var mapLocations = await fortniteApi.GetFortniteMapLocations();
if (mapLocations == null)
{
return null;
}
// Download the image
Bitmap bitmap;
using (var httpClient = new HttpClient())
{
await using (var stream = await httpClient.GetStreamAsync(mapLocations.Images.Blank.AbsoluteUri))
{
bitmap = new Bitmap(stream);
}
}
const int worldRadius = 135000;
var stringOutput = "";
Color[] colors = [Color.Red, Color.Blue, Color.Black, Color.Yellow, Color.Purple];
foreach (var color in colors)
{
var namedLocations = mapLocations.POIs.Where(l => !l.Id.ToLower().Contains("unnamed")).ToList();
var randomIndex = new Random().Next(namedLocations.Count);
var randomLocation = namedLocations[randomIndex];
var x = (randomLocation.Location.Y + worldRadius) / (worldRadius * 2) * bitmap.Width;
var y = (1 - (randomLocation.Location.X + worldRadius) / (worldRadius * 2)) * bitmap.Height;
using (var graphics = Graphics.FromImage(bitmap))
{
const int xSize = 100;
var pen = new Pen(color, 7);
graphics.DrawLine(pen, x - xSize / 2f, y - xSize / 2f, x + xSize / 2f, y + xSize / 2f);
graphics.DrawLine(pen, x - xSize / 2f, y + xSize / 2f, x + xSize / 2f, y - xSize / 2f);
}
stringOutput +=
$"{randomLocation.Name} || {color.Name} || original: ({randomLocation.Location.X} , {randomLocation.Location.Y}) || scaled: ({x} , {y})\n";
}
// Save the modified image
const string outputPath = @"C:\temp\" + "output.jpg";
bitmap.Save(outputPath);
Console.WriteLine($"Image saved to {outputPath}");
总结一下,代码会随机选取 5 个位置,并为其分配颜色和标记 X。输出如下所示 。 如代码所示,它使用了 135000 的缩放因子,这个值是任意的,但似乎已经非常接近了。以下是坐标与它们应该在的位置(大致)的比较:
BLACK:X: 449, 1077 应为: 489, 1184
紫色:X:893,1038 应为:929,1071
BLUE:X:1548, 1493 应为:1485, 1468
所以最终,我想知道,是否有一种数学方法可以计算此图像的正确比例因子,以及如何调整 API 提供的坐标以匹配 API 上的正确位置?我不确定是否需要更多数据,但我认为必须有一种数学方法来准确地做到这一点。