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 相关文章推荐
经典的带阴影的可拖动的浮动层
Jun 26 Javascript
jquery 简短几句代码实现给元素动态添加及获取提示信息
Sep 01 Javascript
通过Javascript创建一个选择文件的对话框代码
Jun 16 Javascript
浅析jQuery(function(){})与(function(){})(jQuery)之间的区别
Jan 09 Javascript
jQuery对象与DOM对象之间的相互转换
Mar 03 Javascript
JavaScript清空数组元素的两种方法简单比较
Jul 10 Javascript
js实现选中复选框文字变色的方法
Aug 14 Javascript
JavaScript高级教程5.6之基本包装类型(详细)
Nov 23 Javascript
在其他地方你学不到的jQuery小贴士和技巧(欢迎收藏)
Jan 20 Javascript
详解Javascript百度地图接口开发文档中的类和方法
Feb 07 Javascript
关于meta viewport中target-densitydpi属性详解(推荐)
Aug 18 Javascript
js操作table中tr的顺序实现上移下移一行的效果
Nov 22 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 curl获取301或302转向的网址问题的解决方法
2011/06/02 PHP
PHP判断搜索引擎蜘蛛并自动记忆到文件的代码
2012/02/04 PHP
PHP调用VC编写的COM组件实例
2014/03/29 PHP
ThinkPHP验证码和分页实例教程
2014/08/22 PHP
php实现递归的三种基本方式
2020/07/04 PHP
PHP使用preg_split和explode分割textarea存放内容的方法分析
2017/07/03 PHP
yii2.0整合阿里云oss删除单个文件的方法
2017/09/19 PHP
PHP Pipeline 实现中间件的示例代码
2020/04/26 PHP
bgsound 背景音乐 的一些常用方法及特殊用法小结
2010/05/11 Javascript
jQuery load方法用法集锦
2011/12/06 Javascript
jquerydom对象的事件隐藏显示和对象数组示例
2013/12/10 Javascript
js 点击页面其他地方关闭弹出层(示例代码)
2013/12/24 Javascript
删除节点的jquery代码
2014/01/13 Javascript
javascript实现获取浏览器版本、浏览器类型
2015/12/02 Javascript
在JavaScript中调用Java类和接口的方法
2016/09/07 Javascript
input 标签实现输入框带提示文字效果(两种方法)
2017/10/09 Javascript
Vue路由模块化配置的完整步骤
2019/08/14 Javascript
中级前端工程师必须要掌握的27个JavaScript 技巧(干货总结)
2019/09/23 Javascript
react PropTypes校验传递的值操作示例
2020/04/28 Javascript
Python 代码性能优化技巧分享
2012/08/07 Python
在Gnumeric下使用Python脚本操作表格的教程
2015/04/14 Python
把项目从Python2.x移植到Python3.x的经验总结
2015/04/20 Python
Python简单连接MongoDB数据库的方法
2016/03/15 Python
Python制作Windows系统服务
2017/03/25 Python
Python实现单词翻译功能
2017/06/06 Python
python数据结构链表之单向链表(实例讲解)
2017/07/25 Python
Python实现简单的文本相似度分析操作详解
2018/06/16 Python
Python实现查找最小的k个数示例【两种解法】
2019/01/08 Python
Python中logging实例讲解
2019/01/17 Python
CSS3中设置3D变形的transform-style属性详解
2016/05/23 HTML / CSS
高中生物教学反思
2014/02/05 职场文书
气象学专业个人求职信
2014/04/22 职场文书
秋天的图画教学反思
2014/05/01 职场文书
高中生学习计划书
2014/09/15 职场文书
详解MySQL事务的隔离级别与MVCC
2021/04/22 MySQL
解决MySQL存储时间出现不一致的问题
2021/04/28 MySQL