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

  

posted @   无工时代  阅读(3816)  评论(0编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示