计算每个x和y坐标的距离

时间:2019-06-18 16:54:34

标签: c# algorithm

我正在编写一个函数,该函数计算与x和y坐标的距离。我有一个具有一堆x和y坐标的二维数组。 函数返回到点的距离顺序的x和y坐标列表。为了计算到每个点的距离,有一个公式(坐标和的平方根)。

我可以计算每个x和y坐标的距离。我将其添加到列表中。如何将距离存储为该特定坐标的另一个属性,然后对其进行排序。

public static List<List<int>> calculateDistance(int[,] Coordinates)
        {
            List<List<int>> result = new List<List<int>>();
            int bound0 = Coordinates.GetUpperBound(0);
            List<double> distance = new List<double>();

            for (int i = 0;i <= bound0; i++)
            {
                distance.Add(Math.Sqrt(Coordinates[i, 0]) + Coordinates[i,1]));
            }  

            return result;
        }
    }

2 个答案:

答案 0 :(得分:1)

根据您的描述,您无需创建calculateDistance方法。可以使用lambda表达式给出计算距离的公式。您可以在代码中的任何位置创建所需的列表,并使用Linq对其进行排序。

示例

var list = Enumerable
                .Range(0, Coordinates.GetLength(0))
                .Select(i => new { X = Coordinates[i, 0], Y = Coordinates[i, 1], D = Math.Sqrt(Math.Pow(Coordinates[i, 0], 2) + Math.Pow(Coordinates[i, 1], 2)) });

Math.Sqrt(Math.Pow(Coordinates[i, 0], 2) + Math.Pow(Coordinates[i, 1], 2))在此处用于演示。而是使用您自己的表达式来计算距离。

要对此进行排序,您只需使用

var list2 = list.OrderBy(a => a.D);

答案 1 :(得分:0)

如果您尝试为输入和输出定义适当的数据结构,则将更有帮助。它可能是像元组一样简单的东西,也可能是结构或类之类的更惯用的东西。

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

    public int X { get; }
    public int Y { get; }
}

然后定义一个结果结构,例如:

struct Result {
    public Result(Coordinate coordinate, double distance) {
         Coordinate = coordinate;
         Distance = distance;
    }

    public Coordinate Coordinate { get; }
    public double Distance { get; }
}

然后,您可以创建以下结果项的列表:

public List<Result> ComputeDistances(List<Coordinate> coordinates) {
    List<Result> results = new List<Result>();
    foreach (var coordinate in coordinates) {
        double distance = Math.Sqrt(coordinate.X + coordinate.Y); // *
        results.Add(new Result(coordinate, distance));
    }
    return results;
}

(*)请注意,指定的距离函数有些奇怪。通常,您希望对X和Y坐标的平方求和

如果您喜欢更具功能性的样式,则可以对代码进行大量更改:

public IEnumerable<Result> ComputeDistances(IEnumerable<Coordinate> coordinates) {
    return from coordinate in coordinates
        let distance = Math.Sqrt(coordinate.X + coordinate.Y)
        select new Result(coordinate, distance);
}

从列表更改为IEnumerable可以让您谨慎处理,以延迟计算的执行。

获得结果序列后,对它们进行排序的最简单方法是使用OrderBy扩展方法。

public IEnumerable<Result> SortByDistance(IEnumerable<Result> results)
{
    return results.OrderBy(result => result.Distance);
}

然后合并所有内容:

List<Coordinate> coordinates = .... // get the list of coordinates somehow;
IEnumerable<Result> distances = ComputeDistances(coordinates);
IEnumerable<Result> sortedByDistance = SortByDistance(distances);
// if you want to get back a list, in order to avoid enumerating multiple times
List<Result> results = sortedByDistance.ToList();