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 相关文章推荐
ExtJS 入门
Oct 29 Javascript
JavaScript执行顺序详细介绍
Dec 04 Javascript
使用jquery组件qrcode生成二维码及应用指南
Feb 22 Javascript
jQuery DOM删除节点操作指南
Mar 03 Javascript
NPM 安装cordova时警告:npm WARN deprecated minimatch@2.0.10: Please update to minimatch 3.0.2 or higher to
Dec 20 Javascript
js 转义字符及URI编码详解
Feb 28 Javascript
JavaScript基于扩展String实现替换字符串中index处字符的方法
Jun 13 Javascript
JavaScript插件Tab选项卡效果
Nov 14 Javascript
基于Vue组件化的日期联动选择器功能的实现代码
Nov 30 Javascript
Vue+ElementUI项目使用webpack输出MPA的方法
Aug 27 Javascript
浅谈vue中document.getElementById()拿到的是原值的问题
Jul 26 Javascript
vue 实现把路由单独分离出来
Aug 13 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快速url重写 更新版[需php 5.30以上]
2010/04/20 PHP
PHP APC的安装与使用详解
2013/06/13 PHP
thinkPHP统计排行与分页显示功能示例
2016/12/02 PHP
PHP空值检测函数与方法汇总
2017/11/19 PHP
php ajax数据传输和响应方法
2018/08/21 PHP
PHP使用mysqli同时执行多条sql查询语句的实例
2019/03/22 PHP
document.open() 与 document.write()的区别
2007/08/13 Javascript
js 字符串操作函数
2009/07/25 Javascript
JS TextArea字符串长度限制代码集合
2012/10/31 Javascript
从零学JS之你需要了解的几本书
2014/05/19 Javascript
我的Node.js学习之路(一)
2014/07/06 Javascript
JavaScript学习心得之概述
2015/01/20 Javascript
JavaScript删除数组元素的方法
2015/03/20 Javascript
跟我学习javascript的全局变量
2015/11/16 Javascript
js命名空间写法示例
2015/12/18 Javascript
AngularJS实现星星等级评分功能
2016/09/24 Javascript
laydate.js日期时间选择插件
2017/01/04 Javascript
jquery对象与DOM对象转化
2017/02/08 Javascript
bootstrap表单示例代码分享
2017/05/18 Javascript
webpack教程之webpack.config.js配置文件
2017/07/05 Javascript
原生JS实现瀑布流插件
2018/02/06 Javascript
用react-redux实现react组件之间数据共享的方法
2018/06/08 Javascript
layer扩展打开/关闭动画的方法
2019/09/23 Javascript
js实现计时器秒表功能
2019/12/16 Javascript
一篇不错的Python入门教程
2007/02/08 Python
基于Django模板中的数字自增(详解)
2017/09/05 Python
Python3爬虫教程之利用Python实现发送天气预报邮件
2018/12/16 Python
使用Puppeteer爬取微信文章的实现
2020/02/11 Python
FILA斐乐中国官方商城:意大利运动品牌
2017/01/25 全球购物
美国时尚孕妇装品牌:A Pea in the Pod
2017/07/16 全球购物
Made in Design英国:设计家具、照明、家庭装饰和花园家具
2019/09/24 全球购物
数学系个人求职信范文
2014/01/30 职场文书
低碳环保口号
2014/06/12 职场文书
致百米运动员广播稿5篇
2014/10/13 职场文书
公司职员入党自传书
2015/06/26 职场文书
诗词赏析-(浣溪沙)
2019/08/13 职场文书