作者:手机用户2502877197 | 来源:互联网 | 2023-08-16 19:45
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 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多边形碰撞检测的资料请关注编程笔记其它相关文章!
原文链接:https://www.cnblogs.com/newmiracle/p/13858758.html