js中点和向量的基本方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 | var Point= function (x,y){ this .x= Number(x.toFixed(2))||0; this .y=Number(y.toFixed(2))||0; } Point.prototype={ /*~!Vector*/ toArray: function (){ return [ this .x, this .y] }, //加 add: function (v){ return new Point( this .x+v.x, this .y+v.y); }, //减 sub: function (v){ return new Point( this .x-v.x, this .y-v.y); }, //平方根 getMod: function (){ return Math.sqrt( this .x* this .x+ this .y* this .y); }, //乘 除 mulNum: function (num){ return new Point( this .x*num, this .y*num); }, //负向量 getNegative: function (){ return new Point(- this .x,- this .y); }, //点积 dotMul: function (v){ return this .x*v.x+ this .y*v.y; }, /** *返回一个常数代表b在a上的投影乘以a的长度 */ crossMul: function (v){ return this .x*v.y- this .y*v.x; }, /** *获取夹角,注意返回的是角度 */ getAngle: function (v){ return Math.acos( this .dotMul(v)/( this .getMod()*v.getMod()))* 180/Math.PI; }, /** *获取夹角,返回的是弧度 */ getRadian: function (v){ var m1= this .getMod(),m2=v.getMod(); if (m1==0||m2==0){ return 0; } return Math.acos( this .dotMul(v)/(m1*m2)); }, distance: function (v){ return Math.sqrt(( this .x-v.x)*( this .x-v.x)+( this .y-v.y)*( this .y-v.y)) }, distance2: function (v){ return ( this .x-v.x)*( this .x-v.x)+( this .y-v.y)*( this .y-v.y) }, /** *求某向量的法向量,返回一个单位向量,其模为1,返回的向量总是指向this向量的右边 * @return */ getNormal: function (){ return new Point( this .y/(Math.sqrt( this .x* this .x+ this .y* this .y)),- this .x/(Math.sqrt( this .x* this .x+ this .y* this .y))); }, reflex: function (v){ var normal=v.getNormal(); //先求法向量 return this .sub(normal.mulNum(2* this .dotMul(normal))); }, mirror: function (v){ return this .reflex(v).getNegative(); }, isZero: function (){ if ( this .x==0&& this .y==0) return true ; else return false ; }, /** *判断某个点是否在某个矩形区域里,如果在里面的话,并且存在第四个参数的话(true), *就继续判断相对矩形中心点所在象限,最后返回象限,不存在第四个参数返回-1 *如果不在矩形区域里,就直接返回false * *@param {vector} t 矩形左上角坐标 *@param {vector} b 矩形右下角坐标 *@param {boolean} q 是否返回象限 *@return {number} 象限或者-1 */ isIn: function (t,b,q){ var r1= this .sub(t),r2= this .sub(b) if (r1.x>=0&&r1.y>=0&&r2.x<=0&&r2.y<=0){ if (q){ var c=t.add(b).mulNum(0.5) return this .getQ(c) } else { return -1; } } else { return false ; } }, /** *获取第一个点相对第二个点所在的象限 * *@param {vector} pc 第二个点的坐标 */ getQ: function (pc){ var r= this .sub(pc); if (r.x>=0&&r.y>=0){ return 4 } else if (r.x<0 &&r.y>=0){ return 3 } else if (r.x<0&&r.y<0){ return 2 } else if (r.x>=0&&r.y<0){ return 1 } }, //向量的旋转 OB=(xcosα-ysinα,xsinα+ycosα) rotate: function (eg1){ var eg=(eg1/180)*Math.PI.toFixed(2) return new Point( this .x*Math.cos(eg)- this .y*Math.sin(eg), this .x*Math.sin(eg)+ this .y*Math.cos(eg)); }, toString: function (){ return this .x+ ":" + this .y; } /*END~!Vector*/ } p1= new Point(2,2) p2= new Point(1,1) console.log(Math.sin((45/180)*Math.PI)) console.log(Math.cos((45/180)*Math.PI)) console.log(p2.rotate(45)) |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步