2016-07-19 5 views
7

(http://eloquentjavascript.net/07_elife.html)एक ग्रिड की स्थापना। वाक्पटु js अध्याय 7

इम एक कठिन समय समझ में क्या ग्रिड तरीकों हम .Get जोड़ा गया है और यहां तक ​​कि do.Firstly .Set होने की सुविधा देता है एक उदाहरण के मामले के माध्यम से जाना। var grid = new Grid(5,5); अब स्थान 25 तत्वों की एक सरणी है। और निश्चित रूप से width और heightare 5.

अब सवाल यह है कि "पाने" की विधि क्या है।

अब हम कहा console.log(grid.get(new Vector(1, 1)));.

तो x1 हो जाता है, y नई वस्तु हम बनाया में 1 हो जाता है। बेशक हमें ग्रिड करने की ज़रूरत है। इस प्रकार हम this.space[1+ 1 * 5] पर वापस आते हैं यानी स्पेस सरणी में 6 वें स्थान पर 25 तत्व लंबे हैं। तो यह प्रिंट अपरिभाषित क्यों करता है? क्या ऐसा इसलिए है क्योंकि अंतरिक्ष सरणी में कुछ भी नहीं है?

TLDR

कैसे .get और .set प्रोटोटाइप यहाँ काम करते हैं (वे क्या करते हैं)? हम return this.space[vector.x + this.width*vector.y]; क्यों सेट करते हैं, क्या vector.x+this.width*vector.y पर कुछ संख्यात्मक महत्व है?

function Vector(x,y){ 
     this.x = x; 
     this.y = y; 
    } 

    Vector.prototype.plus = function(other){ 

     return new Vector(this.x + other.x, this.y + other.y); 
    } 


    var grid = ["top left", "top middle", "top right", 
     "bottom left", "bottom middle", "bottom right"]; 


    function Grid (width,height){ 

     this.space = new Array(width * height); 
     this.width = width; 
     this.height = height; 

    } 

    Grid.prototype.isInside = function(vector){ 


     return vector.x >=0 && vector.x<this.width && vector.y>=0 && vector.y<this.height; 

    } 

    Grid.prototype.get = function(vector){ 

     return this.space[vector.x + this.width*vector.y]; 
     // 5 + 5 * 1; 

    } 

    Grid.prototype.set = function(vector,value){ 

     this.space[vector.x + this.width *vector.y] = value; 

    } 

    var grid = new Grid(5, 5); 

    console.log(grid.get(new Vector(1, 1))); 
    // → undefined 
    grid.set(new Vector(1, 1), "X"); 
    console.log(grid.get(new Vector(1, 1))); 
    // → X 

उत्तर

6

मुझे नहीं पता कि मैं आपके द्वारा पहले से अनुसरण किए जा रहे लेख से स्पष्ट हो सकता हूं, लेकिन मैं इसे आज़मा दूंगा।

यह: new Array(25) इस के बराबर है: [undefined, undefined, undefined, ...25x]

अपने कोड में, आप इस राशि:

var grid = ["top left", "top middle", "top right", "bottom left", "bottom middle", "bottom right"];

तो एक ही वार फिर से घोषणा की:

var grid = new Grid(5, 5);

तो, अंत में, grid इक्वा है एल से [undefined, undefined, undefined, ...]। यही कारण है कि आप कुछ भी सेट करने से पहले अपरिभाषित हो जाते हैं।


get और set, बस सरणी में एक आइटम की स्थिति को मिल जाए, और पढ़ा है, या कहा स्थिति में मूल्य में लिखें। यह वह कोड है जो सरणी में स्थिति पाता है: vector.x+this.width*vector.y।इसे तोड़ने के नीचे दो:

vector.x = तालिका स्तंभ

vector.y = तालिका पंक्ति

कल्पना कीजिए एक मेज 3x2 = [ 'row0 col0', 'row0 col1', 'row0 col2', 'ROW1 col0' , 'row1 col1', 'row1 col2']

अब हम कॉल 2, पंक्ति 1, new Vector(2, 1) पर आइटम चाहते हैं। यह हमारे सरणी में स्थिति 5 पर आइटम है। तो, पंक्ति 1 (this.width * vector.y) = (3 * 1) से शुरू करें, कॉलम 2 (+ vector.x) = (+ 2)

पर आइटम प्राप्त करें। यह प्रत्येक का आकार है पंक्ति, इसलिए जब आप vector.y से गुणा करते हैं, तो इसका मतलब है वेक्टर। वे पंक्तियों की एक निश्चित संख्या के बराबर है। फिर वहां से, आप केवल कॉलम स्थिति (vector.x) को जोड़ते हैं।


का प्रतिनिधित्व करते हुए तालिका डेटा

एक तालिका कई पंक्तियों है, और प्रत्येक पंक्ति कई स्तंभ है, तो आप प्रत्येक पंक्ति के लिए एक सरणी का उपयोग कर, की तरह एक तालिका का प्रतिनिधित्व कर सकते हैं:

row1 = ['item1', 'item2']; 
row2 = ['item3', 'item4']; 

table = [row1, row2]; 

जो आपको एक बहुआयामी सरणी देगा: [ ['item1', 'item2'], ['item3', 'item4'] ]

मतलब है कि आप इस तरह के डेटा तक पहुंचेंगे: table[ rowIndex ][ columnIndex ]

लेकिन विधि का प्रयोग कर रहे है, दुकानों के लिए एक एकल सूची में सभी आइटम, एक सारिणी: table = ['item1', 'item2', 'item3', 'item4']

अब मान लीजिए कि हम पिछले उदाहरण में के रूप में एक ही आइटम को खोजने के लिए चाहते हैं, rowIndex और columnIndex का उपयोग कर , इस समय को छोड़कर वस्तुओं की केवल एक ही सूची है, इसलिए हमें table[ indexOfItemIWant ] का उपयोग करके आइटम प्राप्त करने के लिए rowIndex और columnIndex को एक ही नंबर में गठबंधन करने की आवश्यकता है। हम यह कैसे करे? आप जानते हैं कि सभी पंक्तियां एक के बाद एक सूचीबद्ध हैं, और सभी पंक्तियों में वही संख्याएं हैं। तो हमारी सूची में एक पंक्ति की शुरुआत को खोजने के लिए, हम पंक्तियों के आकार को गुणा करते हैं, जिन पंक्तियों को हम छोड़ना चाहते हैं। एक तालिका में जहां प्रत्येक पंक्ति में दो आइटम होते हैं, जैसे कि हमारे उदाहरण में, पहली पंक्ति स्थिति 0 पर शुरू होती है, और दो पदों पर होती है, इसलिए अगली पंक्ति, स्थिति 0 + 2 पर शुरू होती है, फिर अगला, स्थिति 0 +2 + 2, फिर 0 +2 +2 +2 और इसी तरह, यही कारण है कि आप जिस पंक्ति को मैं प्राप्त करना चाहता हूं (vector.y) width (पंक्ति में वस्तुओं की संख्या) का उपयोग करें।

+0

हम्म ... मुझे लगता है कि मैं समझता हूं लेकिन मुझे इसके बारे में और अधिक सोचने की आवश्यकता हो सकती है –

+0

तो vector.x + this.width * vector.y वास्तव में क्या प्रतिनिधित्व करता है? क्या वह जगह है जहां हम कुछ लगाने जा रहे हैं? –

+0

मैं जल्द ही कुछ और विवरण जोड़ूंगा कि पूरी वेक्टर चीज कैसे काम करती है ... –

2

एक space एक सरणी है, और इतना है कि .Set मैं कि सूचकांक के लिए एक मूल्य x सेट हो जाएगा एक vector, के लिए space में एक सूचकांक मैं करने के लिए 2 आयाम (एक्स, वाई) से बदलना प्रयोग किया जाता है, और .get का उपयोग .set द्वारा निर्धारित किए गए किसी भी मान को प्राप्त/पढ़ने के लिए किया जाता है।

और अंतरिक्ष के अंदर किसी स्थान के लिए, space[j] बताएं कि set पहले नहीं है।

+0

तो vector.x + this.width * vector.y का संकेत क्या है? –

+0

अंतरिक्ष में एक सूचकांक में वेक्टर (एक्स, वाई) ट्रांसफॉर्म करें, उदाहरण के लिए वेक्टर (1, 1) दूसरी पंक्ति है और दूसरे में दूसरा है, और यह अंतरिक्ष के अंदर इंडेक्स 6 में अनुवादित है। छवि को आज़माने की कोशिश कर रहे हैं कि आप हाथ या पेपर द्वारा (x, y) स्थिति को 1 आयाम सरणी में अनुवाद करने के लिए कैसे करेंगे। –

0

बस ऊपर ह्यूगो सिल्वा द्वारा बहुत अच्छी व्याख्या में जोड़ना। अध्याय -7 करते समय, मैं एक ही कोड को समझने के लिए संघर्ष कर रहा था। -1 डी में एक 2 डी सरणी परिवर्तित करने के पीछे सामान्य गणित है

2 डी [मैं] [जे] = 1 दिन [j + मैं Total_number_of_columns_in_the_matrix *]

दूसरे शब्दों में ..

2 डी [ऊंचाई] [चौड़ाई ] = 1 डी [चौड़ाई + ऊंचाई * कुल संख्या_of_columns_in_the_Matrix]

'i' पंक्ति संख्या का प्रतिनिधित्व करता है (यानी मैट्रिक्स के शीर्ष से ऊंचाई या दूरी), और 'जे' कॉलम संख्या (यानी चौड़ाई या दूरी से दूरी मैट्रिक्स के बाएं)। और, मैं row-major ऑर्डरिंग के लिए पंक्ति 0 और कॉलम 0 पर एक स्थिति का प्रतिनिधित्व करने वाले i = j = (0,0) से संख्या शुरू करता हूं (यानी सरणी की पंक्तियों के लगातार तत्व स्मृति में संगत होते हैं और सभी पंक्तियां सूचीबद्ध होती हैं एक के बाद एक)।

तो, [0] [1] शीर्ष पंक्ति पर दूसरा आइटम है, [1] [एन] दूसरी पंक्ति पर और आगे है।

एक पंक्ति में सरणी तत्व 3 ("शीर्ष बाएं", "शीर्ष मध्य", "शीर्ष दाएं") के समूहों में हैं। इसलिए, मुझे इंडेक्स या गिनती की आवश्यकता है जहां मैं चाहता हूं कि समूह शुरू हो रहा है। फॉर्मूला i * Total_number_of_columns_in_the_matrix का यह हिस्सा है। एक बार जब मुझे लगता है कि जिस समूह को मैं शुरू करना चाहता हूं, तो मैं उस सेल की गिनती प्राप्त करने के लिए जे जोड़ता हूं।

पहली पंक्ति के लिए सूचकांक की गणना करते समय (जो i = 0 का प्रतिनिधित्व करता है), मेरे पास जोड़ने के लिए तत्वों की कोई पिछली गणना नहीं है। तो पहली पंक्ति के लिए ऐरे इंडेक्स सिर्फ 0,1,2 होगा।

फिर, जैसा कि मैं दूसरी पंक्ति (i = 1) पर जाता हूं, क्योंकि, मेरे पास पहले पंक्ति से पहले से ही 3 प्रविष्टियां हैं, इसलिए मुझे सूचकांक 1 * 3 + 0,1,2 से शुरू करने की आवश्यकता है और शीघ्र।

एक त्वरित blog post मैंने इस पर लिखा, बस अपनी समझ को दस्तावेज करने के लिए।

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