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 相关文章推荐
使用javascript控制cookie显示和隐藏背景图
Feb 12 Javascript
jquery清空表单数据示例分享
Feb 13 Javascript
轻松实现Bootstrap图片轮播
Apr 20 Javascript
基于jquery实现无限级树形菜单
Mar 22 Javascript
es7学习教程之fetch解决异步嵌套问题的方法示例
Jul 21 Javascript
微信小程序实现YDUI的ScrollTab组件
Feb 02 Javascript
JS实现的input选择图片本地预览功能示例
Aug 29 Javascript
laydate如何根据开始时间或者结束时间限制范围
Nov 15 Javascript
js实现简单模态框实例
Nov 16 Javascript
详解Vue CLI 3.0脚手架如何mock数据
Nov 23 Javascript
详解Node.js一行命令上传本地文件到服务器
Apr 22 Javascript
layui prompt 设置允许空白提交的方法
Sep 24 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判断变量是否为0的方法
2014/02/08 PHP
PHP错误机制知识汇总
2016/03/24 PHP
laravel 错误处理,接口错误返回json代码
2019/10/25 PHP
在js(jquery)中获得文本框焦点和失去焦点的方法
2012/12/04 Javascript
详解jQuery插件开发中的extend方法
2013/11/19 Javascript
jquery实现tr元素的上下移动示例代码
2013/12/20 Javascript
jQuery实现向下滑出的二级菜单效果实例
2015/08/22 Javascript
jquery实现简单合拢与展开网页面板的方法
2015/09/01 Javascript
微信小程序 教程之列表渲染
2016/10/18 Javascript
servlet+jquery实现文件上传进度条示例代码
2017/01/25 Javascript
vue-cli 构建骨架屏的方法示例
2018/11/08 Javascript
vue数据初始化initState的实例详解
2019/04/11 Javascript
使用localStorage替代cookie做本地存储
2019/09/25 Javascript
通过js随机函数Math.random实现乱序
2020/05/19 Javascript
深入分析JavaScript 事件循环(Event Loop)
2020/06/19 Javascript
[00:59]PWL开团时刻DAY7——我在赶
2020/11/06 DOTA
python操作数据库之sqlite3打开数据库、删除、修改示例
2014/03/13 Python
Python常见数据结构详解
2014/07/24 Python
python分析apache访问日志脚本分享
2015/02/26 Python
一个基于flask的web应用诞生 使用模板引擎和表单插件(2)
2017/04/11 Python
python编辑用户登入界面的实现代码
2018/07/16 Python
python opencv捕获摄像头并显示内容的实现
2019/07/11 Python
pandas 如何分割字符的实现方法
2019/07/29 Python
初学者学习Python好还是Java好
2020/05/26 Python
英国第一的购买便宜玩具和游戏的在线购物网站:Bargain Max
2018/01/24 全球购物
美国修容界大佬创建的个人美妆品牌:Kevyn Aucoin Beauty
2018/12/12 全球购物
美国在线购买和出售礼品卡网站:EJ Gift Cards
2019/06/09 全球购物
挂职思想汇报
2013/12/31 职场文书
公司部门司机岗位职责
2014/01/03 职场文书
社会实践感言
2014/01/25 职场文书
大专毕业自我鉴定
2014/02/04 职场文书
公证委托书大全
2014/04/04 职场文书
结婚通知短信怎么写
2015/04/17 职场文书
python实现三阶魔方还原的示例代码
2021/04/28 Python
redis使用不当导致应用卡死bug的过程解析
2021/07/01 Redis
python ConfigParser库的使用及遇到的坑
2022/02/12 Python