2012-11-14 7 views
6

खोजने के लिए वहाँ ग में किसी भी इनबिल्ट समारोह ++ या सी पुस्तकालयों कि 2-डी अंतरिक्ष में दो अंक के बीच की दूरी को खोजने के लिएअंतर्निर्मित समारोह दूरी

पुनश्च इस्तेमाल किया जा सकता है: मुझे पता है कि यह कैसे अपने आप को लागू करने के लिए।

+5

2 डी स्पेस पर असीमित कई मान्य "दूरी कार्य" हैं। किसी को भी यह जानना चाहिए कि आप कौन सी चाहते हैं? –

+3

अंक के लिए एक अंतर्निहित डेटा संरचना भी नहीं है ... –

+5

@ केरेरेकबी फ्रांसीसी रेलवे मीट्रिक, ज़ाहिर है। –

उत्तर

5

ठीक है, आप complex numbers पर गणित का उपयोग कर सकते हैं:

using point_t = std::complex<int>; 

double distance(point_t a, point_t b) { 
    std::sqrt(norm(b - a)) 
} 

मुझे लगता है कि यह अपनी खुद की समारोह लेकिन वास्तविक दूरी तर्क है नहीं लिख के अपने आवश्यकता को पूरा नहीं करता है काफीstd::norm function में लागू किया गया। यह सिर्फ दूरी के वर्ग लौटाता है।

+2

कुछ सीमित अनुभव से मैं यह सुझाव दूंगा कि वर्ग रूट वास्तव में एक आवश्यक संचालन है या नहीं। अक्सर आप अपनी सभी समस्याओं को अकेले दूरी के साथ हल कर सकते हैं (याद रखना कि स्क्वायरिंग मोनोटोनिक है), इसलिए इस महंगे ऑपरेशन को रखने की कोई आवश्यकता नहीं है। –

+1

@ केरेकस्क बी * यदि * आपको केवल दूरी की तुलना करने की आवश्यकता है, हां। मैं इस बिंदु पर जवाब रखना चाहता था, हालांकि, और मैं एक विशेष उपयोग-केस नहीं मानना ​​चाहता था। –

+0

उपरोक्त शरीर को 'std :: abs (b-a)' के साथ बदलकर कोई डाउनसाइड्स हो सकता है? (['std :: complex' से' std :: abs'] (http://en.cppreference.com/w/cpp/numeric/complex/abs))? 'Std :: norm' और' std :: abs' के कार्यान्वयन की तुलना [libstdC++] में (https://gcc.gnu.org/onlinedocs/gcc-4.6.3/libstdc++/api/a00812_source.html), यह ऐसा लगता है कि उत्तरार्द्ध उनको स्क्वायर करने से पहले, उनमें से सबसे लंबे समय तक वास्तविक और जटिल घटक की लंबाई को संशोधित करता है। 'Std :: norm' दृष्टिकोण का उपयोग करने से ऐसा कोई भी" घटक सामान्यीकरण "नहीं होगा। 'Std :: abs' (impl।) दृष्टिकोण का उपयोग करने के लिए अप/डाउनसाइड्स क्या हो सकता है? – dfri

1

नहीं, क्योंकि 2 डी वेक्टर भाषा का एक प्रकार का हिस्सा नहीं है।

आपकी ज़रूरतों के आधार पर, कई गणित/गेम/अनुकरण पुस्तकालय हैं जिनका उपयोग 2 डी समन्वय वस्तुओं को लागू करने के लिए किया जा सकता है और आपको ऐसे बिंदुओं के बीच की दूरी खोजने के लिए कार्यों के साथ प्रदान करेगा।

+0

हस्ताक्षर 'डबल दूरी (x1, x2, y1, y2)' के साथ केवल एक फ़ंक्शन क्यों नहीं? – none

+0

क्योंकि यह "अंतर्निर्मित" नहीं है - अगर इनबिल्ट का अर्थ है "भाषा या मानक पुस्तकालयों का हिस्सा" जैसा कि मुझे लगता है कि यह – emartel

1

खैर मुझे लगता है कि यह पता लगाने के लिए आसान है:

एक 3 डी अंतरिक्ष में दो अंक के बीच रैखिक दूरी।

d = sqrt ((x2 - x 1)^2 + (y2 - y1)^2 + (z2 - z1)^2)

मैनहट्टन दूरी, विभिन्न बहुत 2 डी में प्रयोग किया जाता है गेम्स:

डी = | (x2 - x1) | + | (वाई 2 - वाई 1) |

typedef struct { 
    float x, y, z; 
} point_t; 

typedef struct { 
    int x, y; 
} point2d_t; 

double distanceFinder(point_t a, point_t b) 
{ 
    return sqrt(pow(a.x-b.x, 2.0) + pow(a.y-b.y, 2.0) + pow(a.z-b.z, 2.0)); 
} 

int manhattanFinder(point2d_t a, point2d_t b) 
{ 
    /* Considering the points have integer coordinates and is a 2D game */ 
    return abs(a.x - b.x) + abs(a.y - b.y); 
} 
+2

है ... लेकिन ओपी पहले से ही निर्दिष्ट कर चुका है कि वे इसे स्वयं लागू करने के बारे में जानते हैं। –

+2

क्या आपको मैनहट्टन दूरी में 'abs' की आवश्यकता नहीं है? – none

+2

मुझे लगता है कि मैनहट्टन दूरी अभी भी गलत है, यह 'd = | (x2-x1) | + | (y2-y1) | 'इसके बजाय होना चाहिए। – none

1

इतना नहीं।

2 डी दूरी एक गणितीय कार्य है, और, यदि हम सी/सी ++ में हमारे लिए उपलब्ध गणितीय कार्यों को देखते हैं, तो हम पाते हैं कि वे संख्याओं पर काम करते हैं।

लेकिन यह गैर विशिष्ट है: हम वास्तव में क्या पाते हैं कि कार्यों के अलग-अलग प्रकार (सी में) हैं या विभिन्न प्रकारों (int, float, double, & c) पर संचालित करने के लिए अधिभारित (सी ++ में) हैं। । या तो यह, या कास्टिंग किया जाता है।

सौभाग्य से, सीमित प्रकार के संख्याएं हैं, इसलिए यह सामान्य पुस्तकालयों को इस तरह की चीज करने के लिए समझ में आता है।

अब, क्या हम गणितीय कार्यों का निर्माण करते समय एक 2 डी दूरी समारोह का निर्माण कर सकते हैं? आप तुरंत इसे और अधिक कठिन देखेंगे, क्योंकि अंक का प्रतिनिधित्व करने के कई तरीके हैं। उदाहरण के लिए, कार्टेसियन बनाम रेडियल, एक्स-वाई बनाम आई-जे, डबल बनाम फ्लोट बनाम int। हमारी सामान्य 2 डी दूरी को इन सभी संभावनाओं को कवर करने की आवश्यकता होगी।

अधिकांश पुस्तकालय जिनमें 2 डी दूरी समारोह है, संभावनाओं की संख्या को कम करने के लिए बिंदु संरचनाओं के साथ होगा।

हालांकि, कम से कम एक डेटा संरचना लागू की गई है जो एक बिंदु को स्टोर कर सकती है और मानक पुस्तकालयों का उपयोग करके 2 डी दूरी खोजने के लिए उपयोग की जा सकती है: जटिल संख्याएं!

// norm example 
#include <iostream> 
#include <complex> 
using namespace std; 

int main() 
{ 
    complex<double> mycomplex (3.0,4.0); 

    cout << "The norm of " << mycomplex << " is " << norm(mycomplex) << endl; 

    return 0; 
} 

लेकिन ऐसा लगता है कि आप यूक्लिडियन दूरी के बारे में बात कर रहे हैं। आप मैनहट्टन दूरी या अधिक विदेशी मीट्रिक के बारे में भी बात कर सकते हैं। मैंने जिन सभी संभावनाओं का उल्लेख किया है, उनके लिए खाते की कोशिश करने के बजाय, भाषा डिजाइनरों ने इस समारोह को लागू न करने का विकल्प चुना है। (या इनमें से कई, कई अन्य कार्यों जैसे कि कोई भी इस सवाल के बारे में उचित रूप से पूछ सकता है)।

संपादित: या आप अंक घटाना और C99 मानक से hypot फ़ंक्शन का उपयोग कर सकते हैं। here देखें।

0

Boost.Geometry कार्टेशियन और गैर-कार्टेशियन दूरी के लिए कार्य करने का दावा करता है।

संबंधित मुद्दे