评论

向量加法、向量减法、向量点乘、向量求夹角。附上源码!

向量在游戏开发中有着重要的作用。可以说是基本功。用好向量,可以很快的算出两个物体之前的运动关系 最近在看一本游戏人工智能的书,马上就能在游戏中实践应用。

向量在游戏开发中有着重要的作用。可以说是基本功。用好向量,可以很快的算出两个物体之前的运动关系

最近在看一本游戏人工智能的书,马上就能在游戏中实践应用。

由于我使用的引擎是LayaBox,而引擎中没有向量计算相关的类,只好自己写了一下。只要原理搞清楚,也不是很难

最后附上源码,大家可以直接用

exportdefaultclass VectorTool  {
    
    /**向量相加,得到一个从a向量指向b向量末端的新向量 */publicstatic add(a:Vector2, b:Vector2):Vector2 {
        let result:Vector2 = new Vector2();
        result.x = a.x + b.x;
        result.y = a.y + b.y;
        return result;
    }


    /**向量相减,得到一个从b向量末端指向a向量末端的新向量 */publicstatic subtract(a:Vector2, b:Vector2):Vector2 {
        let result:Vector2 = new Vector2();
        result.x = a.x - b.x;
        result.y = a.y - b.y;
        return result;
    }


    /**向量乘以一个数,会使向量变长 */publicstatic mul(v:Vector2, num:number) {
        v.x *= num;
        v.y *= num;
    }


    
    /**向量点乘,用于计算两个向量之间的夹角 */publicstatic dot(a:Vector2, b:Vector2):number {
        return a.x * b.x + a.y * b.y;
    }


    /**返回两个向量夹角(角度值) */publicstatic  includedAngle(a:Vector2, b:Vector2):number {
        let dotResult:number = VectorTool.dot(a, b);
        let cosa:number = dotResult /(a.length * b.length);
        let radian:number = Math.acos(cosa);
        let angle:number = radian * 180 / Math.PI;
        return angle;
    }
}


exportclass Vector2 {
    public x:number;
    public y:number;
    constructorx?:number, y?:number) {
        this.x = x;
        this.y = y;
    }


    /**向量的模(长度) */publicget length():number {
        returnMath.sqrt(this.x * this.x + this.y * this.y);
    }


    /**向量归一化(标化) */public nomalize():void {
        let len:number = this.length;
        this.x /= len;
        this.y /= len;
    }
}

 如有误希望大家指正,最后如果对您有帮助,也请支持一下我的小程序:

最后一次编辑于  2019-12-20  
点赞 2
收藏
评论
登录 后发表内容