明霞山资源网 Design By www.htccd.com
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多边形碰撞检测的资料请关注其它相关文章!
明霞山资源网 Design By www.htccd.com
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
明霞山资源网 Design By www.htccd.com
暂无评论...
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。