वेक्टर गणित दो नंबरों के साथ करना संभव है। इससे पहले कि मैं यह बताऊं कि यह कैसे काम करता है:
let a = vec_pack([2,4]);
let b = vec_pack([1,2]);
let c = a+b; // Vector addition
let d = c-b; // Vector subtraction
let e = d*2; // Scalar multiplication
let f = e/2; // Scalar division
console.log(vec_unpack(c)); // [3, 6]
console.log(vec_unpack(d)); // [2, 4]
console.log(vec_unpack(e)); // [4, 8]
console.log(vec_unpack(f)); // [2, 4]
if(a === f) console.log("Equality works");
if(a > b) console.log("Y value takes priority");
मैं इस तथ्य का उपयोग कर रहा हूं कि यदि आप दो बार एक्स संख्या को शिफ्ट करते हैं और फिर उन्हें वापस शिफ्ट करने से पहले उन्हें जोड़ते या घटाते हैं, तो आपको वही परिणाम मिलेगा जैसे कि आपने उन्हें शुरू करने के लिए स्थानांतरित नहीं किया था। इसी तरह स्केलर गुणन और विभाजन शिफ्ट किए गए मूल्यों के लिए सममित रूप से काम करता है।
एक जावास्क्रिप्ट संख्या में पूर्णांक सटीकता (64 बिट फ़्लोट्स) के 52 बिट्स हैं, इसलिए मैं एक संख्या को 26 उपलब्ध बिट्स, और एक निचले हिस्से में पैक करूँगा। कोड को थोड़ा अधिक गड़बड़ कर दिया गया है क्योंकि मैं हस्ताक्षरित संख्याओं का समर्थन करना चाहता था।
function vec_pack(vec){
return vec[1] * 67108864 + (vec[0] < 0 ? 33554432 | vec[0] : vec[0]);
}
function vec_unpack(number){
switch(((number & 33554432) !== 0) * 1 + (number < 0) * 2){
case(0):
return [(number % 33554432),Math.trunc(number / 67108864)];
break;
case(1):
return [(number % 33554432)-33554432,Math.trunc(number / 67108864)+1];
break;
case(2):
return [(((number+33554432) % 33554432) + 33554432) % 33554432,Math.round(number / 67108864)];
break;
case(3):
return [(number % 33554432),Math.trunc(number / 67108864)];
break;
}
}
इसके साथ मैं केवल यह देख सकता हूं कि x और y की सीमा + -33 मिलियन में है, क्योंकि उन्हें प्रत्येक 26 बिट के भीतर फिट होना है।