दिलचस्प पोस्ट
.NET में मेमोरी लीक्स को खोजने के लिए कौन से रणनीतियों और टूल उपयोगी हैं? अंकों की सरणी को पूर्णांक कनवर्ट करें ऑब्जेक्ट की सूची को सॉर्ट करने के लिए कैसे करें GetType क्यों न लौटे <Int32> के बदले System.Int32 लौटाता है? लिनक्स (c ++) में कुल CPU उपयोग कैसे करें केवल स्तंभों की सीमित संख्या को पढ़ें Linux / list.h में कंटेनर_ऑफ मैक्रो के पीछे तर्क Gitmodules में Git submodules आरंभ नहीं किए गए कन्वर्ट यूटीसी समयक्षेत्र या तारीख को ऑफसेट ऑब्जेक्ट के अंदर सभी सहयोगी / समग्र वस्तुएं प्राप्त करें (सार रास्ते में) Android में कर्ल का उपयोग करना Android में मेमोरीफ़ाइल का उपयोग क्या है शेल एक लाइनर को एक फ़ाइल में शामिल करने के लिए एंड्रॉइड में एनडीके में java.lang.UnsatisfiedLinkError को कैसे हल करें? MySQL में एकल उद्धरण चिह्नों को सम्मिलित करें

कैसे दो आकृतियों की तुलना करें?

जब सहिष्णुता शामिल होती है तो क्रूर बल का उपयोग किए बिना, दो ज्यामितीय आकृतियों (या किसी भी दो सामान्य डेटा संरचना) की तुलना करने का कोई तरीका है?

जानवर बल (जो प्रत्येक ऑब्जेक्ट के प्रत्येक मान के दूसरे ऑब्जेक्ट के विरुद्ध तुलना कर रहा है) काम करता है, लेकिन यह धीमा है, और मैं इसका इस्तेमाल नहीं कर सकता।

मैंने डेटा को क्रमबद्ध करने और दो क्रमबद्ध संकलन की तुलना करने की कोशिश की। यह तेज़ है, लेकिन यह केवल शून्य सहिष्णुता के साथ काम करता है। जैसे ही मैं सहिष्णुता जोड़ता हूं, मैं खो जाता हूं। समस्या यह है कि जब मैं तुलना करता हूं और जब मैं सॉर्ट करता हूं तब दो मान समान होते हैं

यहाँ मेरी समस्या का कुछ विवरण हैं I

मेरे एक्सेल VBA ऐड-इन में मेरे पास प्रत्येक दो Point वस्तुओं द्वारा बनाई गई Line ऑब्जेक्ट्स के संग्रह द्वारा बनाई गई Shape ऑब्जेक्ट का संग्रह है I ऐड-इन COM के माध्यम से एक सीएडी ड्राइंग स्कैन और Shape वस्तुओं का संग्रह बनाता है।

एक सरलीकृत संस्करण यह उत्पन्न कर सकता है:

  Shape 1 Shape 2 Point 1 0.0 5.0 0.0 4.9 Point 2 4.9 0.0 5.1 0.0 Point 3 5.0 5.0 5.0 5.0 

मुझे यह पता करने की आवश्यकता है कि कौन सा आकार समान आकार के समान हैं, जहां समान तरीकों का एक ही आकार, आकार और अभिविन्यास है, लेकिन एक ही स्थिति (अभी तक यह तुच्छ नहीं है) प्लस या माइनस सहिष्णुता (अब इतनी तुच्छ नहीं है!)

Point.IsIdenticalTo(OtherPoint)Point.IsIdenticalTo(OtherPoint) को इस प्रकार परिभाषित किया गया है:

 Function IsIdenticalTo(OtherPoint As Point) As Boolean IsIdenticalTo = Abs(X - OtherPoint.X) < Tolerance And Abs(Y - OtherPoint.Y) < Tolerance End Function 

आकार की Shape.IsIdenticalTo(OtherShape) बल का कार्यान्वयन। Shape.IsIdenticalTo(OtherShape) अन्य Shape.IsIdenticalTo(OtherShape) काम करता है, लेकिन यह बहुत धीमा है: यदि प्रत्येक Line(I) में एक समान अन्य आकार OtherShape.Line(J) और वाइसवर्सा, तो दो आकार समान होते हैं। कभी-कभी मेरे सैकड़ों आकृतियां सैकड़ों पंक्तियों से होती हैं, इसलिए मेरे लिए बल बल समाधान काम नहीं करता है।

मैंने सॉर्ट किए गए संकलन से जुड़े दो तरीकों की कोशिश की दोनों तेजी से हैं क्योंकि दो क्रमबद्ध संकलन की तुलना में जानवर बल की तुलना में तेज़ है, लेकिन दोनों कुछ स्थितियों में विफल होते हैं:

  1. एक SortedValues संग्रह में सभी लाइनों के सभी एक्स और वाई मान शामिल हैं SortedValues मूल्यों को सॉर्ट किया जाता है, इसलिए यह जानकारी है कि मान X है या Y खो जाता है मैंने समस्याओं के बिना महीनों के लिए इस दृष्टिकोण का उपयोग किया है, लेकिन यह उदाहरण के लिए विफल रहता है जब दो आकारों के बीच का अंतर अंक (10, 20) और (20, 10) । मैंने मूल्यों की सूची में रेखा के कोण को जोड़ दिया, चीजों में सुधार हुआ है, लेकिन अभी भी ऐसे मामलों हैं जहां यह दृष्टिकोण विफल हो जाता है, क्योंकि कुछ जानकारी खो जाती है जब मूल्य एक साथ क्रमबद्ध होते हैं। उपरोक्त उदाहरण में यह दृष्टिकोण निम्नलिखित संग्रहों के साथ काम करेगा:

     Shape 1 Shape 2 0.0 0.0 0.0 0.0 4.9 4.9 5.0 5.0 5.0 5.0 5.0 5.1 
  2. एक क्रमबद्ध पंक्ति संग्रह में सभी लाइनों को काउंटर-घड़ी की तरह क्रमबद्ध और मूल के सबसे निकटतम बिंदु से शुरू होता है। यह दृष्टिकोण किसी भी जानकारी को नहीं खोता है, लेकिन यह उपरोक्त उदाहरण में विफल रहता है क्योंकि सॉर्टिंग एल्गोरिदम समानता तुलना से सहमत नहीं है यदि सहिष्णुता 0.5 है, तो उन्हें समान होना चाहिए, लेकिन सॉर्टिंग एल्गोरिदम नीचे दिखाए गए संग्रह का उत्पादन करता है। चीजें अधिक कठिन हो जाती हैं क्योंकि मेरे आकार में उप आकार होते हैं, इसलिए प्रत्येक आकार पर कई प्रारंभिक बिंदु होते हैं।

      Shape 1 Shape 2 Point 1 4.9 0.0 0.0 4.9 Point 2 5.0 5.0 5.1 0.0 Point 3 0.0 5.0 5.0 5.0 

संपादित करें:

आकृतियों को एक बाहरी ग्राफिकल अनुप्रयोग से COM के माध्यम से आयात किया जाता है एक आकृति आयताकार के रूप में या जितनी जटिल हो सकती है, उतनी जटिल होती है जितनी फैंसी रूपरेखा, 10 आंतरिक आकृतियों और 30 लाइनों के अंदर। वे छेद और सरल सजावट के साथ पैनल का प्रतिनिधित्व करते हैं, और कभी-कभी उनके पास एक देखा-दांत का आकार होता है, जो किनारों के दर्जन से अधिक होते हैं।

Solutions Collecting From Web of "कैसे दो आकृतियों की तुलना करें?"

  1. बहुभुज के रूप में आकार संभाल

    इस चित्र पर लाइनों (length,angle) सेट करने के लिए अपने अंक (प्रत्येक पंक्ति) को परिवर्तित करें:

    बहुभुज प्रतिनिधित्व

    यह रोटेशन / अनुवाद पर अन्वेषण सुनिश्चित करता है। यदि आप angle=PI साथ और अधिक रेखाएं देखते हैं तो अलग-अलग नमूनाकरण के साथ समान आकार की मिस तुलना से बचने के लिए उन्हें एक साथ मिलें , दोनों आकृतियों के लिए एक ही सीडब्ल्यू / सीसीडब्ल्यू बहुभुज घुमावदार नियम का मिलान करने का प्रयास करें।

  2. प्रारंभ बिंदु खोजें

    सबसे बड़ा या सबसे छोटा angle, length … या angles+lengths विशिष्ट क्रम angles+lengths इसलिए एक बहुभुज (cyclic shift) पुन: व्यवस्थित करें ताकि आपके आकृतियों की तुलना 'उसी बिंदु' से की जा सकती है यदि वे कर सकते हैं

  3. तुलना – सटीक मिलान के लिए

    • लाइनों की संख्या समान होनी चाहिए
    • परिधि समान होना चाहिए + – कुछ सटीकता

    उदाहरण के लिए:

     fabs (sum of all lengths of poly1 - sum of all lengths of poly2) <= 1e-3 

    अगर आकार अलग नहीं हैं फिर सभी लंबाई और कोणों की तुलना करें अगर कोई भी मान अधिक सटीकता मूल्य के बराबर है तो आकृति भिन्न होती है।

  4. तुलना – आकार कोई फर्क नहीं पड़ता

    बहुभुज l1,l2 दोनों के परिधि की गणना और l1,l2 की परिधि से मेल खाने वाली तुलनात्मक poly2 सभी लम्बाई का आकार l1,l2 इसलिए poly1 सभी लंबाई value = l1/l2; गुणा होती है value = l1/l2; । इसके बाद बुलेट # 3 से तुलना की तुलना करें

  5. तुलना-आकार विचलन अभी भी सकारात्मक मैच बना सकते हैं (आकार समान होना चाहिए)

    एक ही मूल्य के लिए लाइनों की संख्या निर्धारित करने की कोशिश करें ( PI करीब कोण के साथ सभी लाइनों में शामिल हों) तब परिमीटर्स को "मिलान" करना चाहिए … fabs(l1-l2)<=1e-3*l1 आप बुलेट # 4 तुलना का उपयोग कर सकते हैं

  6. तुलना – आकार और आकार विचलन अभी भी मैच कर सकते हैं

    केवल poly2 की परिधि के साथ बुलेट # 4 के रूप में मिलान करने के लिए poly2 का आकार बदलें और फिर बुलेट # 5 का उपयोग करें

यदि आपको बूथ बहुभुजों (बुलेट # 2 ) में प्रारंभ बिंदु नहीं मिल सकता है,

फिर आपको सभी शुरुआती बिंदु बदलावों की जांच करनी होगी ताकि आपके बहुभुज में बूथ 5 लाइनें हों:

  poly1: l11,l12,l13,l14,l15 poly2: l21,l22,l23,l24,l25 

फिर आपको सभी 5 संयोजनों की तुलना करना पड़ता है (जब तक कि आप जल्द ही मिलान नहीं पाते हैं):

  cmp (l11,l12,l13,l14,l15),(l21,l22,l23,l24,l25) cmp (l11,l12,l13,l14,l15),(l22,l23,l24,l25,l21) cmp (l11,l12,l13,l14,l15),(l22,l23,l24,l25,l21) cmp (l11,l12,l13,l14,l15),(l23,l24,l25,l21,l22) cmp (l11,l12,l13,l14,l15),(l24,l25,l21,l22,l23) cmp (l11,l12,l13,l14,l15),(l25,l21,l22,l23,l24) 

[टिप्पणियाँ]

  1. तुलना करने के लिए भी तेज़ तरीके हैं लेकिन वे कुछ मामलों में याद कर सकते हैं

    • आप लाइनों, कोणों के हिस्टोग्राम की तुलना कर सकते हैं
    • आप तंत्रिका नेटवर्क का उपयोग कर सकते हैं (मैं उन्हें पसंद नहीं करता लेकिन वे इस तरह वर्गीकरण के लिए आदर्श हैं)
  2. यदि आपके आकार को एक ही तरीके से उन्मुख होना है (कोई रोटेशन invariance नहीं)

    फिर ऊपरी कोण के बजाय लाइन दिशा कोण का उपयोग करें

  3. यदि आप दोनों तुलनात्मक बहुभुजों के लिए एक ही घुमावदार नियम सुनिश्चित नहीं कर सकते हैं

    तो आपको उन्हें बूथ की जांच करनी है:

     cmp (l11,l12,l13,l14,l15),(l21,l22,l23,l24,l25) cmp (l11,l12,l13,l14,l15),(l25,l24,l23,l22,l21) 

मुझे पता है कि यह थोड़ा अस्पष्ट उत्तर है, लेकिन अभी भी उम्मीद है कि यह कम से कम थोड़ी मदद करता है …

मेरी भी यही समस्या है। मैं दूरी के साथ भारित शीर्ष के आसन्न मैट्रिक्स की गणना करता हूं। यह सभी पक्ष लंबाई और विकर्णों की गणना करता है तो अगर मैट्रिक्स की प्रत्येक पंक्ति या स्तंभ का मॉड्यूल दूसरे मैट्रिक्स के साथ समान होता है, तो दो आकार समान होते हैं। सहिष्णुता के लिए सिर्फ समारोह दौर () शुरू करने से पहले का उपयोग करें जटिलता ओ (एन 2/2) है, क्योंकि आपको सममितीय मैट्रिक्स का सिर्फ एक आधा हिस्सा है जो सममित है। समस्या यह है कि मुझे पता नहीं लगा सकता कि कोई आकार फ़्लिप किया गया है या नहीं।