• javascript多边形碰撞检测


    javascript多边形碰撞检测

    原理就是 循环每个顶点判断是不是在多边形内

             const app = new PIXI.Application({ antialias: true });
    document.body.appendChild(app.view);
    
    const graphics = new PIXI.Graphics();
    
    
    // draw polygon
    const path = [600, 370, 700, 460, 780, 420, 730, 570, 590, 520];
    
    graphics.lineStyle(0);
    graphics.beginFill(0x3500FA, 1);
    graphics.drawPolygon(path);
    graphics.endFill();
    
    app.stage.addChild(graphics);
    
      var xuanzhuan = PIXI.Sprite.from('/moban/images/share.jpg');
      xuanzhuan.width=120;
      xuanzhuan.height=120;
      xuanzhuan.x=13;
      xuanzhuan.y=33;
       app.stage.addChild(xuanzhuan);
    
    
        xuanzhuan.interactive = true;
    
        xuanzhuan.buttonMode = true;
          xuanzhuan
            .on('pointerdown', onDragStart)
            .on('pointerup', onDragEnd)
            .on('pointerupoutside', onDragEnd)
            .on('pointermove', onDragMove);
    
       function onDragStart(event) {
        // store a reference to the data
        // the reason for this is because of multitouch
        // we want to track the movement of this particular touch
        this.data = event.data;
        this.alpha = 0.5;
        this.dragging = true;
    }
    
    function onDragEnd() {
        this.alpha = 1;
        this.dragging = false;
        // set the interaction data to null
        this.data = null;
    }
         var   posPolygon=[];
             var dianlist={};
            dianlist['x']=600;
            dianlist['y']=370; 
            posPolygon.push(dianlist)
        var dianlist={};
            dianlist['x']=700;
            dianlist['y']=460; 
            posPolygon.push(dianlist)    
        var dianlist={};
            dianlist['x']=780;
            dianlist['y']=420; 
            posPolygon.push(dianlist)      
        var dianlist={};
            dianlist['x']=730;
            dianlist['y']=570; 
          posPolygon.push(dianlist)  
        var dianlist={};
            dianlist['x']=590;
            dianlist['y']=520; 
            posPolygon.push(dianlist)
    function onDragMove() {
        if (this.dragging) {
            const newPosition = this.data.getLocalPosition(this.parent);
            this.x = newPosition.x;
            this.y = newPosition.y;
    
            var baoweihe=this.getBounds();
            var youxiajiaox=baoweihe.x+baoweihe.width;
            var youxiajiaoy=baoweihe.y+baoweihe.height;
    
            var poslist=[];
              var pos={};
            pos['x']=baoweihe.x;
            pos['y']=baoweihe.y;       
            poslist.push(pos);           
    
       var pos={};
            pos['x']=youxiajiaox;
            pos['y']=baoweihe.y;       
            poslist.push(pos);           
            var pos={};
            pos['x']=youxiajiaox;
            pos['y']=youxiajiaoy;       
            poslist.push(pos);
    
            var pos={};
            pos['x']=baoweihe.x;
            pos['y']=youxiajiaoy;       
            poslist.push(pos);        
    
              
        
            var ispengzhuang=PolygonInPolygon(poslist, posPolygon,5);
            if(ispengzhuang){
                alert('碰撞了');
            }
    
    
        }
    }
    
    function PolygonInPolygon(posPolygonA, posPolygonB, count){
        console.log(posPolygonA);
           var count1=posPolygonA.length;
          for(var i=0;i<count1;i++ ){
            var pos=posPolygonA[i];
               console.log(pos);
              var  ispengzhuang=PointInPolygon( pos, posPolygonB, count);
              if(ispengzhuang){
                alert('碰撞了')
              }
          }
    }
    
    function PointInPolygon( pos, posPolygonB, count)
    {
        var cross = 0; //交点个数
           
        for( var i = 0; i < count; i++ )
        {
            var p1 = posPolygon[i];
            var p2 = posPolygon[(i + 1) % count]; //下一个节点
     
            // p1p2这条边与水平线平行
            if( p1.y == p2.y )
                continue;
     
            // 交点在p1p2的延长线上
            if( pos.y < Math.min( p1.y, p2.y ) )
                continue;
     
            // 交点在p1p2的延长线上
            if( pos.y > Math.max( p1.y, p2.y ) )
                continue;
                
            // 计算交点 X 左边 : (p2.y - p1.y)/(p2.x - p1.x) = (y - p1.y)/(x - p1.x)
            // 直线 K 值相等, 交点y = pos.y
            let x = (pos.y - p1.y) * (p2.x - p1.x) / (p2.y - p1.y) + p1.x
            // 只统计单边交点,即点的正向方向
            if(x > pos.x)
                cross ++;
        }
     
        return cross % 2 == 1;
    }
  • 相关阅读:
    第19篇 2016年计划
    第18篇 我的中国梦
    Linux中文件实时同步
    Ansible Playbook
    Ansible简介及常用模块
    HTTP协议简单认识
    zabbix 分布式监控Proxy
    Zabbix中Agent自动注册
    Groovy基础语法
    Python文件操作
  • 原文地址:https://www.cnblogs.com/newmiracle/p/13858758.html
Copyright © 2020-2023  润新知