• 数学类与图形类


    数学类cc.js

    //计算几何误差修正
    Math.EPS=0.00000001;
    //判断x的符号
    Math.cmp=function(x) {
        if(Math.abs(x)<Math.EPS)return 0;
        if(x>0){
            return 1;
        }else{
            return -1;
        }
    }
    //矩阵类
    class Matrix {
        //将一个数组构建成一个矩阵,行Row、列Column
        constructor(data,Row,Column){
            this.data=data||[];
            this.Row=Row;//
            this.Column=Column;//
        }
        //根据行、列返回矩阵元素
        getItem(r,c){
            return this.data[r*this.Column+c]||0;
        }
        //根据行、列设置矩阵元素
        setItem(r,c,item){
            this.data[r*this.Column+c]=item;
        }
        //换行
        swapRow(r1,r2){
            for(let c=0;c<this.Column;c++){
                const cache=this.getItem(r1,c)
                this.setItem(r1,c,this.getItem(r2,c))
                this.setItem(r2,c,cache);
            }
        }
        oneRowEach(r,callback){
            for(let c=0;c<this.Column;c++){
                callback(this.getItem(r,c),r,c)
            }
        }
        //按行遍历矩阵元素,返回元素item,行r,列c
        rowEach(callback){
            for(let r=0;r<this.Row;r++){
                for(let c=0;c<this.Column;c++){
                    callback(this.getItem(r,c),r,c)
                }
            }
        }
        //按竖遍历矩阵元素,返回元素item,行r,列c
        columnEach(callback){
            for(let c=0;c<this.Column;c++){
                for(let r=0;r<this.Row;r++){
                    callback(this.getItem(r,c),r,c)
                }
            }
        }
        //行循环
        oneRowMap(r,callback){
            this.oneRowEach(r,(item,r,c)=> {
                this.setItem(r,c,callback(item,r,c));
            })
        }
        //按行map矩阵元素
        rowMap(callback){
            this.rowEach((item,r,c)=> {
                this.setItem(r,c,callback(item,r,c));
            })
        }
        //相加
        add(matrix){
            if(matrix instanceof Matrix&& this.Row === matrix.Row && this.Column === matrix.Column){
                const nMatrix=new Matrix([],this.Row,this.Column)
                this.rowEach(function (item,r,c) {
                    nMatrix.setItem(r,c,item+matrix.getItem(r,c))
                })
                return nMatrix;
            }else{
                throw '方法plus 参数错误';
            }
        }
        //相减
        sub(matrix){
            if(matrix instanceof Matrix&& this.Row === matrix.Row && this.Column === matrix.Column){
                const nMatrix=new Matrix([],this.Row,this.Column)
                this.rowEach(function (item,r,c) {
                    nMatrix.setItem(r,c,item-matrix.getItem(r,c))
                })
                return nMatrix;
            }else{
                throw '方法minus 参数错误';
            }
        }
        //相乘
        multiply(obj){
            if(obj instanceof Matrix){
                return this.multiplyMatrix(obj)
            }else if(typeof obj=='number'){
                return this.multiplyNumber(obj)
            }else{
                throw 'multiply 输入的参数类型错误';
            }
        }
        //矩阵与数相乘,返回一个新的矩阵
        multiplyNumber(number){
            const nMatrix=new Matrix([],this.Row,this.Column)
            this.rowEach((item,r,c)=> {
                nMatrix.setItem(r,c,item*number)
            })
            return nMatrix;
        }
        //矩阵与矩阵相乘 矩阵A的行必须与矩阵B的列数相等
        multiplyMatrix(matrix){
            if(this.Row!==matrix.Column){
                throw '矩阵A的行必须与矩阵B的列数相等';
            }
            const nMatrix=new Matrix([],this.Row,matrix.Column)
            for(let r=0;r<this.Row;r++){
                for(let mc=0;mc<matrix.Column;mc++){
                    let num=0;
                    for(let c=0;c<this.Column;c++){
                        num=num+this.getItem(r,c)*matrix.getItem(c,mc)
                    }
                    nMatrix.setItem(r,mc,num)
                }
            }
            return nMatrix;
    
        }
        //复制生成一个新的矩阵
        clone(){
            return new Matrix([].concat(this.data),this.Row,this.Column)
        }
        //转换成字符图形
        toString(){
            let str='[';
            for(let r=0;r<this.Row;r++){
                str=str+'
    '
                for(let c=0;c<this.Column;c++){
                    if(r==this.Row-1&&c==this.Column-1){
                        str=str+this.getItem(r,c);
                    }else{
                        str=str+this.getItem(r,c)+',';
                    }
                }
            }
            str=str+'
    ]'
            return str;
        }
    }
    
    /*Gauss 消元
    传入一个矩阵,传出结果
    */
    function Gauss(matrix){
        let l=[];//是否为自由元
        let ans=[];//存储解
        const n=matrix.Column-1;//解的个数
        let res=0,r=0;
        for(let i=0;i<matrix.Column;i++){
            for(let j=r;j<matrix.Row;j++){
                if(Math.abs(matrix.getItem(j,i))>Math.EPS){
                    if(j!==r){
                        //行交换位置
                        for(let k=i;k<=n;k++){
                            const temp1=matrix.getItem(j,k)
                            const temp2=matrix.getItem(r,k)
                            matrix.setItem(j,k,temp2)
                            matrix.setItem(r,k,temp1)
                        }
                    }
                    break;
                }
            }
            // console.log(matrix.toString(),r,i)
            if(Math.abs(matrix.getItem(r,i)<Math.EPS)){
                ++res;
                console.log('continue')
                continue;
            }
            //方程相减,消除元
            for(let j=0;j<matrix.Row;j++){
                if(j!==r&&Math.abs(matrix.getItem(j,i))>Math.EPS){
                    let tmp=matrix.getItem(j,i)/matrix.getItem(r,i);
                    for(let k=i;k<=n;k++){
                        const item=matrix.getItem(j,k)-tmp*matrix.getItem(r,k)
                        matrix.setItem(j,k,item)
                    }
    
                }
            }
            l[i]=true;
            r++;
        }
        //输出答案
        for(let i=0;i<n;i++){
            if(l[i]){
                for(let j=0;j<n;j++){
                    if(Math.abs(matrix.getItem(j,i))>0){
                        ans[i]=matrix.getItem(j,n)/a.getItem(j,i)
                    }
                }
            }
        }
        return ans;
    }
    //将一个矩阵转换成上三角矩阵
    function upperMatrix(oriMatrix) {
        const matrix=oriMatrix.clone();
        let r=0;
    
        //生成上三角矩阵
        for(let i=0;i<matrix.Row;i++){
            //循环行
            for(let j=r;j<matrix.Row;j++){
                if(Math.abs(matrix.getItem(j,i))>Math.EPS){
                    if(j!==r){
                        //行交换位置
                        matrix.swapRow(j,r)
                    }
    
                    break;
                }
            }
            if(Math.abs(matrix.getItem(r,i)<Math.EPS)){
                continue;
            }
            //方程相减,消除元
            for(let j=0;j<matrix.Row;j++){
                if(j!==r&&Math.abs(matrix.getItem(j,i))>Math.EPS){
                    let tmp=matrix.getItem(j,i)/matrix.getItem(r,i);
                    for(let k=i;k<matrix.Column;k++){
                        const item=matrix.getItem(j,k)-tmp*matrix.getItem(r,k)
                        matrix.setItem(j,k,item)
                    }
                }
            }
            r++;
        }
    
        return matrix
    }
    
    //求矩阵的逆
    function Inverse(matrix){
        if(matrix.Row!==matrix.Column){
            throw '矩阵的行与列需要相等';
        }
        const N=matrix.Row;
        //方程矩阵A
        const A = new Matrix([],N,2*N);
        for(let r=0;r<N;r++){
            for(let c=0;c<N;c++){
                A.setItem(r,c,matrix.getItem(r,c))
            }
        }
        for(let r=0;r<N;r++){
            for(let c=N;c<N*2;c++){
                if(r===c-N){
                    A.setItem(r,c,1)
                }else{
                    A.setItem(r,c,0)
                }
            }
        }
        //换成上三角矩阵
        const B=upperMatrix(A)
    
        //左边转成单位矩阵
        for(let i=0;i<N;i++){
            if(Math.abs(B.getItem(i,i))!==1){
                for(let k=N;k<2*N;k++){
                    B.setItem(i,k,B.getItem(i,k)/B.getItem(i,i))
                }
                B.setItem(i,i,1)
            }
        }
        //输出结果
        const C = new Matrix([],N,N);
        C.rowMap(function (item,r,c) {
            return B.getItem(r,c+N);
        })
        return C;
    }
    //欧几里得算法 求两个数a、b的最大公约数
    function gcd(a,b){
        return b===0?a:gcd(b,a%b)
    }
    //分数类 分子,分母
    class Fraction{
        constructor(num=0,den=1){
            if(den<0){
                num=-num;
                den=-den;
            }
            if(den===0){
                throw '分母不能为0'
            }
            let g=gcd(Math.abs(num),den)
            this.num=num/g;
            this.den=den/g;
        }
        //
        add(o){
            return new Fraction(this.num*o.den+this.den*o.num,this.den*o.den)
        }
        //
        sub(o){
            return new Fraction(this.num*o.den-this.den*o.num,this.den*o.den)
        }
        //
        multiply(o){
            return new Fraction(this.num*o.num,this.den*o.den);
        }
        //
        divide(o){
            return new Fraction(this.num*o.den,this.den*o.num);
        }
        //小于
        lessThan(o){
            return this.num*o.den<this.den*o.num;
        }
        //等于
        equal(o){
            return this.num*o.den===this.den*o.num;
        }
    }
    
    //点类
    function Point(x,y) {
        if(this instanceof Point){
            if(Math.cmp(x.toFixed(2)-x)==0){
                x=Number(x.toFixed(2));
            }
            if(Math.cmp(y.toFixed(2)-y)==0){
                y=Number(y.toFixed(2));
            }
            this.x=x;
            this.y=y;
        }else{
    
            return new Point(x,y)
        }
    }
    //向量的模长
    Point.prototype.norm=function(){
        return Math.sqrt(this.x*this.x+this.y*this.y);
    }
    //
    Point.add=function(a,b){
        return new Point(a.x+b.x,a.y+b.y)
    }
    //
    Point.sub=function(a,b){
        return new Point(a.x-b.x,a.y-b.y);
    }
    // 等于
    Point.equals=function(a,b){
        return Math.cmp(a.x-b.x)===0&&Math.cmp(a.y-b.y)===0;
    }
    //乘 向量与数字
    Point.multiply=function(a,b){
        if(a instanceof Point&&typeof b=='number'){
            return Point(a.x*b,a.y*b)
        }
        if(b instanceof Point&&typeof a=='number'){
            return Point(a*b.x,a*b.y)
        }
    }
    //除 向量与数字
    Point.divide=function(a,b){
        return Point(a.x/b,a.y/b)
    }
    //向量的叉积
    Point.det=function (a,b) {
        return a.x*b.y-a.y*b.x;
    }
    //向量的点积
    Point.dot=function (a,b) {
        return a.x*b.x+a.y*b.y;
    }
    //两个点的距离
    Point.dist=function (a,b) {
        return Point.sub(a,b).norm()
    }
    //逆时针旋转,a为弧度
    Point.rotate=function (p,A) {
        if(A===0){return p;}
        const tx=p.x;
        const ty=p.y;
        return Point(tx*Math.cos(A)-ty*Math.sin(A),tx*Math.sin(A)+ty*Math.cos(A))
    }
    
    //计算几何线段类
    function Line(a,b) {
        if(this instanceof Line){
            this.a=a;
            this.b=b;
        }else{
            if(a instanceof Point&&b instanceof Point){
                return new Line(a,b)
            }else{
                throw 'Line 参数错误'
            }
        }
    }
    //点p到线段s、t的距离
    Line.dis_point_segment=function(p,s,t){
        if(Math.cmp(Point.dot(Point.sub(p,s),Point.sub(t,s)))<0){
            return Point.sub(p,s).norm()
        }
        if(Math.cmp(Point.dot(Point.sub(p,t),Point.sub(s,t)))<0){
            return Point.sub(p,t).norm()
        }
        return Math.abs(Point.det(Point.sub(s,p),Point.sub(t,p))/Point.dist(s,t))
    }
    //点到线段的垂足
    Line.pointProjLine=function(p,s,t){
        const r=Point.dot(Point.sub(t,s),Point.sub(p,s))/Point.dot(Point.sub(t,s),Point.sub(t,s))
        return Point.add(s,Point.multiply(r,Point.sub(t,s)))
    }
    //点是否在线段上
    Line.pointOnSegment=function(p,s,t){
        return Math.cmp(Point.det(Point.sub(p,s),Point.sub(t,s)))===0&&Math.cmp(Point.det(Point.sub(p,s),Point.sub(p,t)))<=0
    }
    //判断线段a、b是否平行,a、b 为line
    Line.parallel=function (a,b) {
        return !Math.cmp(Point.det(Point.sub(a.a,a.b),Point.sub(b.a,b.b)))
    }
    //判断线段a、b是否相交,返回交点
    Line.lineMakePoint=function (a,b) {
        if(Line.parallel(a,b)){
            return false;
        }
        const s1=Point.det(Point.sub(a.a,b.a),Point.sub(b.b,b.a));
        const s2=Point.det(Point.sub(a.b,b.a),Point.sub(b.b,b.a));
        return Point.divide(Point.sub(Point.multiply(s1,a.b),Point.multiply(s2,a.a)),s1-s2);
    }
    // 将直线a沿法向量方向平移距离len得到的直线
    Line.moveD=function (a,len) {
        let d=Point.sub(a.b,a.a)
        d=Point.divide(d,d.norm());
        d=Point.rotate(d,Math.PI/2);
        return Line(Point.add(a.a,Point.multiply(d,len)),Point.add(a.b,Point.multiply(d,len)))
    }
    /*
    * 流程控制器
    * 作者:caoke
    * */
    
    class Step{
        //初始化
        constructor(stepArr,callback){
    
            this.stepArr=stepArr;
            this.curIndex=0;
            this.isPaused=false;
            this.nextMode=null;
            this.curStep=this.stepArr[this.curIndex];
            this.hasRunTimes={};
            this.stepArr.forEach( (step)=> {
                this.hasRunTimes[step]=0;
            })
            this.callback=callback;
        }
        callback(){
            this.go()
        }
        // 运行当前流程
        run(){
            this.curStep=this.stepArr[this.curIndex]
            if(this.curStep){
                this.hasRunTimes[this.curStep]++
                this.callback&&this.callback.apply(this,[this.curStep,this.hasRunTimes[this.curStep]])
            }
        }
        // 跳转到某个流程
        go(step){
            this.clear()
            if(step){
                this.curIndex=this.stepArr.indexOf(step)
            }else{
                this.curIndex++
            }
            this.run()
        }
    
        // 进入下一个流程
        next(){
            if(this.nextMode){
                this.go(this.nextMode.nextStep)
            }else{
                this.go()
            }
        }
    
        // 自动进入下一步
        waitSecondAndGo(second,step){
            if(!this.isPaused){
                this.stopTimer()
            }
            const mode={
                startTime:new Date().getTime(),
                allSecond:second,
                leftSecond:second*1000,
                nextStep:step,
                timer:null,
            }
    
            //获得下一步
            if(this.nextMode==null||mode.leftSecond<this.nextMode.leftSecond){
                this.nextMode=mode;
            }
    
            if(!this.isPaused){
                this.startTimer()
            }
    
        }
        // 暂停
        pause(){
            if(!this.isPaused){
                this.isPaused=true;
                this.stopTimer()
    
            }
    
        }
        // 继续
        repause(){
            if(this.isPaused){
                this.isPaused=false;
                this.startTimer()
            }
    
        }
        stopTimer(){
            if(this.nextMode&&this.nextMode.timer){
                const duration=new Date().getTime()-this.nextMode.startTime;
                this.nextMode.leftSecond=this.nextMode.leftSecond-duration;
    
                clearTimeout(this.nextMode.timer);
                this.nextMode.timer=null;
            }
        }
        startTimer(){
            if(this.nextMode&&this.nextMode.timer==null){
                this.nextMode.startTime=new Date().getTime();
                this.nextMode.timer=setTimeout(() => {
                    this.go(this.nextMode.nextStep)
                },this.nextMode.leftSecond)
            }
        }
        // 销毁
        clear(){
            if(this.nextMode){
                if(this.nextMode.timer){
                    clearTimeout(this.nextMode.timer);
                    this.nextMode.timer=null
                }
                this.nextMode=null
            }
        }
    }
    View Code

    图形类test.js

    const canvas=document.getElementById("myCanvas");
    
    var cc={
        canvas:canvas,
        ctx:canvas.getContext("2d"),
        translate(str){
            if(/px/.test(str)){
                return parseInt(str)
            }
            if(/vh/.test(str)){
                return parseInt(str)*window.innerHeight/100
            }
            if(/vw/.test(str)){
                return parseInt(str)*window.innerWidth/100
            }
        }
    }
    cc.width=canvas.width=cc.translate('100vw');
    cc.height=canvas.height=cc.translate('100vh');
    
    cc.rect=canvas.getBoundingClientRect();
    
    class Node{
        constructor(){
    
            this.children=[]
            this.parent=null;
            this.root=null;
            this.isShow=true;
            this.angle=0;
    
        }
        getRoot(){
            if(this instanceof World){
                return this;
            }else{
                return this.parent.getRoot()
            }
        }
        add(node){
            if(!node.parent){
                node.parent=this;
                node.root=node.getRoot()
                this.children.push(node);
            }
        }
        remove(node){
            this.children=this.children.filter((nd)=>{
                if(node===nd){
                    node.parent=null;
                    node.root=null;
                }
                return node!==nd
            })
        }
        render(){
            if(!this.isShow){return false;}
            for(let i=0;i<this.children.length;i++){
                this.children[i].render()
            }
            return true;
        }
    }
    
    class ccRect extends Node{
        constructor(point,width,height){
            super()
            this.point=point;
            this.width=width;
            this.height=height;
        }
        render(){
            if(!super.render()){return;}
            const root=this.root;
            const ctx=cc.ctx;
            const arr=[
                root.WorldToScreenPoint(Point.rotate(Point(this.point.x-this.width/2,this.point.y+this.height/2),this.angle)),
                root.WorldToScreenPoint(Point.rotate(Point(this.point.x+this.width/2,this.point.y+this.height/2),this.angle)),
                root.WorldToScreenPoint(Point.rotate(Point(this.point.x+this.width/2,this.point.y-this.height/2),this.angle)),
                root.WorldToScreenPoint(Point.rotate(Point(this.point.x-this.width/2,this.point.y-this.height/2),this.angle))
            ]
            ctx.beginPath();
            ctx.moveTo(arr[0].x,cc.height-arr[0].y);
            ctx.lineTo(arr[1].x,cc.height-arr[1].y);
            ctx.lineTo(arr[2].x,cc.height-arr[2].y);
            ctx.lineTo(arr[3].x,cc.height-arr[3].y);
            ctx.closePath();
    
            ctx.strokeStyle="#72dd38";
            ctx.stroke();
    
        }
    }
    class ccLine extends Node{
        constructor(a,b){
            super()
            this.a=a;
            this.b=b;
    
        }
        render(){
            if(!super.render()){return;}
            const root=this.root;
            const ctx=cc.ctx;
            const a=root.WorldToScreenPoint(Point.rotate(this.a,this.angle));
            const b=root.WorldToScreenPoint(Point.rotate(this.b,this.angle));
            ctx.beginPath();
            ctx.moveTo(a.x,cc.height-a.y);
            ctx.lineTo(b.x,cc.height-b.y);
            ctx.strokeStyle=this.strokeStyle;
            ctx.stroke();
        }
    }
    class ccText extends Node{
        constructor(text,point){
            super()
            this.text=text
            this.point=point
        }
        render(){
            if(!super.render()){return;}
            const root=this.root;
            const ctx=cc.ctx;
            ctx.font="10px Arial";
            ctx.textAlign=this.textAlign||"center";
            ctx.textBaseline=this.textBaseline||"middle";
            const point=root.WorldToScreenPoint(Point.rotate(this.point,this.angle));
            ctx.fillText(this.text,point.x,cc.height-point.y);
        }
    }
    class ccCircle extends Node{
        constructor(point,radius,startingAngle,endingAngle){
            super()
            this.point=point;
            this.radius=radius;
            this.startingAngle=startingAngle||0;
            this.endingAngle=endingAngle||2*Math.PI;
    
        }
        render(){
            if(!super.render()){return;}
            const root=this.root;
            const ctx=cc.ctx;
            const point=root.WorldToScreenPoint(Point.rotate(this.point,this.angle));
            ctx.beginPath();
            ctx.arc(point.x,cc.height-point.y,root.WorldToScreenGrid(this.radius),this.startingAngle,this.endingAngle);
            ctx.strokeStyle=this.strokeStyle;
            ctx.stroke();
        }
    }
    class World extends Node{
        constructor(config){
            super();
            this.point=Point(0,0);
            this.grid=1
            Object.assign(this,config);
    
        }
        show(){
            for(let x=0;x<=75;x++){
                const line=new ccLine(Point(x,0),Point(x,133))
                line.strokeStyle='#ddd'
                this.add(line)
            }
    
            for(let y=0;y<=133;y++){
                const line=new ccLine(Point(0,y),Point(75,y))
                line.strokeStyle='#ddd'
                this.add(line)
            }
        }
        WorldToScreenGrid(grid){
            grid=this.grid*grid;
            if(this.parent instanceof World){
                grid= this.parent.WorldToScreenGrid(grid)
            }
            return grid;
        }
        WorldToScreenPoint(pos){
            pos=Point.add(Point.rotate(Point.multiply(pos,this.grid),this.angle),this.point)
            if(this.parent instanceof World){
                pos= this.parent.WorldToScreenPoint(pos)
            }
            return pos;
        }
        ScreenToWorldPoint(pos){
            if(this.parent instanceof World){
                pos=this.parent.ScreenToWorldPoint(pos)
            }
            return Point.divide(Point.rotate(Point.sub(pos,this.point),-this.angle),this.grid);
        }
    }
    class Game extends World{
    
        constructor(){
            super()
    
            //交互
            const handle=(e)=> {
                let type=e.type;
                if(type==='mousedown'){
                    type='touchstart';
                }
                if(type==='mousemove'){
                    type='touchmove';
                }
                if(type==='mouseup'){
                    type='touchend';
                }
                if(type==='touchcancel'){
                    type='touchend';
                }
                if(e.type==='mousedown'||e.type==='mousemove'||e.type==='mouseup'){
    
                    this[type]([Point(
                        e.x-cc.rect.left,
                        cc.height-(e.y-cc.rect.top)
                    )])
                }else if(e.type==='touchstart'||e.type==='touchmove'||e.type==='touchend'){
                    const arr=[]
                    for(let i=0;i<e.touches.length;i++){
                        const item=e.touches[i];
                        arr.push(Point(
                            item.pageX-cc.rect.left,
                            cc.height-(item.pageY-cc.rect.top)
                        ))
                    }
                    this[type](arr)
    
                }
    
            }
            document.addEventListener('mousedown',handle)
            document.addEventListener('mousemove',handle)
            document.addEventListener('mouseup',handle)
    
            document.addEventListener('touchstart',handle,false)
            document.addEventListener('touchmove',handle,false)
            document.addEventListener('touchend',handle,false)
            document.addEventListener('touchcancel',handle,false)
    
            this.world=new World({
                point:Point(0,0),
                grid:5,
            });
            // this.world2=new World({
            //     point:Point(1,1),
            //     grid:0.5,
            // });
            // this.world.add(this.world2)
            this.add(this.world)
    
            this.runArr=['initAxes','slump'];
        }
        init(){
            this.progress=new Step(this.runArr,(step,time)=>{
                this[step](step,time);
                cc.ctx.clearRect(0,0,cc.width,cc.height);
                this.render()
            })
            this.progress.run();
    
        }
    
        initAxes(){
            // this.show()
            // this.world.show()
    
    
            this.progress.waitSecondAndGo();
    
            // this.rect={
            //     top:10,left:-10,bottom:-10,right:10
            // }
            // this.direct='right';
            this.slumpObject=[]
            for(let k=0;k<100;k++){
                const circle=new ccCircle(Point(0|Math.random()*75,0|Math.random()*133),2)
                this.world.add(circle)
                this.slumpObject.push(circle)
            }
    
        }
        slump(){
            this.slumpObject=this.slumpObject.filter( (obj) =>{
                if(obj.point.y>0){
                    obj.point.y-=0.1;
                    return true
                }else{
                    this.world.remove(obj)
                    return false
                }
            })
            this.progress.waitSecondAndGo(0.1,'slump')
        }
        toggle(){
            if(this.direct=='right'){
                if(this.circle.point.x<this.rect.right){
                    this.circle.point.x+=1
                }else{
                    this.rect.top-=1;
                    this.direct='bottom'
                }
    
            }else if(this.direct=='bottom'){
                if(this.circle.point.y>this.rect.bottom){
                    this.circle.point.y-=1
                }else{
                    this.rect.right-=1
                    this.direct='left'
                }
    
            }else if(this.direct=='left'){
                if(this.circle.point.x>this.rect.left){
                    this.circle.point.x-=1
                }else{
                    this.rect.bottom+=1
                    this.direct='top'
                }
            }else if(this.direct=='top'){
                if(this.circle.point.y<this.rect.top){
                    this.circle.point.y+=1
                }else{
                    this.rect.left+=1
                    this.direct='right'
                }
            }
            if(this.circle.point.x==0&&this.circle.point.y==0){
                return;
            }
            console.log(this.circle.point)
            // this.world.grid=this.world.grid+this.addNum;
            // this.world.angle+=0.3;
            // this.world2.angle-=0.3;
            // if(this.world.grid>100){
            //     this.addNum=-2;
            // }
            // if(this.world.grid<20){
            //     this.addNum=2;
            // }
            this.progress.waitSecondAndGo(0.1,'toggle')
        }
        touchstart([pos]){
            console.log(pos)
            console.log(this.world.ScreenToWorldPoint(pos))
            // console.log(this.world2.ScreenToWorldPoint(pos))
        }
        touchmove([pos]){
    
        }
        touchend([pos]){
    
        }
    }
    new Game().init()
    View Code

    index.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="utf-8">
        <meta content="initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no, width=device-width,viewport-fit=cover" name="viewport">
        <title>坐标系-caoke90</title>
    </head>
    <style>
        html,body {
            overflow: hidden;
            height: 100%;
        }
    </style>
    <body>
    <canvas id="myCanvas"></canvas>
        <script src="cc.js"></script>
        <script src="test.js"></script>
    </body>
    </html>
    View Code
  • 相关阅读:
    codevs 3641 上帝选人
    codevs 1966 乘法游戏
    codevs 1345 饥饿的奶牛
    codevs 1962 马棚问题--序列型DP
    codevs 1959 拔河比赛--判断背包内刚好装满n/2个物品
    codevs 1297 硬币
    [转载]矩阵取数游戏
    101.金明的预算方案(分组背包)
    105.(并查集结合绝对值最小的01背包)选学霸
    POJ 2528 Mayor's posters(线段树)
  • 原文地址:https://www.cnblogs.com/caoke/p/10584402.html
Copyright © 2020-2023  润新知