簡體   English   中英

計算每個x和y坐標的距離

[英]Calculate the distance for each x and y coordinate

我正在寫一個函數來計算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;
        }
    }

根據您的描述,您無需創建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);

如果您嘗試為輸入和輸出定義適當的數據結構,則將更有幫助。 它可能像元組一樣簡單,也可能是結構或類之類的更慣用的東西。

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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM