আমার কি পয়েন্ট এবং ভেক্টর অবজেক্ট দরকার? বা একটি পয়েন্ট উপস্থাপন করতে কেবল একটি ভেক্টর অবজেক্ট ব্যবহার করা ঠিক আছে?


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

সংজ্ঞা সংশোধন এবং ভেক্টর হিসাবে পয়েন্ট চিকিত্সা করার ক্ষেত্রে কোনও সমস্যা হবে না - তবে কিছুটা সতর্কতা অবলম্বন করুন, কারণ কিছু এপিআই-এর একটি 'পয়েন্ট' শ্রেণি রয়েছে যা আপনার প্রয়োজন হতে পারে (উদাহরণস্বরূপ, বহুভুজগুলির উল্লম্ব প্রতিনিধিত্ব করার জন্য) এবং যদি আপনি নিজের শ্রেণীর সংজ্ঞা দিন আপনি তাদের পিছনে পিছনে পোর্ট করতে সক্ষম হতে চাই।

আমি যা করব তা হ'ল আপনার কোডে তাদের সাথে সমান আচরণ করবে; যদি আপনি ভেক্টর ব্যবহার করেন এবং বিনিময়যোগ্য বিন্দুটি ব্যবহার করেন, তবে লাইন () ফাংশনের জন্য আপনার ঘোষণায় 'স্টার্টিংভেক্টর' এবং 'এন্ডিংভেক্টর' সম্পর্কে কথা বলার কোনও কারণ নেই। আমি দৃ strongly়ভাবে ফিরে যেতে উত্সাহিত করব

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

পয়েন্টগুলি হ'ল প্যারামিটারগুলি প্রতিনিধিত্ব করে, এমনকি তারা এটি করতে ক্লাস ভেক্টর ব্যবহার করছে।


আমি আরও একধাপ এগিয়ে যেতে হবে এবং typedef Vector Pointকোথাও একটি শিরোনামে পয়েন্টগুলি সংজ্ঞায়িত করব। এইভাবে এটি দেখতে দেখতে এবং একর মতো অনুভূত হয় Point, কেন এটি বলা হয় তা ব্যবহার করার সময় কেউই তাদের মাথা আঁচড়ানো ছেড়ে Vectorযায় না তবে অভ্যন্তরীণ দিকে এটি কেবল একটি কোড বেস।
tpg2114

4

কেবল ভেক্টর অবজেক্টটি ব্যবহার করুন। অতীতেও যদি আপনি মনে করেন যে এটি অতীতে / ভুলভাবে ব্যবহার করা হয়েছে তবে এটি লোকেদের প্রত্যাশা। এছাড়াও, বিন্দু হিসাবে ভেক্টর ব্যবহার করা অগত্যা ভুল নয়। এবং আলোচনার বাইরে কাজ করা শক্ত হবে কারণ উভয় ডেটা স্ট্রাকচারের জন্য একই আদিম ধরণের প্রয়োজন। কেবলমাত্র পার্থক্য হ'ল সদস্যের কাজগুলি এবং এগুলি একই শ্রেণিতে রাখাই যথেষ্ট সহজ, যেহেতু উভয়ের মধ্যে বিরোধী পদ্ধতির পথে খুব বেশি কিছু নেই।

যেহেতু আপনি শিখছেন, এটি শেখা ভাল যে লোকেরা যা প্রত্যাশা করে তা করা প্রায়শই জিনিস করার সর্বোত্তম উপায় (উপস্থাপিতের মতো তুচ্ছ পছন্দগুলির জন্য)।


সদস্য ফাংশনগুলি পয়েন্ট এবং ভেক্টরগুলির মধ্যে একমাত্র পার্থক্য নয়; wউপাদানটিও তাই সমালোচনাযোগ্য।
কেভিনটোডিসকো

3

পয়েন্টগুলি স্থানের অবস্থান। একবার আপনার একটি সমন্বিত সিস্টেম হয়ে গেলে আপনি এই পয়েন্টগুলিকে মূল থেকে একটি দূরত্ব এবং দিক হিসাবে বর্ণনা করতে পারেন (ভেক্টর)। সুতরাং কোনও লাইনের শুরু এবং শেষের পয়েন্টগুলি বর্ণনা করতে ভেক্টরগুলি ব্যবহার করা পুরোপুরি যুক্তিসঙ্গত।

কেবল সচেতন থাকুন যে সমস্ত পয়েন্টগুলি ভেক্টর হিসাবে উপস্থাপন করা যেতে পারে তবে ভেক্টরগুলি পয়েন্ট নয়। বেশিরভাগ ভেক্টর, উদাহরণস্বরূপ বেগ, সাধারণ ইত্যাদি কোনও জায়গার কোনও ধারণা রাখে না।

বাতাসের কথা চিন্তা করুন, আপনি এটির দিক এবং এটির শক্তি সম্পর্কে কথা বলতে পারেন, তবে আপনি এর অবস্থান বা অবস্থান সম্পর্কে কথা বলতে পারবেন না। যখন ভেক্টরগুলিকে স্পেসে পয়েন্টগুলি বর্ণনা করার জন্য ব্যবহার করা হচ্ছে না তখন আপনার এইভাবে চিন্তা করা উচিত।


2

একটি বিন্দু সংজ্ঞায়িত করতে, আপনার কেবলমাত্র একটি ভেক্টর প্রয়োজন। একটি লাইন সংজ্ঞায়িত করতে, আপনার দুটি দরকার। সাধারণত, আপনার দুটি পয়েন্ট রয়েছে যা রেখার সাথে থাকে অথবা একটি ভেক্টর এমন একটি বিন্দুর প্রতিনিধিত্ব করে যা লাইনে থাকে এবং অন্য ভেক্টরটি লাইনের দিকের প্রতিনিধিত্ব করে।

ভেক্টর হিসাবে বিন্দুটি সংজ্ঞায়িত করতে কোনও সমস্যা নেই, কারণ একটি বিন্দু একটি ভেক্টর যা তার স্থানাঙ্কের সমান দিক এবং দৈর্ঘ্য 0,0 থেকে সমান পরিমাণযুক্ত একটি ভেক্টর।

সুতরাং আপনার পয়েন্ট এবং "ভেক্টর 2 ডি" উপস্থাপনের জন্য দুটি পৃথক শ্রেণীর প্রয়োজন নেই, যদিও পয়েন্ট সম্ভবত আপনার অঙ্কন বা প্রক্রিয়াকরণের সাথে সরাসরি সম্পর্কিত বিভিন্ন সদস্যের ফাংশন সহ ভেক্টর 2 ডি-এর একটি সাবক্লাস হতে পারে, অন্যদিকে ভেক্টর 2 ডি কেবলমাত্র কঠোর ভেক্টর গণিত ক্রিয়াকলাপ যেমন করতে পারে বিন্দু পণ্য।


2

হ্যাঁ, যতক্ষণ না আপনি ভেক্টরের উপাদানটি নিশ্চিত করে থাকেন ততক্ষণVector পয়েন্ট এবং ভেক্টর উভয়কেই সংজ্ঞায়িত করার জন্য একটি একক শ্রেণী ব্যবহার করা ঠিক আছে ।w0

কী একটি বিন্দু এবং একটি ভেক্টর মধ্যে পার্থক্য হচ্ছে একটি বিন্দু, যেখানে একটি ভেক্টর একটি প্রতিনিধিত্ব করে মহাকাশে একটি শারীরিক অবস্থান, মূল থেকে অফসেট প্রতিনিধিত্ব করে দিক । একটি বিন্দু অনুবাদ করা যেতে পারে, একটি ভেক্টর পারে নাwএকটি 2- বা 3-মাত্রিক এর উপাদান Vectorবর্গ কি কার্যকরী করতে একটি রূপান্তর ম্যাট্রিক্স অনুবাদ উপাদান দেয়। যদি wহয় 1, তবে অনুবাদ এবং ঘূর্ণন প্রয়োগ করা হবে; যদি এটি হয় 0তবে কেবল ঘোরানো প্রয়োগ করা হবে।

কোনও wভেক্টর সেটের উপাদান না থাকা 0আপনাকে কামড় দিতে ফিরে আসতে পারে; এটি ত্রুটিগুলি সন্ধান করে যা ট্র্যাক ডাউন করা বরং কঠিন। নিরাপদে থাকার জন্য, আপনি Pointক্লাস থেকে উত্তরাধিকার সূত্রে একটি ক্লাস তৈরি করতে পারেন Vectorএবং স্পষ্টভাবে সেট wকরতে পারেন 1যেখানে Vectorক্লাসটি ডিফল্ট wহয় 0


2
অনেক ভেক্টর ক্লাস স্পষ্টভাবে ডাব্লু উপাদান ব্যবহার করে না; বেশ কয়েকটি এটি একটি অন্তর্নিহিত উপাদান হিসাবে বিবেচনা করে থাকে বা একটি 'প্রজেক্টিভেক্টর' শ্রেণীর পরিমাণে যা এটি প্রয়োগ করে, তবে ইঞ্জিনের কোডের অনেক কিছুই (মূলত রেন্ডারিংয়ের বাইরে সমস্ত কিছু) 'ক্লাসিকাল' 3-ভেক্টর ব্যবহার করে যা প্রায়োগিক উপাদানকে ঘিরে রাখে সম্পূর্ণরূপে অতি ضرورتবহ। এটি বাস্তবায়নের বিশদ, ভেক্টর বা পয়েন্টগুলির প্রয়োজনীয় অংশ নয় ।
স্টিভেন স্টাডনিকি

@ স্টেভেনস্ট্যাডনিকি এটি সত্য, তবে শ্রেণি একটি বিন্দু এবং ভেক্টর উভয়েরই প্রতিনিধিত্ব wকরতে গেলে উপাদানটি উপস্থিত থাকতে হবে, অন্যথায় কীভাবে অবজেক্টটি ব্যবহার করা উচিত তা নির্ধারণের কোনও উপায় নেই।
কেভিনটোডিসকো

1
@ কেটিডিসকো আমি মনে করি এটি কীভাবে ব্যবহার করা উচিত তা নির্ধারণের উপায়টি এটি কোন প্রসঙ্গে ব্যবহৃত হচ্ছে তা দেখছে।
JCM

1
মন্তব্যটি সম্পাদনা করার জন্য সময়ের বাইরে চলে গেল :(। বলছিলেন যে ইঞ্জিনের যে অংশগুলি ব্যবহার করে তার অংশ যদি এটি ব্যবহৃত হবে সেই প্রসঙ্গে যদি এটি নির্ধারণ করে, তবে এটি কাজ করে
কেভিনটোডিসকো

2

পয়েন্ট এবং ভেক্টর একই জিনিস হিসাবে চিন্তা করা যেতে পারে। যদি এটি আপনার কাছে বোধগম্য হয়, আপনি ভেক্টরদের সম্পর্কে চিন্তা করতে পারেন যা এইভাবে অবস্থানের প্রতিনিধিত্ব করে এবং তারপরে Vector2আপনি যেখানে অন্যথায় কোনও Pointশ্রেণি ব্যবহার করেছেন সেদিকেই কোনও শ্রেণি ব্যবহার করা যুক্তিসঙ্গত ।

গণিতে, ভেক্টরগুলি মাঝে মাঝে অবস্থানের প্রতিনিধিত্ব করতে ব্যবহৃত হয়। যখন এই অর্থে ব্যবহার করা হয় তখন ভেক্টর প্রতিনিধিত্ব করে যেখানে কোনও সত্তা একটি মূল বিন্দুর তুলনায় অবস্থিত। উদাহরণস্বরূপ, ধরুন আপনি কোনও ঝাঁকুনি তৈরি করছেন এবং খেলোয়াড়ের জাহাজটি খেলার জায়গাতে কোথায় রয়েছে সে সম্পর্কে আপনি নজর রাখতে চান। আপনি যদি খেলার ক্ষেত্রের নীচে-বাম দিকের কোণটিকে (0, 0) হিসাবে বিবেচনা করেন তবে আপনি প্লেয়ারের অবস্থানটি একটি দিয়ে প্রতিনিধিত্ব করতে পারেন Vector:

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

এই ক্ষেত্রে ভেক্টরটির অর্থ যা হ'ল জাহাজটি ডানদিকে 3 ইউনিট এবং উত্সের উপরে 3 ইউনিট। (নোট করুন যে আপনি প্লেয়ারের গতির জন্য একটি ভেক্টরও ব্যবহার করতে পারেন, সেক্ষেত্রে প্লেয়ার প্রতি সেকেন্ডে বা ফ্রেমে 3 ইউনিট ডান এবং 3 ইউনিট সরিয়ে নিয়ে যাবে position উভয় অবস্থান এবং গতি একই ভেক্টর শ্রেণি দ্বারা প্রতিনিধিত্ব করা হবে তবে তাদের ভেক্টরগুলি প্লেয়ারের স্ক্রিপ্টে আলাদাভাবে প্রক্রিয়া করা হবে))

আপনার লাইন উদাহরণটি ব্যবহার করার জন্য, অবস্থান ভেক্টরটি উপস্থাপন করে যেখানে সূচনা "পয়েন্ট" এবং শেষ "পয়েন্ট" উত্সের তুলনায় অবস্থিত। আপনার উত্স যদি খেলার ক্ষেত্রের কেন্দ্রস্থল হয় তবে আপনি এটির মতো একটি লাইন নির্ধারণ করতে পারেন:

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

সুতরাং লাইনের এক প্রান্তটি ডান দিকের 8 টি ইউনিট এবং খেলার মাঠের কেন্দ্রের উপরে 2 ইউনিট এবং অন্যটি 8 টি ইউনিট ডান এবং 2 ইউনিট নীচে।

কেবল পরিষ্কার করার জন্য, এটি আপনাকে Vectorক্লাসের পরিবর্তে কোনও ক্লাস ব্যবহার করতে হবে তা বলার অপেক্ষা রাখে না Point। এই পরিস্থিতি সম্পর্কে চিন্তা করার একমাত্র উপায় যা এই ধারণাগুলি কীভাবে প্রয়োগ করা যায় তা সিদ্ধান্ত নেওয়া সহজ করে তুলতে পারে।


স্থানের অন্য বিন্দুর অফসেট হিসাবে ভেক্টরটিকে এখনও আপেক্ষিক স্থানাঙ্কের একটি বিন্দু হিসাবে ভাবা উচিত। এটিকে ভেক্টর বলা ভুল, যতক্ষণ না কোনও গেম ইঞ্জিন সম্পর্কিত।
কেভিনটোডিসকো

0

এটি বাস্তবায়নের উপর নির্ভর করে। যদি আপনার প্রোটোটাইপের পরিবর্তে ভেক্টর 2 ডি তে পদ্ধতি থাকতে হয়, তবে তার জন্য একটি গেমের জন্য আপনাকে যে পয়েন্টের প্রয়োজন হবে তার পরিমাণ দিতে হবে, একটি বড়। এটি জাভাস্ক্রিপ্ট কীভাবে কাজ করে তা ঠিক। এই পরিস্থিতিতে পয়েন্ট 2 ডি ক্লাস তৈরি করা ভাল যাতে সমস্ত অপ্রয়োজনীয় ফাংশন নেই।


প্রোটোটাইপগুলিতে পদ্ধতিগুলি যুক্ত করা হচ্ছে, সুতরাং এটি কোনও সমস্যা নয়।
জেসিএম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.