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))