计算多个三维点的距离

本文关键字:距离 三维 计算 | 更新日期: 2023-09-27 18:28:46

在问这个问题之前,我确实做了一些搜索,但我如何确定给定的坐标集合,哪些坐标在彼此的范围内?

如果我有一组坐标

我知道我可以做一些类似的事情:

float[] point1 = new float[3] {756.0,26.0,-1410.0};
float[] point2 = new float[3] {752.0,28.0,-1391.0};
float[] point3 = new float[3] {552.0,28.0,12.0};
float[] point4 = new float[3] {668.0,29.0,12.0};
float[] point5 = new float[3] {869.0,35.0,13.0};
float[] point6 = new float[3] {768.0,29.0,-1407.0};
float[] point7 = new float[3] {769.0,35.0,-1393.0};

然后将一组坐标与另一组坐标进行比较,但我希望做的是有一个坐标列表,我想显示那些只在某个范围内的坐标。我只是不知道如何一次做1个以上。

List<float[]> Positions = new List<float[]>();
float[] location = new float[3] { entity.X, entity.Y, entity.Z }
Postions.Add(location)
... loop thru and add all values ...
            int rSquare = 25;  //minimum distance I want to be less than
            int x0 = 10, y0 = 10, z0 = 10;  //placeholder because I dont know what I'm comparing against
            var res = locations
                .Select(tmp =>
                {
                    return new
                    {
                        x = tmp[0],
                        y = tmp[1],
                        z = tmp[2]
                    };
                })
                .Where(p => (p.x - x0) * (p.x - x0) + (p.y - y0) * (p.y - y0) + (p.z - z0) * (p.z - z0) < rSquare)  
                .ToList();

这将给我一个坐标与另一个坐标的比较,并返回所有具有距离<25.如何将任何给定的坐标集与"位置"列表中的任何其他给定坐标集进行比较?"占位符"只是为了给我一些反对的东西,但我希望有一种比一次将它们与自己进行比较更简单的方法。

感谢

编辑回应:我希望我能取回彼此之间在所需距离内的任何坐标。在这种情况下,从给定的7点中,我希望看到1,2,6和7的值(或其中的一些表示),因为它们都在25以内。3,4,5的值与其他值相距甚远,所以我不想看到它们。我给出了7个值,但我最终得到的列表可能有数百个我想比较的x/y/z位置。

计算多个三维点的距离

暴力方法可以是:

 // Given a distance function:
 double DistSq(float[] point1, float[] point2)
 {
      return (point1[0] - point2[0]) * (point1[0] - point2[0]) 
      + (point1[1] - point2[1]) * (point1[1] - point2[1]) 
      + (point1[2] - point2[2]) * (point1[2] - point2[2]); 
 }

你可以做:

 distance = 5; // How far apart can 2 points be...
 double distSq = distance * distance;
 var pointsWithoutOutliers = Positions.Where(p => Positions.Any(o => !Object.ReferenceEquals(o,p) && DistSq(p,0)<distSq));