আমার ভেক্টর শ্রেণিতে আমার কি 'ডাব্লু' উপাদান দরকার?


21

ধরুন আপনি ম্যাট্রিক্স কোড লিখছেন যা 3 ডি স্পেসের জন্য রোটেশন, ট্রান্সলেশন ইত্যাদি পরিচালনা করে।

এখন অনুবাদ উপাদানটি ফিট করার জন্য রূপান্তর ম্যাট্রিকগুলি 4x4 হতে হবে।

যাইহোক, আপনি আসলে ভেক্টরে কোনও উপাদান সংরক্ষণ করার দরকার নেইw ?

এমনকি দৃষ্টিকোণ বিভাগে, আপনি কেবল wভেক্টরের বাইরে গণনা এবং সঞ্চয় করতে পারেন এবং পদ্ধতি থেকে ফিরে আসার আগে দৃষ্টিভঙ্গি বিভাজন করতে পারেন।

উদাহরণ স্বরূপ:

// post multiply vec2=matrix*vector
Vector operator*( const Matrix & a, const Vector& v )
{
  Vector r ;
  // do matrix mult
  r.x = a._11*v.x + a._12*v.y ...

  real w = a._41*v.x + a._42*v.y ...

  // perspective divide
  r /= w ;

  return r ;
}

wভেক্টর ক্লাসে স্টোর করার কোনও অর্থ আছে কি ?


2
এটি কোনও সাধারণ ম্যাট্রিক্স ভেক্টর গুণনের জন্য বাস্তবায়ন নয়, দৃষ্টিকোণ বিভাজন সেখানে নেই। এছাড়াও এটি বেশ বিভ্রান্তিকর, কারণ গণনার ভুল অংশগুলি হাইলাইট করা হয়েছে। আপনি যদি ডাব্লু-উপাদানটির জন্য কী তা জানতে চান, সম্পূর্ণ বাস্তবায়নটি দেখুন, তবে আপনি দেখতে পাবেন যে ডাব্লু-উপাদানটি 1 হলে ম্যাট্রিক্সের সর্বশেষ সারি / কলাম (অনুবাদ অংশ) প্রয়োগ করা হয় ie পয়েন্ট জন্য। আপনার সেই অংশগুলি হাইলাইট করা উচিত: r.x = ... + a._14*v.w; r.y = ... + a._24*v.w; r.z = ... + a._34*v.w; r.w = ... + a._44*v.w;বিশদগুলির জন্য আমার উত্তরটি দেখুন
মাইক সেম্ডার

উত্তর:


27

সম্পাদনা অস্বীকৃতি : এই উত্তরের সুবিধার জন্য ডাব্লু == 0 সহ ভেক্টরকে ভেক্টর এবং ডাব্লু == 1 সহ পয়েন্ট বলা হয়। যদিও FxIII উল্লেখ করেছে, এটি কোনও গাণিতিকভাবে সঠিক পরিভাষা নয়। যাইহোক, যেহেতু উত্তরের বিন্দুটি পরিভাষা নয়, তবে উভয় প্রকারের ভেক্টরকে আলাদা করার প্রয়োজন, আমি এটির সাথে আঁকড়ে থাকব। ব্যবহারিক কারণে এই সম্মেলনটি গেম-বিকাশে ব্যাপকভাবে ব্যবহৃত হয়।


'ডাব্লু' উপাদান ছাড়া ভেক্টর এবং পয়েন্টগুলির মধ্যে পার্থক্য করা সম্ভব নয়। এটি পয়েন্টগুলির জন্য 1 এবং ভেক্টরগুলির জন্য 0।

যদি ভেক্টরগুলিকে 4x4 অ্যাফাইন ট্রান্সফর্মেশন-ম্যাট্রিক্স দিয়ে গুণ করা হয় যার শেষ সারি / কলামে একটি অনুবাদ রয়েছে, তবে ভেক্টরটিও অনুবাদ করা হবে, যা ভুল, কেবলমাত্র পয়েন্টগুলিই অনুবাদ করা উচিত। কোনও ভেক্টরের 'ডাব্লু' উপাদানটির শূন্য এটির যত্ন নেয়।

ম্যাট্রিক্স-ভেক্টর গুণনের এই অংশটি হাইলাইট করা এটিকে আরও স্পষ্ট করে তোলে:

    r.x = ... + a._14 * v.w; 
    r.y = ... + a._24 * v.w; 
    r.z = ... + a._34 * v.w; 
    r.w = ... + a._44 * v.w;

a._14, a._24 and a._34 is the translational part of the affine matrix.
Without a 'w' component one has to set it implicitly to 0 (vector) or to 1 (point) 

অর্থাত্ কোনও ভেক্টরের অনুবাদ করা ভুল হবে, উদাহরণস্বরূপ একটি ঘূর্ণন অক্ষ, ফলাফলটি কেবল ভুল, 4 তম উপাদান শূন্য থাকলে আপনি এখনও একই ম্যাট্রিক্স ব্যবহার করতে পারেন যা পয়েন্টগুলিকে রোটেশনের অক্ষকে রূপান্তর করতে পরিবর্তিত করে এবং ফলাফলটি বৈধ হবে এবং ম্যাট্রিক্সে কোনও স্কেল না থাকায় এর দৈর্ঘ্য সংরক্ষণ করা হয়। এটি ভেক্টরদের জন্য আপনি চান আচরণ। ৪ র্থ উপাদান ছাড়া আপনাকে ২ টি ম্যাট্রিক (অথবা একটি অন্তর্ভুক্ত চতুর্থ প্যারামিটার সহ 2 টি আলাদা গুণ গুণ) তৈরি করতে হবে এবং পয়েন্ট এবং ভেক্টরগুলির জন্য 2 টি পৃথক ফাংশন কল করতে হবে।

আধুনিক সিপিইউগুলির ভেক্টর রেজিস্টারগুলি ব্যবহারের জন্য (এসএসই, অ্যালটিভিক, এসপিইউ) আপনাকে যেভাবেই 4x 32 বিট ফ্লোটগুলি পাস করতে হবে (এটি একটি 128 বিট রেজিস্টার), এবং আপনাকে সাধারণত অ্যালাইনমেন্টের যত্ন নিতে হবে, সাধারণত 16 বাইট। সুতরাং আপনার কাছে যেভাবেই চতুর্থ উপাদানটির জন্য জায়গাটি নিরাপদ করার সুযোগ নেই।


সম্পাদনা: প্রশ্নের উত্তরটি মূলত:

  1. হয় ডাব্লু-উপাদানটি সংরক্ষণ করুন: পজিশনের জন্য 1 এবং ভেক্টরগুলির জন্য 0
  2. অথবা বিভিন্ন ম্যাট্রিক্স-ভেক্টর গুণিত ফাংশন কল করুন এবং যেকোন একটি ফাংশন বেছে নিয়ে স্পষ্টভাবে 'ডাব্লু' উপাদানটি পাস করুন

তাদের অবশ্যই একটি বাছাই করতে হবে, কেবলমাত্র {x, y, z store সংরক্ষণ করা সম্ভব নয় এবং এখনও কেবলমাত্র একটি ম্যাট্রিক্স-ভেক্টর গুণিত ফাংশন ব্যবহার করতে পারে। উদাহরণস্বরূপ এক্সএনএ তার ভেক্টর 3 শ্রেণিতে 2 টি রূপান্তর ফাংশন রেখে ডাকা Transformএবং পরে পরবর্তী পদ্ধতির ব্যবহার করেTransformNormal

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

#include <cstdio>
#include <cmath>

struct vector3
{
    vector3() {}
    vector3(float _x, float _y, float _z) { x = _x; y = _y; z = _z; }
    float x, y, z;    
};

struct vector4
{
    vector4() {}
    vector4(float _x, float _y, float _z, float _w) { x = _x; y = _y; z = _z; w = _w; }
    float x, y, z, w;
};

struct matrix
{
    // convenience column accessors
    vector4&        operator[](int col)         { return cols[col]; }
    const vector4&  operator[](int col) const   { return cols[col]; }
    vector4 cols[4];
};

// since we transform a vector that stores the 'w' component, 
// we just need this one matrix-vector multiplication
vector4 operator*( const matrix &m, const vector4 &v )
{
    vector4 ret;
    ret.x = v.x * m[0].x + v.y * m[1].x + v.z * m[2].x + v.w * m[3].x;
    ret.y = v.x * m[0].y + v.y * m[1].y + v.z * m[2].y + v.w * m[3].y;
    ret.z = v.x * m[0].z + v.y * m[1].z + v.z * m[2].z + v.w * m[3].z;
    ret.w = v.x * m[0].w + v.y * m[1].w + v.z * m[2].w + v.w * m[3].w;
    return ret;
}

// if we don't store 'w' in the vector we need 2 different transform functions
// this to transform points (w==1), i.e. positions
vector3 TransformV3( const matrix &m, const vector3 &v )
{
    vector3 ret;
    ret.x = v.x * m[0].x + v.y * m[1].x + v.z * m[2].x + 1.0f * m[3].x;
    ret.y = v.x * m[0].y + v.y * m[1].y + v.z * m[2].y + 1.0f * m[3].y;
    ret.z = v.x * m[0].z + v.y * m[1].z + v.z * m[2].z + 1.0f * m[3].z;
    return ret;
}

// and this one is to transform vectors (w==0), like a direction-vector
vector3 TransformNormalV3( const matrix &m, const vector3 &v )
{
    vector3 ret;
    ret.x = v.x * m[0].x + v.y * m[1].x + v.z * m[2].x + 0.0f * m[3].x;
    ret.y = v.x * m[0].y + v.y * m[1].y + v.z * m[2].y + 0.0f * m[3].y;
    ret.z = v.x * m[0].z + v.y * m[1].z + v.z * m[2].z + 0.0f * m[3].z;
    return ret;
}

// some helpers to output the results
void PrintV4(const char *msg, const vector4 &p )  { printf("%-15s: %10.6f %10.6f %10.6f %10.6f\n",  msg, p.x, p.y, p.z, p.w ); }
void PrintV3(const char *msg, const vector3 &p )  { printf("%-15s: %10.6f %10.6f %10.6f\n",         msg, p.x, p.y, p.z); }

#define STORE_W     1

int main()
{
    // suppose we have a "position" of an entity and its 
    // look direction "look_dir" which is a unit vector

    // we will move this entity in the world

    // the entity will be moved in the world by a translation 
    // in x+5 and a rotation of 90 degrees around the y-axis 
    // let's create that matrix first

    // the rotation angle, 90 degrees in radians
    float a = 1.570796326794896619f;
    matrix moveEntity;
    moveEntity[0] = vector4( cos(a), 0.0f, sin(a), 0.0f);
    moveEntity[1] = vector4(   0.0f, 1.0f,   0.0f, 0.0f);
    moveEntity[2] = vector4(-sin(a), 0.0f, cos(a), 0.0f);
    moveEntity[3] = vector4(   5.0f, 0.0f,   0.0f, 1.0f);

#if STORE_W

    vector4 position(0.0f, 0.0f, 0.0f, 1.0f);
    // entity is looking towards the positive x-axis
    vector4 look_dir(1.0f, 0.0f, 0.0f, 0.0f);

    // move the entity using the matrix
    // we can use the same function for the matrix-vector multiplication to transform 
    // the position and the unit vector since we store 'w' in the vector
    position = moveEntity * position;
    look_dir = moveEntity * look_dir;

    PrintV4("position", position);
    PrintV4("look_dir", look_dir);

#else

    vector3 position(0.0f, 0.0f, 0.0f);
    // entity is looking towards the positive x-axis
    vector3 look_dir(1.0f, 0.0f, 0.0f);

    // move the entity using the matrix
    // we have to call 2 different transform functions one to transform the position 
    // and the other one to transform the unit-vector since we don't 
    // store 'w' in the vector
    position = TransformV3(moveEntity, position);
    look_dir = TransformNormalV3(moveEntity, look_dir);

    PrintV3("position", position);
    PrintV3("look_dir", look_dir);

#endif

    return 0;
}

প্রাথমিক সত্তা রাষ্ট্র:

position       :   0.000000   0.000000   0.000000   1.000000
look_dir       :   1.000000   0.000000   0.000000   0.000000

এখন এক্স + 5 এর অনুবাদ এবং Y- অক্ষের চারপাশে 90 ডিগ্রির একটি ঘূর্ণন সহ একটি রূপান্তর এই সত্তায় প্রয়োগ করা হবে। ট্রান্সফর্মেশনের পরে সঠিক উত্তরটি হ'ল:

position       :   5.000000   0.000000   0.000000   1.000000
look_dir       :   0.000000   0.000000   1.000000   0.000000

আমরা কেবলমাত্র সঠিক উত্তরটি পেয়ে যাব যদি আমরা উপরের উপস্থাপিত উপায়ে যে কোনও একটিতে ডাব্লু == 0 এবং পজিশনগুলি ডাব্লু == 1 দিয়ে আলাদা করি।


@ মাইক সেমদার আপনি কিছুটা ভুল ... ভেক্টরগুলির মধ্যে পয়েন্টগুলি আলাদা করা সম্ভব নয় কারণ সেগুলি একই জিনিস! (তারা সমকামী) 1 টি ভেক্টরগুলির জন্য এবং 0 অসীম দিকনির্দেশক ভার্টেক্টরগুলির জন্য (যেমন আমি আমার উত্তরে বলেছি) । প্রতিক্রিয়াটির বাকী অংশগুলি ভুল অনুমানের কারণে খুব কম বুদ্ধিমান।
FxIII

1
@ এফএক্সআইআইআই আমি আপনার পয়েন্টটি দেখতে ব্যর্থ (কোন পাং উদ্দেশ্যে নয়) এবং এই প্রশ্নের প্রাসঙ্গিকতা। আপনি বলছেন ভেক্টর এবং পয়েন্টগুলি একই, তাই 'ডাব্লু' কে যেভাবেই, গুরুতরভাবে সংরক্ষণ করার কোনও অর্থ হয় না? এখন হয় আপনি কম্পিউটার গ্রাফিকগুলিতে বিপ্লব ঘটাচ্ছেন বা আপনি এই প্রশ্নের বিন্দুটি পান না।
মাইক সেমদার

1
@ এফএক্সআইআইআই এটি বোকামি, আপনি গেম-ডেভেলপমেন্টে ব্যবহৃত কিছু থ্রিডি ম্যাথ ফ্রেমওয়ার্কগুলি অধ্যয়ন করতে চাইতে পারেন, যেমন সোনির ভেক্টরমাথ , আপনি এই জাতীয় প্রচুর বাস্তবায়ন, ভ্যাক_আওএসএইচএস-এ vmathV4MakeFromV3 এবং vmathV4MakeFromP3 বাস্তবায়নের সুনির্দিষ্ট চেহারা পাবেন এবং তারা চতুর্থ উপাদানটিতে কী রেখেছিল, পি 3 এর জন্য 1.0 এবং ভি 3, থ্রিডি পয়েন্ট এবং 3 ডি ভেক্টরের জন্য 0.0।
মাইক সেমদার

3
@FxIII হয় যে কারণে XNA Vector3 বর্গ একটি "ট্রান্সফর্ম" এবং "TransformNormal" সদস্য-ফাংশন আছে, কারণ হয় রৈখিক বীজগণিত এর গণিত। আপনি এই ট্রান্সফর্ম ফাংশনগুলির মধ্যে একটি চয়ন করে যা করেন তা হ'ল '1' বা '0' এর অন্তর্নিহিত 'ডাব্লু' প্যারামিটারটি উত্তরণ করে যা ম্যাট্রিক্সের 4 র্থ সারিটি মূলত গণনায় অন্তর্ভুক্ত করে বা না। সংক্ষিপ্তসার: আপনি যদি 'ডাব্লু' উপাদানটি সংরক্ষণ করেন না, তবে আপনাকে বিভিন্ন রূপান্তর ফাংশনগুলি কল করে সেই ভেক্টরগুলিকে আলাদাভাবে আচরণ করতে হবে।
মাইক সেমদার

1
ভেক্টর এবং পয়েন্টগুলি যেমন বলা হয়েছে তাত্ত্বিক, সুতরাং তাদের মধ্যে কোনও বীজগণিত পার্থক্য নেই। যাইহোক, প্রজেক্টিভ স্পেসের সমজাতীয় মডেল যা উপস্থাপনের চেষ্টা করে তা হ'ল ভেক্টর স্পেসের SET এবং পয়েন্টগুলি সমকামী নয়। ভেক্টর স্পেসগুলির সেটটি কার্যকরভাবে আর ^ 3 এর জন্য এক ধরণের বন্ধের অন্তর্ভুক্ত যা অনন্ত গোলকের পয়েন্টগুলি অন্তর্ভুক্ত করে। ডাব্লু = 0 সহ পয়েন্টগুলি প্রায়শই ভুলভাবে "ভেক্টর" হিসাবে উল্লেখ করা হয় - এগুলি আসলে দিকের ক্ষেত্রের জন্য বিচ্ছিন্ন এবং আরও সঠিকভাবে কেবল "দিকনির্দেশ" হিসাবে অভিহিত হবে ... এবং না, ডাব্লু হারানো প্রায়শই কাজ করতে পারে তবে বেশিরভাগ ক্ষেত্রে আপনি সমস্যার সন্ধান করা
ক্রওলি 9

4

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

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

আপনি যদি কোনও ভেক্টরের গণিতে কিছুটা গভীর গভীরে ডুব দিতে চান, তবে ইউক্লিডিয়ান ভেক্টরটি কেবল একটি দিক এবং মাত্রা। সুতরাং সাধারণত এটি সংখ্যার ট্রিপলেট দ্বারা প্রতিনিধিত্ব করা হয়, যেখানে প্রতিটি সংখ্যা একটি অক্ষ বরাবর প্রস্থ হয়; এর দিকটি এই তিনটি মাত্রার সংমিশ্রণ দ্বারা বোঝানো হয়েছে এবং ইউক্লিডিয়ান দূরত্বের সূত্রের সাহায্যে এই দৈর্ঘ্যটি পাওয়া যাবে । অথবা, কখনও কখনও এটি সত্য হিসাবে একটি দিক হিসাবে সঞ্চিত হয় (দৈর্ঘ্য = 1 সহ একটি ভেক্টর) এবং প্রস্থ (একটি ফ্লোট), যদি এটি সুবিধাজনক হয় তবে (যেমন যদি দিকের চেয়ে দৈর্ঘ্য আরও বেশি বার পরিবর্তিত হয় তবে এটি কেবল আরও সুবিধাজনক হতে পারে ভেক্টর নেওয়ার চেয়ে সাধারণ পরিমাণটি এবং নতুন মাত্রার সাহায্যে উপাদানগুলি গুন করার চেয়ে সেই परिमाणের সংখ্যাটি পরিবর্তন করুন )।


6
আধুনিক ওপেনজিএল আপনার জন্য ম্যাট্রিকগুলি নিয়ে কাজ করে না।
SurvivalMachine

4

থ্রিডি ভেক্টরের চতুর্থ মাত্রাটি মাইক্রোসেস ব্যবহার করে গণনা করা অসম্ভব হবে এমন অ্যাফাইন ট্রান্সফর্মেশনগুলি গণনা করতে ব্যবহৃত হয়। স্থান ত্রি-মাত্রিক থাকে তাই এর অর্থ এই যে চতুর্থটি কোনওভাবে 3 ডি স্পেসে ম্যাপ করা হয়।

একটি মাত্রা মানচিত্রের অর্থ ভিন্ন ভিন্ন 4D ভেক্টর একই 3 ডি পয়েন্ট নির্দেশ করে। মানচিত্রটি হ'ল যদি A = [x ', y', z'.w '] এবং B = [x ", y", z ", w"] তারা x' / x "= y 'তে একই পয়েন্ট উপস্থাপন করে / y "= z '/ z" = w' / w "= α অর্থাৎ উপাদানটি একই গুণফলের জন্য আনুপাতিক α

বলেছিলেন যে আপনি একটি পয়েন্টটি প্রকাশ করতে পারেন - বলুন (1,3,7) - অসীম আচরণে যেমন (1,3,7,1) বা (2,6,14,2) বা (131,393,917,131) বা সাধারণভাবে (· · 1, α · 3, α · 7, α)।

এর অর্থ হ'ল আপনি একইভাবে 3 ডি পয়েন্ট উপস্থাপন করতে অন্য 4 ডি ভেক্টরকে স্কেল করতে পারেন যাতে ডাব্লু = 1: ফর্ম (x, y, z, 1) ক্যানোনিকাল ফর্ম।

আপনি যখন এই ভেক্টরটিতে ম্যাট্রিক্স প্রয়োগ করেন আপনি ডাব্লু = 1 না থাকা কোনও ভেক্টর পেতে পারেন তবে আপনি সর্বদা এটির আকারে সংরক্ষণ করার জন্য ফলাফলগুলি স্কেল করতে পারেন। সুতরাং উত্তরটি মনে হচ্ছে "গণিত করার সময় আপনার 4D ভেক্টর ব্যবহার করা উচিত তবে চতুর্থ উপাদানটি সংরক্ষণ করবেন না"

এটি বেশ সত্য তবে কিছু পয়েন্ট রয়েছে যা আপনি ক্যানোনিকাল ফর্মটিতে রাখতে পারবেন না : পয়েন্টগুলি (4,2,5,0) এর মতো। এই পয়েন্টগুলি বিশেষ, তারা নির্দেশিত অসীম পয়েন্ট উপস্থাপন করে এবং ধারাবাহিকভাবে ইউনিট ভেক্টরকে স্বাভাবিক করা যেতে পারে: আপনি চক নরিস না হয়ে নিরাপদে অসীমের কাছে যেতে পারেন এবং (এমনকি দুবারও) ফিরে আসতে পারেন। আপনি যদি সেই ভেক্টরকে ক্যানোনিকাল আকারে জোর করার চেষ্টা করেন তবে আপনি শূন্য দ্বারা একটি দু: খজনক বিভাগ পাবেন।

এখন আপনি জানেন, তাই পছন্দটি আপনার!


1

হ্যাঁ তুমি কর. আপনার রূপান্তরটি কিছু ধরণের ভেক্টরের জন্য ভুল। আপনি এটি ডি 3 ডিএক্স গাণিতিক লাইব্রেরিতে দেখতে পারেন- তাদের দুটি পৃথক ম্যাট্রিক্স-ভেক্টর গুণ গুণ রয়েছে, একটি ডাব্লু = 0 এবং একটি ডব্লু = 1 এর জন্য।


0

আপনি যা চান এবং যা প্রয়োজন তার উপর নির্ভর করে। :)

আমি এটি সঞ্চয় করে রেখেছিলাম, খ / সি এটি রূপান্তরগুলির জন্য প্রয়োজনীয় এবং যেমন (আপনি 4x4 ম্যাট্রিক্স দিয়ে 3 ভেক্টরকে গুণতে পারবেন না), যদিও আপনার যদি সর্বদা 1 এর চেয়ে বেশি থাকে তবে আমি অনুমান করি আপনি এটি নকল করতে পারেন।

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