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 相关文章推荐
IE6下opacity与JQuery的奇妙结合
Mar 01 Javascript
javascript中字符串拼接详解
Sep 26 Javascript
jquery实现先淡出再折叠收起的动画效果
Aug 07 Javascript
jQuery基于ajax()使用serialize()提交form数据的方法
Dec 08 Javascript
js停止冒泡和阻止浏览器默认行为的简单方法
May 15 Javascript
详解Vue.js搭建路由报错 router.map is not a function
Jun 27 Javascript
js断点调试心得分享(必看篇)
Dec 08 Javascript
Angular2开发环境搭建教程之VS Code
Dec 15 Javascript
JavaScript数据结构与算法之二叉树插入节点、生成二叉树示例
Feb 21 Javascript
小程序扫描普通链接二维码跳转小程序指定界面方法
May 07 Javascript
微信小程序tabBar 返回tabBar不刷新页面
Jul 25 Javascript
Vue ElementUI实现:限制输入框只能输入正整数的问题
Jul 31 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中使用SimpleXML检查XML文件结构实例
2015/01/07 PHP
如何批量清理系统临时文件(语言:C#、 C/C++、 php 、python 、java )
2016/02/01 PHP
thinkPHP框架实现图像裁剪、缩放、加水印的方法
2017/03/14 PHP
获取Javscript执行函数名称的方法
2006/12/22 Javascript
javascript 带有滚动条的表格,标题固定,带排序功能.
2009/11/13 Javascript
javascript new后的constructor属性
2010/08/05 Javascript
深入理解JQuery keyUp和keyDown的区别
2013/12/12 Javascript
javascript表单验证使用示例(javascript验证邮箱)
2014/01/07 Javascript
控制台报错object is not a function的解决方法
2014/08/24 Javascript
jQuery mobile类库使用时加载导航历史的方法简介
2015/12/04 Javascript
深入理解JavaScript中的并行处理
2016/09/22 Javascript
javascript实现鼠标点击页面 移动DIV
2016/12/02 Javascript
JS中绑定事件顺序(事件冒泡与事件捕获区别)
2017/01/24 Javascript
JavaScript实现求最大公共子串的方法
2018/02/03 Javascript
Vue 中axios配置实例详解
2018/07/27 Javascript
详解vue后台系统登录态管理
2019/04/02 Javascript
基于react项目打包css引用路径错误解决方案
2020/10/28 Javascript
在vue中动态修改css其中一个属性值操作
2020/12/07 Vue.js
[00:28]DOTA2北京网鱼队选拔赛
2015/04/08 DOTA
python中List的sort方法指南
2014/09/01 Python
python中requests爬去网页内容出现乱码问题解决方法介绍
2017/10/25 Python
PyQt5每天必学之进度条效果
2018/04/19 Python
python 通过SSHTunnelForwarder隧道连接redis的方法
2019/02/19 Python
python+os根据文件名自动生成文本
2019/03/21 Python
Linux下通过python获取本机ip方法示例
2019/09/06 Python
浅析Django 接收所有文件,前端展示文件(包括视频,文件,图片)ajax请求
2020/03/09 Python
python列表的逆序遍历实现
2020/04/20 Python
请写出 float x 与"零值"比较的 if 语句
2016/01/04 面试题
单位领导证婚词
2014/01/14 职场文书
中国梦演讲稿5分钟
2014/08/19 职场文书
小区门卫岗位职责范本
2014/08/24 职场文书
四风问题专项整治工作情况报告
2014/10/28 职场文书
夏洛特的网观后感
2015/06/15 职场文书
高中开学感言
2015/08/01 职场文书
小学大队干部竞选稿
2015/11/20 职场文书
MySQL系列之九 mysql查询缓存及索引
2021/07/02 MySQL