क्या मुझे एक बिंदु और एक वेक्टर वस्तु की आवश्यकता है? या बस एक बिंदु का प्रतिनिधित्व करने के लिए एक वेक्टर वस्तु का उपयोग करना ठीक है?


18

एक इंजन के घटकों को संरचित करना जो मैं एक दोस्त (सीखने के उद्देश्यों) के साथ विकसित कर रहा हूं, मुझे इस संदेह में आया।

शुरू में हमारे पास प्वाइंट कंस्ट्रक्टर थे, जैसे कि निम्नलिखित:

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

लेकिन हमने उन्हें कुछ वेक्टर गणित जोड़ना शुरू कर दिया, और उन्होंने इसे वेक्टर 2 डी का नाम बदलने का फैसला किया।

लेकिन अब, कुछ विधियाँ थोड़ी भ्रमित हैं (कम से कम मेरी राय में), जैसे कि निम्नलिखित, जिसका उपयोग लाइन बनाने के लिए किया जाता है:

//before the renaming of Point to Vector2, the parameters were startingPoint and endingPoint
Geometry.Line = function( startingVector, endingVector ) {
    //...
};

मुझे प्वाइंट ऑब्जेक्ट के लिए एक विशिष्ट कंस्ट्रक्टर बनाना चाहिए, या एक वेक्टर के रूप में एक बिंदु को परिभाषित करने में कोई समस्या नहीं है?

मुझे पता है कि एक वेक्टर में परिमाण और दिशा होती है, लेकिन मैं एक वस्तु की स्थिति का प्रतिनिधित्व करने के लिए एक वेक्टर का उपयोग करते हुए इतने सारे लोगों को देखता हूं।


1
चूंकि स्थिति सिर्फ (0,0 {, 0}) से एक वेक्टर है, एक वेक्टर उपयोग करने के लिए ठीक है।

जवाबों:


8

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

मैं क्या होगा करना है, हालांकि, उन्हें अपने कोड में समतुल्य रूप का इलाज है, यदि आप सदिश और बिंदु का परस्पर उपयोग करते हैं, तो इसका कोई कारण नहीं है कि लाइन () फ़ंक्शन के लिए आपकी घोषणा 'शुरुआती वैक्टर' और 'एंडीवेक्टर' के बारे में बात करनी चाहिए। मैं दृढ़ता से वापस जाने के लिए प्रोत्साहित करूंगा

Geometry.Line = function( Vector startingPoint, Vector endingPoint ) {
    //...
};

अंक वे पैरामीटर होते हैं, भले ही वे ऐसा करने के लिए कक्षा वेक्टर का उपयोग कर रहे हों।


मैं एक कदम आगे जाता हूँ और typedef Vector Pointएक हेडर में कहीं होता है जो अंकों को परिभाषित करता है। इस तरह यह दिखता है और ऐसा लगता है Point, किसी को भी इसका उपयोग करते समय अपने सिर को खरोंचने से नहीं छोड़ा जाता है क्योंकि इसे क्यों कहा जाता है Vectorलेकिन आंतरिक पक्ष पर यह केवल एक ही कोड आधार है।
tpg2114

4

बस वेक्टर ऑब्जेक्ट का उपयोग करें। यहां तक ​​कि अगर आपको लगता है कि यह अतीत में गलत तरीके से इस्तेमाल किया गया है / है, तो यह वही है जो लोग उम्मीद करते हैं। इसके अलावा, एक बिंदु के रूप में एक वेक्टर का उपयोग करना जरूरी नहीं है। और चर्चा से बाहर करना मुश्किल होगा क्योंकि दोनों डेटा संरचनाओं को एक ही आदिम प्रकार की आवश्यकता होती है। केवल अंतर सदस्य कार्य होंगे, और उन दोनों को एक ही वर्ग में रखना काफी आसान है, क्योंकि दोनों के बीच परस्पर विरोधी तरीकों में बहुत कुछ नहीं है।

जब से आप सीख रहे हैं, यह सीखना अच्छा है कि लोग जो अपेक्षा करते हैं, वह अक्सर चीजों को करने का सबसे अच्छा तरीका है (आपके द्वारा प्रस्तुत किए गए जैसे तुच्छ विकल्पों के लिए)।


सदस्य कार्य केवल अंकों और वैक्टर के बीच का अंतर नहीं हैं; तो wघटक है, जो महत्वपूर्ण है।
केविंटोडिस्को

3

अंक अंतरिक्ष में स्थान हैं। एक बार जब आपके पास एक समन्वय प्रणाली होती है, तो आप उन बिंदुओं को दूरी और मूल (एक वेक्टर) से एक दिशा के रूप में वर्णन कर सकते हैं। तो एक लाइन की शुरुआत और अंत बिंदुओं का वर्णन करने के लिए वैक्टर का उपयोग करना पूरी तरह से उचित है।

बस इस बात से अवगत रहें कि सभी बिंदुओं को वेक्टर के रूप में दर्शाया जा सकता है, लेकिन वैक्टर बिंदु नहीं हैं। अधिकांश वैक्टर, जैसे वेग, सामान्य आदि, स्थान का कोई मतलब नहीं है।

हवा के बारे में सोचो, आप इसके बारे में बात कर सकते हैं दिशा और यह ताकत है, लेकिन आप इसकी स्थिति या स्थान के बारे में बात नहीं कर सकते। यह कैसे आप वैक्टर के बारे में सोचना चाहिए जब वे अंतरिक्ष में अंक का वर्णन करने के लिए इस्तेमाल नहीं किया जा रहा है।


2

एक बिंदु को परिभाषित करने के लिए, आपको केवल एक वेक्टर की आवश्यकता है। एक पंक्ति को परिभाषित करने के लिए, आपको दो की आवश्यकता है। आमतौर पर, आपके पास दो बिंदु होते हैं जो लाइन पर स्थित होते हैं या एक वेक्टर एक बिंदु का प्रतिनिधित्व करता है जो लाइन पर स्थित होता है और दूसरा वेक्टर लाइन की दिशा का प्रतिनिधित्व करता है।

एक सदिश के रूप में एक बिंदु को परिभाषित करने में कोई समस्या नहीं है, क्योंकि एक बिंदु एक वेक्टर है जिसके निर्देशांक और परिमाण के बराबर दिशा 0,0 से इसकी दूरी के बराबर है।

तो आपको एक बिंदु और "वेक्टर 2 डी" का प्रतिनिधित्व करने के लिए दो अलग-अलग वर्गों की आवश्यकता नहीं है, हालांकि एक बिंदु संभवतः वेक्टर 2 डी का एक उपवर्ग हो सकता है जो सीधे आपके ड्राइंग या प्रसंस्करण से संबंधित विभिन्न सदस्य कार्यों के साथ है, जबकि वेक्टर 2 डी केवल सख्त वेक्टर गणित की तरह हो सकता है डॉट उत्पादों।


2

हां, Vectorदोनों बिंदुओं और वैक्टर को परिभाषित करने के लिए एकल वर्ग का उपयोग करना ठीक है , जब तक आप यह सुनिश्चित करते हैं कि wवेक्टर का घटक है0

कुंजी एक बिंदु और एक वेक्टर के बीच अंतर यह है कि एक बिंदु है, जबकि एक सदिश एक का प्रतिनिधित्व करता है अंतरिक्ष में एक भौतिक स्थान, मूल से ऑफसेट का प्रतिनिधित्व करता है दिशा । एक बिंदु का अनुवाद किया जा सकता है, एक वेक्टर नहीं कर सकता हैwएक 2 या 3 आयामी के घटक Vectorवर्ग क्या प्रभावी करने के लिए एक परिवर्तन मैट्रिक्स का अनुवाद घटक अनुमति देता है। यदि wहै 1, तो अनुवाद और रोटेशन लागू किया जाएगा; यदि यह है 0, तो केवल रोटेशन लागू किया जाएगा।

wवेक्टर सेट का घटक न होना 0आपको काटने के लिए वापस आ सकता है; यह उन बगों की ओर जाता है जो नीचे ट्रैक करना मुश्किल हैं। सुरक्षित होने के लिए, आप एक Pointवर्ग बना सकते हैं जो वर्ग से विरासत में मिलता है Vectorऔर स्पष्ट रूप से सेट wहोता है 1, जहाँ Vectorवर्ग चूक wकरता है 0


2
कई वेक्टर कक्षाएं डब्ल्यू घटक का स्पष्ट रूप से उपयोग नहीं करती हैं; काफी कुछ इसे एक निहित तत्व के रूप में मानते हैं या एक 'प्रोजेक्टिववेक्टर' वर्ग के लिए क्या मात्रा है जो इसे लागू करता है, लेकिन इंजन के कोड का बहुत कुछ (प्रतिपादन के बाहर सब कुछ, अनिवार्य रूप से) 'क्लासिक' 3-वेक्टर का उपयोग करता है जो आस-पास के घटकों को ले जाता है पूरी तरह से शानदार है। यह एक कार्यान्वयन विवरण है, न कि वैक्टर या बिंदुओं का एक अनिवार्य हिस्सा ।
स्टीवन स्टैडनिक

@StevenStadnicki यह सच है, लेकिन एक कक्षा में एक बिंदु और एक वेक्टर दोनों का प्रतिनिधित्व करने के लिए, wघटक मौजूद होना चाहिए, अन्यथा यह निर्धारित करने का कोई तरीका नहीं है कि ऑब्जेक्ट का उपयोग कैसे किया जाना चाहिए।
केविंटोडिस्को

1
@ktodisco मुझे लगता है कि यह निर्धारित करने का तरीका कि इसका उपयोग कैसे किया जाना चाहिए, यह देख रहा है कि इसका उपयोग किस संदर्भ में किया जा रहा है।
JCM

1
टिप्पणी संपादित करने के लिए समय से बाहर भाग गया :(। यह कहने जा रहा था कि यदि इंजन के अंश जो कक्षा का उपयोग करते हैं, उस संदर्भ को परिभाषित करते हैं जिसमें इसका उपयोग किया जाएगा, तो यह काम करता है।
kevintodisco

2

अंक और वैक्टर को एक ही चीज माना जा सकता है। यदि यह आपके लिए समझ में आता है, तो आप वैक्टर के बारे में सोच सकते हैं जो इस तरह से स्थिति का प्रतिनिधित्व करते हैं, और फिर Vector2कक्षा को हर जगह उपयोग करना तर्कसंगत है अन्यथा आपने एक Pointवर्ग का उपयोग किया होगा ।

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

   * Player (3,3)
  /
 /
. (0,0)

इस मामले में वेक्टर का क्या मतलब है कि जहाज दाईं ओर 3 इकाइयां है और मूल के ऊपर 3 इकाइयां हैं। (ध्यान दें कि आप खिलाड़ी की गति के लिए एक वेक्टर का उपयोग भी कर सकते हैं, जिस स्थिति में खिलाड़ी 3 इकाइयों को सही और 3 इकाइयों को हर दूसरे या फ्रेम में ऊपर ले जाएगा। स्थिति और गति दोनों को एक ही वेक्टर वर्ग द्वारा दर्शाया जाएगा, लेकिन उनके वैक्टर खिलाड़ी की स्क्रिप्ट में अलग तरह से संसाधित किया जा सकता है।)

अपने लाइन उदाहरण का उपयोग करने के लिए, स्थिति वेक्टर का प्रतिनिधित्व करता है जहां प्रारंभिक "बिंदु" और अंत "बिंदु" मूल के सापेक्ष स्थित हैं। यदि आपकी उत्पत्ति खेल क्षेत्र का केंद्र है, तो आप इस तरह से एक रेखा निर्धारित कर सकते हैं:

             * (8, 2)
             |
     . (0,0) |
             |
             * (8, -2)

तो लाइन का एक सिरा 8 इकाइयों के दाईं ओर और 2 इकाइयाँ खेल मैदान के केंद्र के ऊपर होती हैं, और दूसरी पंक्ति 8 इकाइयों के दाईं ओर और 2 इकाइयों के नीचे होती है।

बस स्पष्ट होने के लिए, यह कहने की ज़रूरत नहीं है कि आपको एक Vectorवर्ग के बजाय एक वर्ग का उपयोग करना होगा Point। यह इस स्थिति के बारे में सोचने का सिर्फ एक तरीका है जिससे यह तय करना आसान हो सकता है कि उन विचारों को कैसे लागू किया जाए।


अंतरिक्ष में दूसरे बिंदु पर ऑफसेट के रूप में वेक्टर को अभी भी रिश्तेदार निर्देशांक में एक बिंदु के रूप में सोचा जाना चाहिए। इसे वेक्टर कहना गलत है, जहां तक ​​गेम इंजन का संबंध है।
केविंटोडिस्को

0

यह कार्यान्वयन पर निर्भर करता है। यदि आपके पास इसके प्रोटोटाइप के बजाय वेक्टर 2d पर विधियां हैं, तो इसके लिए एक लागत है, आपको एक गेम, एक प्रमुख एक में जितने अंक चाहिए होंगे। यह सिर्फ जावास्क्रिप्ट कैसे काम करता है उस स्थिति में एक Point2d वर्ग बनाना बेहतर है जिसमें सभी अनावश्यक कार्य नहीं हैं।


प्रोटोटाइप में तरीकों को जोड़ा जा रहा है, इसलिए यह कोई मुद्दा नहीं है।
जेसीएम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.