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 鼠标点击事件及其它捕获
Jun 04 Javascript
js监听滚动条滚动事件使得某个标签内容始终位于同一位置
Jan 24 Javascript
javascript正则表达式参数/g与/i及/gi的使用指南
Aug 27 Javascript
跟我学习javascript的prototype原型和原型链
Nov 18 Javascript
JavaScript中匿名函数的用法及优缺点详解
Jun 01 Javascript
js实现图片左右滚动效果
Feb 27 Javascript
JavaScript观察者模式(publish/subscribe)原理与实现方法
Mar 30 Javascript
JavaScript中递归实现的方法及其区别
Sep 12 Javascript
vue-test-utils初使用详解
May 23 Javascript
使用easyui从servlet传递json数据到前端页面的两种方法
Sep 05 Javascript
js实现旋转的星空效果
Nov 01 Javascript
JS中队列和双端队列实现及应用详解
Sep 29 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
一首老MP3,致敬WAR3经典
2021/03/08 魔兽争霸
php短域名转换为实际域名函数
2011/01/17 PHP
解析Ubuntu下crontab命令的用法
2013/06/24 PHP
php 字符串压缩方法比较示例
2014/01/23 PHP
PHP中使用Memache作为进程锁的操作类分享
2015/03/30 PHP
DEDECMS首页调用图片集里的多张图片
2015/06/05 PHP
通过Email发送PHP错误的方法
2015/07/20 PHP
php基于PDO实现功能强大的MYSQL封装类实例
2017/02/27 PHP
详解new function(){}和function(){}() 区别分析
2008/03/22 Javascript
jQuery之浮动窗口实现代码(两种方法)
2010/09/08 Javascript
js返回上一页并刷新代码整理
2012/12/21 Javascript
nodejs中exports与module.exports的区别详细介绍
2013/01/14 NodeJs
JQuery入门——事件切换之toggle()方法应用介绍
2013/02/05 Javascript
js中的preventDefault与stopPropagation详解
2014/01/29 Javascript
jquery 3D 标签云示例代码
2014/06/12 Javascript
setTimeout()递归调用不加引号出错的解决方法
2014/09/05 Javascript
在线引用最新jquery文件的实现方法
2016/08/26 Javascript
jQuery实现动态文字搜索功能
2017/01/05 Javascript
js图片放大镜效果实现方法详解
2020/10/28 Javascript
微信小程序商城项目之商品属性分类(4)
2017/04/17 Javascript
VUE 更好的 ajax 上传处理 axios.js实现代码
2017/05/10 Javascript
解决vue router使用 history 模式刷新后404问题
2017/07/19 Javascript
在Bootstrap开发框架中使用dataTable直接录入表格行数据的方法
2018/10/25 Javascript
仿ElementUI实现一个Form表单的实现代码
2019/04/23 Javascript
小程序云开发实现数据库异步操作同步化
2019/05/18 Javascript
vue.js实现简单购物车功能
2020/05/30 Javascript
python中使用序列的方法
2015/08/03 Python
Windows上配置Emacs来开发Python及用Python扩展Emacs
2015/11/20 Python
python实现一组典型数据格式转换
2018/12/15 Python
Python实现网页截图(PyQT5)过程解析
2019/08/12 Python
python3.5 cv2 获取视频特定帧生成jpg图片
2019/08/28 Python
纯CSS3实现的井字棋游戏
2020/11/25 HTML / CSS
手工制作的豪华英式沙发和沙发床:Willow & Hall
2019/05/03 全球购物
业务员工作态度散漫检讨书
2014/11/02 职场文书
稽核岗位职责范本
2015/04/13 职场文书
全民创业工作总结
2015/08/13 职场文书