2012-01-18 34 views
7

Tôi có hai điểm 3-D.
Ví dụ:Thuật toán để tính khoảng cách giữa 2 điểm 3 chiều?

float[] point1 = new float[3] {1.3919023, 6.12837912, 10.391283}; 
float[] point2 = new float[3] {48.3818, 38.38182, 318.381823}; 

Bất cứ một ý tưởng cho một thuật toán để tính toán khoảng cách trong phao giữa các điểm?

+14

Chúng tôi sẽ cho bạn biết càng sớm càng cố mất điện Wikipedia kết thúc. – Nathan

+2

Nếu cộng đồng không thể trả lời câu hỏi này mà không googling thì thế giới sẽ bị tiêu diệt. Điều này nhắc tôi nhớ: tại sao bạn không google điều này? – Jon

Trả lời

21

Khoảng cách Euclide giữa hai điểm 3D là:

float deltaX = x1 - x0; 
float deltaY = y1 - y0; 
float deltaZ = z1 - z0; 

float distance = (float) Math.Sqrt(deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ); 

Và trong kích thước N (chưa được kiểm tra và dễ bị tràn):

float DistanceN(float[] first, float[] second) { 
    var sum = first.Select((x, i) => (x - second[i]) * (x - second[i])).Sum(); 
    return Math.Sqrt(sum); 
} 

Edit: Tôi rất thích các giải pháp Zip gửi bởi dasblinkenlight dưới đây!

+0

bạn có nghĩa là delta x bình phương phải không? –

+0

Cảm ơn, thưa bạn. – Headpuster

+0

@JohnBoker: Đã khắc phục, cảm ơn. Ngoài ra câu hỏi này đã được hỏi MANY lần ở đây trên SO .... –

4

Giống như 2D nhưng với thêm một phối hợp:

P1(x1, y1, z1); P2(x2, y2, z2) 

d = SquareRootOf((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2) + (z1-z2)*(z1-z2)); 

Rõ ràng là không viết ra trong C# nhưng bạn sẽ có được ý tưởng.

2

Nếu bạn có hai điểm:
P1 = (x1, y1, z1)
P2 = (x2, y2, z2)
khoảng cách là SQRT((x2-x1)^2 + (y2-y1)^2 + (z2-z1)^2)

Vì vậy, bạn có thể sử dụng

float deltax = point2[0] - point1[0]; 
float deltay = point2[1] - point1[1]; 
float deltaz = point2[2] - point1[2]; 
float distance = (float) Math.Sqrt(
    (deltax * deltax) + 
    (deltay * deltay) + 
    (deltaz * deltaz)); 
16

Trong C# với LINQ bạn có thể thực hiện việc này:

var dist = Math.Sqrt(point1.Zip(point2, (a, b) => (a - b)*(a - b)).Sum()); 

Th được tổng hợp bình phương khác biệt theo cặp giữa các tọa độ riêng lẻ và trả về căn bậc hai số học của tổng.

EDIT: Giải pháp này hoạt động cho bất kỳ số lượng thứ nguyên nào lớn hơn hoặc bằng một (nhờ Austin Salonen chỉ ra nó).

+0

Rất đẹp n-chiều giải pháp –

+0

này trông tuyệt vời dòng duy nhất: D bạn đã kiểm tra để xác minh nó hoạt động hay không? – MonsterMMORPG

+0

@MonsterMMORPG Khi kích thước của kết quả 'point1' và' point2', nó không có lựa chọn nào khác ngoại trừ việc tạo căn bậc hai của tổng số bình phương khác biệt theo cặp :-) – dasblinkenlight

10

enter image description here

float distance=(float) Math.Sqrt(Math.Pow(point1[0]-point2[0],2) + Math.Pow(point1[1]-point2[1],2) + Math.Pow(point1[2]-point2[2],2))

Các vấn đề liên quan