【问题标题】:Two Dimensional Array farthest point search二维数组最远点搜索
【发布时间】:2019-01-27 03:19:07
【问题描述】:

我试图通过比较pointsToSearchFrom 列表中每个点与pointCloudToSearchList 中其他点的距离来检索集合中最远的点。您可以从所附图像中看到示例场景。我仍然不是导航这些数据结构的专家,而且这个算法超出了我目前遍历二维数组的知识。

这是我知道的代码。任何帮助都会很棒。

public static void Test(List<Point3d> pointsToSearchFrom, List<Point3d> pointCloudToSearch)
{
    int rows = pointsToSearchFrom.Count;
    int columns = pointCloudToSearch.Count;
    double[,] arrayDistance = new double [rows, columns];

    for (int i = 0; i < pointsToSearchFrom.Count; i++)
    {
        for (int j = 0; j < pointCloudToSearch.Count; j++)
        {
            arrayDistance[i, j] = (pointsToSearchFrom[i] - pointCloudToSearch[j]).magnitude;
        }
    }
}

【问题讨论】:

  • 这是作业吗?但是,嘿,你快到了,我相信你可以用两个for 进行迭代,就像你如何计算点之间的距离并找到最大值或最小值一样。但是,如果您只关心最大或最小距离,则可以转储找到的最大 ij 点,如果距离大于前一个距离,则更新它。
  • 不,这不是家庭作业,哈哈,这只是我想做的个人工作,但我不是编码方面的专业人士。是的,最小或最大距离是直前言,但是我不知道如何根据距离检索pointsToSearchFromList中最远的点
  • 所以你这里有两组点。您希望形成所有可能的点对,其中第一个来自第一组,第二个来自第二组。从这组对中,您希望找到使点之间的欧几里得距离最大化的对?
  • @EricLippert 是的,没错。我需要做的下一步是对存储在每行中的所有距离进行排序,然后选择每行上最长的距离,这将产生一个 9X1 Array,然后可以转换为 List ,因此它与pointsToSearchFrom 具有相同的数据结构。然后我可以找到距离最远的项目的索引,并用它来检索我离pointsToSearchFrom最远的点。但我似乎无法想出一种方法来对每一行的数据进行排序。

标签: c# arrays search


【解决方案1】:

一开始我并没有意识到这是 3D。我使用一个类和列表来存储 2 个点和它们之间的距离。这样我不仅可以获得最长的距离,还可以获得产生距离的 2 个点。

    public class Distances
    {
        public double Distance { get; set; }
        public Point3D FromPoint { get; set; }
        public Point3D ToPoint { get; set; }

        public Distances(Point3D from, Point3D to)
        {
            FromPoint = from;
            ToPoint = to;
            Distance = (to - from).Length;
        }
    }
    private void OP2()
    {
        List<Point3D> searchFrom = new List<Point3D>()
        {
        new Point3D(20,30,50),
        new Point3D(10,50,10),
        new Point3D(30,40,20),
        new Point3D(60,30,10)
        };

        List<Point3D> searchCloud = new List<Point3D>()
        {
        new Point3D(60,70,80),
        new Point3D(110,30,30),
        new Point3D(80,110,55),
        new Point3D(90,20,90)
        };
        List<Distances> resultDistances = new List<Distances>();
        foreach (Point3D p1 in searchFrom)
        {
            foreach (Point3D p2 in searchCloud)
            {
                Distances d = new Distances(p1, p2);
                resultDistances.Add(d);
            }
        }
        //The following is just for testing purposes, skip to var longestDistance
        List<Distances> distancesInOrder = resultDistances.OrderByDescending(i => i.Distance).ToList<Distances>();
        foreach (Distances d in distancesInOrder)
        {
            Debug.Print($"From Point ({d.FromPoint.X}, {d.FromPoint.Y}, {d.FromPoint.Z}) To Point ({d.ToPoint.X}, {d.ToPoint.Y}, {d.ToPoint.Z}) Distance = {d.Distance}");
        }
        var longestDistance = resultDistances.OrderByDescending(i => i.Distance).FirstOrDefault();
        //this gives you the longest distance and the two points
        MessageBox.Show($"First Point ({longestDistance.FromPoint.X}, {longestDistance.FromPoint.Y}, {longestDistance.FromPoint.Z}) Cloud Point ({longestDistance.ToPoint.X}, {longestDistance.ToPoint.Y}, {longestDistance.FromPoint.Z}) Distance = {longestDistance.Distance}");
    }

【讨论】:

  • 是的,我以前使用过类似的方法并且它有效,但我也对能够将数据存储在多维数组中非常感兴趣。例如一个 9X8 数组,对应 9 行存储点数和 8 列对应距离数。然后能够遍历每一行并对距离进行排序,以进一步检索例如最短距离。然后,此操作将创建一个 9X1 维度的新矩阵。你知道有什么好的资源可以开始研究这个吗?
  • distancesInOrder 包含Distances 类的排序列表,因此您可以搜索从点、云点和存储在最后一个项目中的距离之间的距离。您可以轻松选择最低和最高索引以获取有关点和距离的所有信息。
【解决方案2】:

您可以为此使用二维数组,但您不必这样做。

你需要的是 MaxBy 方法,可以在这里找到:

https://github.com/morelinq/MoreLINQ/blob/master/MoreLinq/MaxBy.cs

我们首先构建一个对的序列:

var pairs = from first in pointsToSearchFrom
            from second in pointCloudToSearch
            select new { first, second };

请注意,在 C# 7 中,您将使用元组,而不是匿名类型。

现在我们有了所有可能对的序列。使用 MaxBy 找到最大化给定数量的对:

var maxPair = pairs.MaxBy(pair => (pair.first - pair.second).magnitude);

现在你已经完成了:

Console.WriteLine($"{maxPair.first} --> {maxPair.second});

如果您有大量的点集合(例如数千或数百万),那么您必须使用特殊技术,因为如果有数千个点,那么就会有数百万对,如果有数百万点数将有数万亿对。但如果你只有一小撮,这种技术就可以了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-21
    • 2014-06-26
    • 2014-05-05
    • 1970-01-01
    • 1970-01-01
    • 2018-04-13
    • 2014-03-04
    • 2022-11-29
    相关资源
    最近更新 更多