javascript实现多边形碰撞检测


Posted in Javascript onOctober 24, 2020

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;
}

以上就是javascript实现多边形碰撞检测的详细内容,更多关于javascript多边形碰撞检测的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
js类 from qq
Nov 13 Javascript
js判断浏览器的比较全的代码
Feb 13 Javascript
jquery实现表格奇数偶数行不同样式(有图为证及实现代码)
Jan 23 Javascript
javascript实现日期格式转换
Dec 16 Javascript
js实现可兼容IE、FF、Chrome、Opera及Safari的音乐播放器
Feb 11 Javascript
JavaScript获取伪元素(Pseudo-Element)属性的方法技巧
Mar 13 Javascript
浅谈javascript函数式编程
Sep 06 Javascript
JavaScript从0开始构思表情插件
Jul 26 Javascript
详解ES6之用let声明变量以及let loop机制
Jul 15 Javascript
微信小程序之前台循环数据绑定
Aug 18 Javascript
swiper.js插件实现pc端文本上下滑动功能示例
Dec 03 Javascript
读懂CommonJS的模块加载
Apr 19 Javascript
解决vue scoped html样式无效的问题
Oct 24 #Javascript
vue项目查看vue版本及cli版本的实现方式
Oct 24 #Javascript
Ant Design的Table组件去除
Oct 24 #Javascript
Ant design vue table 单击行选中 勾选checkbox教程
Oct 24 #Javascript
Antd的Table组件嵌套Table以及选择框联动操作
Oct 24 #Javascript
解决Antd 里面的select 选择框联动触发的问题
Oct 24 #Javascript
ant-design-vue中的select选择器,对输入值的进行筛选操作
Oct 24 #Javascript
You might like
PHP实现时间轴函数代码
2011/10/08 PHP
PHP实现的sqlite数据库连接类
2014/12/12 PHP
PHP针对字符串开头和结尾的判断方法
2016/07/11 PHP
ThinkPHP框架实现的邮箱激活功能示例
2018/06/15 PHP
Yii框架小部件(Widgets)用法实例详解
2020/05/15 PHP
JavaScript判断两种格式的输入日期的正确性的代码
2007/03/25 Javascript
javascript Demo模态窗口
2009/12/06 Javascript
Js注册协议倒计时的小例子
2013/06/24 Javascript
Flexigrid在IE下不显示数据的处理的解决方法
2013/10/24 Javascript
javascript操作html控件实例(javascript添加html)
2013/12/02 Javascript
JavaScript字符串对象substr方法入门实例(用于截取字符串)
2014/10/16 Javascript
jQuery中:enabled选择器用法实例
2015/01/04 Javascript
js基于cookie方式记住返回页面用法示例
2016/05/27 Javascript
seajs下require书写约定实例分析
2018/05/16 Javascript
微信公众号平台接口开发 菜单管理的实现
2019/08/14 Javascript
vue router动态路由设置参数可选问题
2019/08/21 Javascript
vue+render+jsx实现可编辑动态多级表头table的实例代码
2020/04/01 Javascript
[31:01]2014 DOTA2国际邀请赛中国区预选赛5.21 CNB VS Orenda
2014/05/23 DOTA
wxPython事件驱动实例详解
2014/09/28 Python
python比较两个列表大小的方法
2015/07/11 Python
Python安装第三方库及常见问题处理方法汇总
2016/09/13 Python
python 换位密码算法的实例详解
2017/07/19 Python
Python实现统计给定列表中指定数字出现次数的方法
2018/04/11 Python
python中的decorator的作用详解
2018/07/26 Python
Python爬虫框架Scrapy常用命令总结
2018/07/26 Python
Python django使用多进程连接mysql错误的解决方法
2018/10/08 Python
python 中如何获取列表的索引
2019/07/02 Python
Numpy与Pytorch 矩阵操作方式
2019/12/27 Python
python 图像插值 最近邻、双线性、双三次实例
2020/07/05 Python
西班牙汉普顿小姐:购买帆布鞋和太阳镜
2016/10/23 全球购物
儿媳婚宴答谢词
2014/01/14 职场文书
防暑降温通知书
2015/04/27 职场文书
2015初中生物教研组工作总结
2015/07/21 职场文书
2019邀请函格式及范文
2019/05/20 职场文书
SONY AN-LP1 短波有源天线放大器图
2022/04/05 无线电
Python使用pandas导入xlsx格式的excel文件内容操作代码
2022/12/24 Python