计算多个三维点的距离
本文关键字:距离 三维 计算 | 更新日期: 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));