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 相关文章推荐
ppk谈JavaScript style属性
Oct 10 Javascript
AJAX的跨域与JSONP(为文章自动添加短址的功能)
Jan 17 Javascript
关于Jqzoom的使用心得 jquery放大镜效果插件
Apr 12 Javascript
JQuery分别取得每行最后一列和最后一行的示例代码
Aug 18 Javascript
如何在node的express中使用socket.io
Dec 15 Javascript
Angularjs 实现移动端在线测评效果(推荐)
Apr 05 Javascript
vue-cli的eslint相关用法
Sep 29 Javascript
浅析为什么a=&quot;abc&quot; 不等于 a=new String(&quot;abc&quot;)
Oct 25 Javascript
Vue+webpack项目基础配置教程
Feb 12 Javascript
详解Vue 多级组件透传新方法provide/inject
May 09 Javascript
vue-router懒加载速度缓慢问题及解决方法
Nov 25 Javascript
Angular2使用SVG自定义图表(条形图、折线图)组件示例
May 10 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 Socket配置以及实例的详细介绍
2013/06/13 PHP
PHP中使用FFMPEG获取视频缩略图和视频总时长实例
2014/05/04 PHP
php使用glob函数快速查询指定目录文件的方法
2014/11/15 PHP
PHP/HTML混写的四种方式总结
2017/02/27 PHP
php使用curl获取header检测开启GZip压缩的方法
2018/08/15 PHP
javascript 放大镜 v1.0 基于Yui2 实现的放大镜效果
2010/03/08 Javascript
js日历功能对象
2012/01/12 Javascript
Three.js学习之正交投影照相机
2016/08/01 Javascript
jQuery点击弹出层弹出模态框点击模态框消失代码分享
2017/01/21 Javascript
vue之数据交互实例代码
2017/06/16 Javascript
vue中v-cloak解决刷新或者加载出现闪烁问题(显示变量)
2018/04/20 Javascript
简述vue路由打开一个新的窗口的方法
2018/11/29 Javascript
详解vue中使用transition和animation的实例代码
2020/12/12 Vue.js
JavaScript事件概念详解(区分静态注册和动态注册)
2021/02/05 Javascript
[15:57]教你分分钟做大人:斧王
2014/10/30 DOTA
wxPython学习之主框架实例
2014/09/28 Python
Python标准库之循环器(itertools)介绍
2014/11/25 Python
python的继承知识点总结
2018/12/10 Python
Python 3.8中实现functools.cached_property功能
2019/05/29 Python
PyTorch中Tensor的数据统计示例
2020/02/17 Python
浅谈Python中re.match()和re.search()的使用及区别
2020/04/14 Python
Python 利用Entrez库筛选下载PubMed文献摘要的示例
2020/11/24 Python
Omio英国:搜索并比较便宜的巴士、火车和飞机
2019/08/27 全球购物
借款担保书范文
2014/05/13 职场文书
企业诚信承诺书
2014/05/23 职场文书
女生抽烟检讨书
2014/10/05 职场文书
2015年元旦晚会活动总结(学生会)
2014/11/28 职场文书
学雷锋献爱心倡议书
2015/04/27 职场文书
干部培训工作总结2015
2015/05/25 职场文书
2015入党个人自传范文
2015/06/26 职场文书
超市员工管理制度
2015/08/06 职场文书
优秀共产党员主要事迹材料
2015/11/05 职场文书
经典励志格言:每日一句,让你每天充满能量
2019/08/16 职场文书
springboot中rabbitmq实现消息可靠性机制详解
2021/09/25 Java/Android
mysql timestamp比较查询遇到的坑及解决
2021/11/27 MySQL
SpringBoot中使用Redis作为全局锁示例过程
2022/03/24 Java/Android