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 动态table添加colspan\rowspan 参数的方法
Jul 25 Javascript
基于jQuery中对数组进行操作的方法
Apr 16 Javascript
在js文件中写el表达式取不到值的原因及解决方法
Dec 23 Javascript
jquery的attr方法禁用表单元素禁用输入内容
Jun 23 Javascript
Jquery设置attr的disabled属性控制某行显示或者隐藏
Sep 25 Javascript
jQuery中队列queue()函数的实例教程
May 03 Javascript
JavaScript实现鼠标点击导航栏变色特效
Feb 08 Javascript
Angular.js ng-file-upload结合springMVC的使用教程
Jul 10 Javascript
Angular实现点击按钮控制隐藏和显示功能示例
Dec 29 Javascript
Vue中的作用域CSS和CSS模块的区别
Oct 09 Javascript
AJAX在JQuery中的应用详解
Jan 30 jQuery
javascript中call,apply,callee,caller用法实例分析
Jul 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
建立文件交换功能的脚本(一)
2006/10/09 PHP
PHP在引号前面添加反斜杠(PHP去除反斜杠)
2013/09/28 PHP
使用PHP强制下载PDF文件示例
2014/01/17 PHP
PHP与Java对比学习日期时间函数
2016/07/03 PHP
PHP的微信支付接口使用方法讲解
2019/03/08 PHP
PHP如何实现阿里云短信sdk灵活应用在项目中的方法
2019/06/14 PHP
JavaScript实现拖拽网页内元素的方法
2015/04/15 Javascript
跟我学习javascript的this关键字
2020/05/28 Javascript
jQuery实现多级联动下拉列表查询框
2016/01/18 Javascript
JavaScript mixin实现多继承的方法详解
2017/03/30 Javascript
详解Node.js开发中的express-session
2017/05/19 Javascript
AngularJS动态绑定ng-options的ng-model实例代码
2017/06/21 Javascript
javascript计算对象长度的方法
2017/10/25 Javascript
layer.open的自适应及居中及子页面标题的修改方法
2019/09/05 Javascript
[02:28]DOTA2亚洲邀请赛 LGD战队巡礼
2015/02/03 DOTA
[01:03:13]VG vs Pain 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
[27:08]完美世界DOTA2联赛PWL S2 SZ vs Rebirth 第二场 11.21
2020/11/23 DOTA
linux系统使用python监控apache服务器进程脚本分享
2014/01/15 Python
Python脚本实现自动发带图的微博
2016/04/27 Python
Python多线程经典问题之乘客做公交车算法实例
2017/03/22 Python
Python安装Numpy和matplotlib的方法(推荐)
2017/11/02 Python
纯CSS绘制漂亮的圆形图案效果
2014/05/07 HTML / CSS
HTML5 新事件 小结
2009/07/16 HTML / CSS
世界上第一个水枕头:Mediflow
2018/12/06 全球购物
美国在线鞋类零售商:LifeStride
2019/06/09 全球购物
法国在线药房:1001Pharmacies
2021/03/07 全球购物
求职自荐信范文格式
2013/11/29 职场文书
化学实验员岗位职责
2013/12/28 职场文书
4s店市场专员岗位职责
2014/04/09 职场文书
《猴子种果树》教学反思
2014/04/26 职场文书
集体生日活动方案
2014/08/18 职场文书
乡镇党委书记个人整改措施
2014/09/15 职场文书
人事文员岗位职责
2015/02/04 职场文书
巴黎圣母院读书笔记
2015/06/26 职场文书
详解CocosCreator消息分发机制
2021/04/16 Javascript
HTML基本元素标签介绍
2022/02/28 HTML / CSS