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基础的动画教程,直观易懂
Jan 10 Javascript
发一个自己用JS写的实用看图工具实现代码
Jul 26 Javascript
JavaScript 字符串与数组转换函数[不用split与join]
Dec 13 Javascript
关于jQuery对象数据缓存Cache原理以及jQuery.data详解
Apr 07 Javascript
JSON遍历方式实例总结
Dec 07 Javascript
JS实现iframe自适应高度的方法示例
Jan 07 Javascript
bootstrap Validator 模态框、jsp、表单验证 Ajax提交功能
Feb 17 Javascript
基于Vue的文字跑马灯组件(npm 组件包)
May 24 Javascript
vue-router相关基础知识及工作原理
Mar 16 Javascript
vue router的基本使用和配置教程
Nov 05 Javascript
js实现一个简易计算器
Mar 30 Javascript
vue-cli3.x配置全局的scss的时候报错问题及解决
Apr 30 Vue.js
解决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递归获取目录内文件(包含子目录)封装类分享
2013/12/25 PHP
PHP实现的博客欢迎提示功能(很特别哦)
2014/06/05 PHP
Yii框架弹出窗口组件CJuiDialog用法分析
2017/01/07 PHP
phpStudy配置多站点多域名方法及遇到的403错误解决方法
2017/10/19 PHP
php操作redis数据库常见方法实例总结
2020/02/20 PHP
laravel与thinkphp之间的区别与优缺点
2021/03/02 PHP
详解js图片轮播效果实现原理
2015/12/17 Javascript
jQuery+PHP实现微信转盘抽奖功能的方法
2016/05/25 Javascript
AngularJS实现星星等级评分功能
2016/09/24 Javascript
JavaScript版经典游戏之扫雷游戏完整示例【附demo源码下载】
2016/12/12 Javascript
jQuery获取选中单选按钮radio的值
2016/12/27 Javascript
详解JS中的快速排序与冒泡
2017/01/10 Javascript
Javascript基础回顾之(三) js面向对象
2017/01/31 Javascript
JS和canvas实现俄罗斯方块
2017/03/14 Javascript
socket.io学习教程之基础介绍(一)
2017/04/29 Javascript
弱类型语言javascript中 a,b 的运算实例小结
2019/08/07 Javascript
在Echarts图中给坐标轴加一个标识线markLine
2020/07/20 Javascript
python的中异常处理机制
2018/08/30 Python
详解Python使用Plotly绘图工具,绘制甘特图
2019/04/02 Python
Python2和Python3的共存和切换使用
2019/04/12 Python
详解PyCharm安装MicroPython插件的教程
2019/06/24 Python
Python django框架输入汉字,数字,字符生成二维码实现详解
2019/09/24 Python
python_mask_array的用法
2020/02/18 Python
python 实现的IP 存活扫描脚本
2020/12/10 Python
html5组织内容_动力节点Java学院整理
2017/07/10 HTML / CSS
一站式跨境收款解决方案:Payoneer(派安盈)
2018/09/06 全球购物
美国最大的在线生存商店:Survival Frog
2020/12/13 全球购物
学校采购员岗位职责
2014/01/02 职场文书
银行类自荐信
2014/02/04 职场文书
2014年乡镇民政工作总结
2014/12/02 职场文书
毕业生对母校寄语
2015/02/26 职场文书
我们的节日中秋节活动总结
2015/03/23 职场文书
大学生读书笔记范文
2015/07/01 职场文书
mysql的数据压缩性能对比详情
2021/11/07 MySQL
vue项目proxyTable配置和部署服务器
2022/04/14 Vue.js
HTML实现仿Windows桌面主题特效的实现
2022/06/28 HTML / CSS