2012-01-18 16 views
7

मेरे पास दो 3-डी अंक हैं।
उदाहरण:एल्गोरिदम?

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

किसी को भी एक एल्गोरिथ्म अंक के बीच नाव में दूरी की गणना करने के लिए के लिए एक विचार?

+14

हम आप जैसे ही विकिपीडिया के अंधकार समाप्त हो जाती है इसकी जानकारी देंगे। – Nathan

+2

यदि समुदाय गुगलिंग के बिना इसका उत्तर नहीं दे सका तो दुनिया बर्बाद हो गई है। जो मुझे याद दिलाता है: आपने यह क्यों Google नहीं किया? – Jon

उत्तर

21

दो 3 डी अंक के बीच इयूक्लिडियन दूरी है:

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

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

और एन आयामों में (अपरीक्षित और अतिप्रवाह की चपेट में):

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

संपादित करें: मैं बहुत Zip समाधान तैनात पसंद करते हैं नीचे dasblinkenlight द्वारा!

+0

क्या आपका मतलब डेल्टा एक्स वर्ग सही है? –

+0

धन्यवाद, महोदय। – Headpuster

+0

@ जॉन बोकर: फिक्स्ड, धन्यवाद। इसके अलावा इस सवाल को कई बार यहां पूछा गया है .... –

4

की तरह 2 डी लेकिन साथ एक और समन्वय:

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

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

जाहिर सी # में नीचे नहीं लिखा है, लेकिन आप विचार मिलता है।

2

आप दो अंक है:
P1 = (x1, y1, z1)
P2 = (x2, y2, z2)
दूरी है SQRT((x2-x1)^2 + (y2-y1)^2 + (z2-z1)^2)

तो तुम इस्तेमाल कर सकते हैं

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

सी # में LINQ के साथ आप यह कर सकते हैं:

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

गु अलग-अलग निर्देशांक के बीच वर्ग के जोड़ों के अंतर को बढ़ाता है, और योग की अंकगणितीय वर्ग रूट देता है।

संपादित करें: यह समाधान किसी भी आयाम के लिए अधिक या बराबर के लिए काम करता है (ऑस्टिन सैलूनन को इंगित करने के लिए धन्यवाद)।

+0

बहुत अच्छा एन-आयामी समाधान –

+0

यह शानदार सिंगल लाइन दिखता है: डी क्या आपने यह सत्यापित करने के लिए परीक्षण किया है या नहीं? – MonsterMMORPG

+0

@MonsterMMORPG 'point1' और' point2' मिलान के आकार के दौरान, स्क्वायर जोड़ी के अंतर के वर्ग रूट को छोड़कर इसके अलावा कोई अन्य विकल्प नहीं है :-) – 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))