-
Notifications
You must be signed in to change notification settings - Fork 0
/
vectors.min.js
1 lines (1 loc) · 4.13 KB
/
vectors.min.js
1
class Vector{constructor(t=0,r=0,i=0){return this._x=t,this._y=r,this._z=i,this}add(t){if(!(t instanceof Vector))throw new TypeError("The argument is not a vector");return this._x+=t.x,this._y+=t.y,this._z+=t.z,this}sub(t){if(!(t instanceof Vector))throw new TypeError("The argument is not a vector");return this._x-=t.x,this._y-=t.y,this._z-=t.z,this}subtract(t){return this.sub(t)}mult(t){if(t instanceof Vector)return this._x*=t.x,this._y*=t.y,this._z*=t.z,this;if("number"==typeof t)return this._x*=t,this._y*=t,this._z*=t,this;throw new TypeError("The argument is not a vector or a number")}multiply(t){return this.mult(t)}divide(t){if(t instanceof Vector)return this._x/=t.x,this._y/=t.y,this._z/=t.z,this;if("number"==typeof t)return this._x/=t,this._y/=t,this._z/=t,this;throw new TypeError("The argument is not a vector or a number")}div(t){return this.divide(t)}min(){return Math.min(this._x,this._y,this._z)}max(){return Math.max(this._x,this._y,this._z)}dot(t){if(!(t instanceof Vector))throw new TypeError("The argument is not a vector");return this._x*t._x+this._y*t.y+this._z*t.z}cross(t){if(!(t instanceof Vector))throw new TypeError("The argument is not a vector");const r=this._y*t.z-this._z*t.y,i=this._z*t._x-this._x*t.z,e=this._x*t.y-this._y*t._x;return this._x=r,this._y=i,this._z=e,this}distSq(t){if(!(t instanceof Vector))throw new TypeError("The argument is not a vector");return Math.pow(this._x-t._x,2)+Math.pow(this._y-t.y,2)+Math.pow(this._z-t.z,2)}dist(t){if(!(t instanceof Vector))throw new TypeError("The argument is not a vector");return Math.sqrt(this.distSq(t))}angleBetween(t){if(!(t instanceof Vector))throw new TypeError("The argument is not a vector");return Math.acos(this.dot(t)/(this.mag()*t.mag()))}equals(t){if(!(t instanceof Vector))throw new TypeError("The argument is not a vector");return this._x==t._x&&this._y==t.y&&this._z==t.z}copy(){return new Vector(this._x,this._y,this._z)}limit(t){if("number"!=typeof t)throw new TypeError("The argument is not a number");let r=this.mag();if(r>t)return this.multiply(t/r),this}setMag(t){if("number"!=typeof t)throw new TypeError("The argument is not a number");let r=this.mag();return this.multiply(t/r),this}rotate(t){if("number"!=typeof t)throw new TypeError("The argument is not a number");let r=Math.cos(t)*this._x-Math.sin(t)*this._y,i=Math.sin(t)*this._x+Math.cos(t)*this._y;return this._x=r,this._y=i,this}normalize(){return this.divide(this.mag()),this}invert(t,r,i){return!0===t&&(this._x*=-1),!0===r&&(this._y*=-1),!0===i&&(this._z*=-1),void 0===t&&void 0===r&&void 0===i&&(this._x*=-1,this._y*=-1,this._z*=-1),this}invertX(){return this.invert(!0,!1,!1),this}invertY(){return this.invert(!1,!0,!1),this}invertZ(){return this.invert(!1,!1,!0),this}mag(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z)}magnitude(){return this.mag()}magSq(){return this._x*this._x+this._y*this._y+this._z*this._z}magnitudeSq(){return this.magSq()}heading2D(){if(0!==this._z)throw new Error("The vector is not 2D");return Math.atan2(this._y,this._x)}toString(){return`Vector(${this._x}, ${this._y}, ${this._z})`}toArray(){return[this._x,this._y,this._z]}toObject(){return{x:this._x,y:this._y,z:this._z}}static fromAngle2D(t=0){return new Vector(Math.cos(t),Math.sin(t),0)}static fromAngle3D(t=0,r=0){return new Vector(Math.cos(t)*Math.cos(r),Math.sin(r),Math.sin(t)*Math.cos(r))}static random2D(){let t=2*Math.random()*Math.PI;return Vector.fromAngle2D(t)}static random3D(){let t=2*Math.random()*Math.PI,r=2*Math.random()*Math.PI;return Vector.fromAngle3D(t,r)}static fromArray(t){return t=t.fill(0,3),new Vector(t[0],t[1],t[2])}static fromObject(t){return new Vector(t.x,t.y,t.z)}static fromPolar(t,r,i=0){if(t<0)throw new Error("The radius must be positive");const e=t*Math.sin(r)*Math.cos(i),s=t*Math.sin(r)*Math.sin(i),h=t*Math.cos(r);return new Vector(e,s,h)}static fromString(t){const r=t.match(/Vector\(([\s,0-9.-]+)\)/);try{const t=r[1].split(",").fill(0,3);return new Vector(parseFloat(t[0]),parseFloat(t[1]),parseFloat(t[2]))}catch(t){throw new Error("The string is not in the correct format")}}get x(){return this._x}set x(t){this._x=t}get y(){return this._y}set y(t){this._y=t}get z(){return this._z}set z(t){this._z=t}}