首页 > 解决方案 > 找到人口最多地区的中点

问题描述

我希望你有一个美好的一天,所以这是我的问题:我试图在地图上找到人口最多的位置 (X/Y) 的中间点,但我被卡住了,我找不到一个好的和有效的方法来做到这一点。

为了找到这个位置,我可以访问实体集合(并且这些实体具有 Position 属性(它是 Vector2D)和地图大小

public readonly struct Vector2D
{
    private static readonly double Sqrt = Math.Sqrt(2);
    private static readonly Random Random = new Random();
    
    public static Vector2D Zero { get; } = new Vector2D();
    
    public int X { get; }
    public int Y { get; }

    public Vector2D(int x, int y)
    {
        X = x;
        Y = y;
    }

    public Vector2D GetDistanceTo(Vector2D vector2D) => new Vector2D(Math.Abs(vector2D.X - X), Math.Abs(vector2D.Y - Y));

    public int GetDistance(Vector2D destination)
    {
        int x = Math.Abs(X - destination.X);
        int y = Math.Abs(Y - destination.Y);

        int min = Math.Min(x, y);
        int max = Math.Max(x, y);

        return (int)(min * Sqrt + max - min);
    }
    
    public bool IsInRange(Vector2D position, int range)
    {
        int dx = Math.Abs(X - position.X);
        int dy = Math.Abs(Y - position.Y);
        
        return dx <= range && dy <= range && dx + dy <= range + range / 2;
    }

    public override string ToString() => $"{X}/{Y}";
}

这是我唯一尝试过的

public Vector2D FindMostPopulatedPosition()
{
    IEnumerable<Vector2D> positions = Entities.Select(x => x.Position);
    return new Vector2D((int)positions.Average(x => x.X), (int)positions.Average(x => x.Y));
}

这是一些示例图像

红点:所有实体
蓝点:我正在寻找的位置

例子 例子

感谢阅读(以及您的帮助)

标签: c#algorithm

解决方案


推荐阅读