2013-08-22 78 views
0

在問這個問題之前,我確實做過一些搜索,但是如何確定給定的座標集合,哪些座標位於另一個範圍內?計算多個3d點的距離

,如果我有一組座標

我知道我可以這樣做:

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的值(或其中的一些表示),因爲它們都在彼此之內。 3,4,5的值與其他任何東西都很接近,所以我不想看到它們。我給了7個值,但是我最終擁有的列表可能有數百個我想要比較的x/y/z位置。

+0

這真的取決於 - 你想要什麼,如果你有10個座標,在一行已返回,等間隔,每隔24個單位? –

+0

@ReedCopsey你的意思是相差4個單位,因爲OP正在看距離的平方。 – Teepeemm

+0

@Teepeemm否 - 我的意思是24,因爲OP的「返回所有距離<25」 –

回答

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)); 
+0

蠻力現在工作。功能第一,然後我可以擔心它使漂亮。花了我20分鐘掃描我的源數據,拿出1200分的收集,這幾乎需要0時間來處理,所以我稱之爲勝利。謝謝! –