计算多个3d点的距离

时间:2013-08-22 23:18:33

标签: c#

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

如果我有一组坐标

我知道我可以这样做:

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

这会给我一个坐标与另一个坐标相比并返回所有距离<1的坐标。 25.如何将任何给定的坐标集与位置列表中的任何其他给定集进行比较? “占位符”就是给我一些可以反对的东西,但我希望有一种比一次一个地比较它们更容易的方法。

感谢

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

1 个答案:

答案 0 :(得分:1)

蛮力方法可能只是:

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