Javascript 返回交点位置和大小
我正在使用HTML5Javascript 返回交点位置和大小,javascript,jquery,html5-canvas,collision-detection,easeljs,Javascript,Jquery,Html5 Canvas,Collision Detection,Easeljs,我正在使用HTML5canvas标记开发一个小游戏,我发现了一个问题(),为了解决它,我需要检查数组中每个矩形之间的交集(完成),并返回交集位置和大小(我不能这样做,因为我的数学知识非常差)。有人能帮我吗 下面是rect数组冲突检测: for (var i = 0; i < rects.length; i++) { for (var others = 0; others < rects.length; others++) { if (others != i)
canvas
标记开发一个小游戏,我发现了一个问题(),为了解决它,我需要检查数组中每个矩形之间的交集(完成),并返回交集位置和大小(我不能这样做,因为我的数学知识非常差)。有人能帮我吗
下面是rect数组冲突检测:
for (var i = 0; i < rects.length; i++) {
for (var others = 0; others < rects.length; others++) {
if (others != i) {
if (rects[others].y + rects[others].height >= rects[i].y &&
rects[others].x + rects[others].width >= rects[i].x &&
rects[others].x <= rects[i].x + rects[i].width &&
rects[others].y <= rects[i].y + rects[i].height) {
// They're intersecting!
intery = 0; // Intersection Y
interx = 0; // Intersection X
interw = 0; // Intersection Width
interh = 0; // Intersection Height
}
}
}
}
for(变量i=0;i=rects[i].y&&
矩形[i].x+rects[others].width>=rects[i].x&&
矩形[others].x这将为两个矩形提供相交矩形。如果没有相交,则宽度为零
function rectangle(left,top, width, height) {
this.left=left;
this.top=top;
this.width=width;
this.height=height;
this.right=this.left+this.width;
this.bottom=this.top+this.height;
//method
this.intersect=intersect;
}
function intersect(rect) {
if(this.left>rect.left) {
var rightRect=this;
var leftRect=rect;
}
else {
var rightRect=rect;
var leftRect=this;
}
if(this.top>rect.top) {
var topRect=rect;
var botRect=this;
}
else {
var topRect=this;
var botRect=rect;
}
if(this.right>rect.right) {
var furtherRect=this;
var nearerRect=rect;
}
else {
var furtherRect=rect;
var nearerRect=this;
}
if(this.bottom>rect.bottom) {
var lowerRect=this;
var upperRect=rect;
}
else {
var lowerRect=rect;
var upperRect=this;
}
if(rightRect.left>leftRect.left+leftRect.width || botRect.top>topRect.top+topRect.height) {
var intersection=new rectangle(0,0,0,0);
}
else {
var intersection=new rectangle(rightRect.left,botRect.top,nearerRect.right-rightRect.left,upperRect.bottom-botRect.top);
}
return intersection;
}
但是,如果有两个以上的矩形,您希望在何处禁用碰撞。
例如,下面两个黄色区域中的哪一个
编辑图像校正
当然,还有3个矩形,R1,R2和R3可以相交的各种方式
R1带R2,但不带R3
R1与R2和R1与R3相交,但R1与R2和R1与R3的交点不相交
以及其他各种方式
矩形越多,可能性就越大。演示:
如果有这样定义的两个矩形:
var r1={
x:40,
y:40,
w:50,
h:30,
}
var r2={
x:60,
y:60,
w:50,
h:30,
}
function intersectingRect(r1,r2){
var x=Math.max(r1.x,r2.x);
var y=Math.max(r1.y,r2.y);
var xx=Math.min(r1.x+r1.w,r2.x+r2.w);
var yy=Math.min(r1.y+r1.h,r2.y+r2.h);
return({x:x,y:y,w:xx-x,h:yy-y});
}
var c={
x:50,
y:50,
r:15
}
function RectCircleColliding(circle,rect){
var distX = Math.abs(circle.x - rect.x-rect.w/2);
var distY = Math.abs(circle.y - rect.y-rect.h/2);
if (distX > (rect.w/2 + circle.r)) { return false; }
if (distY > (rect.h/2 + circle.r)) { return false; }
if (distX <= (rect.w/2)) { return true; }
if (distY <= (rect.h/2)) { return true; }
var dx=distX-rect.w/2;
var dy=distY-rect.h/2;
return (dx*dx+dy*dy<=(circle.r*circle.r));
}
然后,您可以按如下方式计算它们的相交矩形(如果有):
var r1={
x:40,
y:40,
w:50,
h:30,
}
var r2={
x:60,
y:60,
w:50,
h:30,
}
function intersectingRect(r1,r2){
var x=Math.max(r1.x,r2.x);
var y=Math.max(r1.y,r2.y);
var xx=Math.min(r1.x+r1.w,r2.x+r2.w);
var yy=Math.min(r1.y+r1.h,r2.y+r2.h);
return({x:x,y:y,w:xx-x,h:yy-y});
}
var c={
x:50,
y:50,
r:15
}
function RectCircleColliding(circle,rect){
var distX = Math.abs(circle.x - rect.x-rect.w/2);
var distY = Math.abs(circle.y - rect.y-rect.h/2);
if (distX > (rect.w/2 + circle.r)) { return false; }
if (distY > (rect.h/2 + circle.r)) { return false; }
if (distX <= (rect.w/2)) { return true; }
if (distY <= (rect.h/2)) { return true; }
var dx=distX-rect.w/2;
var dy=distY-rect.h/2;
return (dx*dx+dy*dy<=(circle.r*circle.r));
}
[添加:检测圆-矩形碰撞]
如果有这样定义的圆:
var r1={
x:40,
y:40,
w:50,
h:30,
}
var r2={
x:60,
y:60,
w:50,
h:30,
}
function intersectingRect(r1,r2){
var x=Math.max(r1.x,r2.x);
var y=Math.max(r1.y,r2.y);
var xx=Math.min(r1.x+r1.w,r2.x+r2.w);
var yy=Math.min(r1.y+r1.h,r2.y+r2.h);
return({x:x,y:y,w:xx-x,h:yy-y});
}
var c={
x:50,
y:50,
r:15
}
function RectCircleColliding(circle,rect){
var distX = Math.abs(circle.x - rect.x-rect.w/2);
var distY = Math.abs(circle.y - rect.y-rect.h/2);
if (distX > (rect.w/2 + circle.r)) { return false; }
if (distY > (rect.h/2 + circle.r)) { return false; }
if (distX <= (rect.w/2)) { return true; }
if (distY <= (rect.h/2)) { return true; }
var dx=distX-rect.w/2;
var dy=distY-rect.h/2;
return (dx*dx+dy*dy<=(circle.r*circle.r));
}
然后,您可以确定圆和矩形是否发生如下碰撞:
var r1={
x:40,
y:40,
w:50,
h:30,
}
var r2={
x:60,
y:60,
w:50,
h:30,
}
function intersectingRect(r1,r2){
var x=Math.max(r1.x,r2.x);
var y=Math.max(r1.y,r2.y);
var xx=Math.min(r1.x+r1.w,r2.x+r2.w);
var yy=Math.min(r1.y+r1.h,r2.y+r2.h);
return({x:x,y:y,w:xx-x,h:yy-y});
}
var c={
x:50,
y:50,
r:15
}
function RectCircleColliding(circle,rect){
var distX = Math.abs(circle.x - rect.x-rect.w/2);
var distY = Math.abs(circle.y - rect.y-rect.h/2);
if (distX > (rect.w/2 + circle.r)) { return false; }
if (distY > (rect.h/2 + circle.r)) { return false; }
if (distX <= (rect.w/2)) { return true; }
if (distY <= (rect.h/2)) { return true; }
var dx=distX-rect.w/2;
var dy=distY-rect.h/2;
return (dx*dx+dy*dy<=(circle.r*circle.r));
}
函数RectCircleColliding(圆,rect){
var distX=Math.abs(circle.x-rect.x-rect.w/2);
var distY=Math.abs(circle.y-rect.y-rect.h/2);
如果(distX>(rect.w/2+circle.r)){return false;}
如果(distY>(rect.h/2+circle.r)){return false;}
if(distX)我想做的是禁用矩形碰撞中的英雄碰撞(那是一个圆),正如你在这张图中看到的,因为如果我不这样做,圆碰撞计算不知道这个碰撞是否可能。我已经用这个:if(rects[I].y你有一个矩形数组,这可能意味着不止两个矩形,所以我仍然不清楚你是如何解释许多交叉点的。我用矩形和markE的逻辑展示了计算两个矩形底部和右侧的不同方法。如果你只有两个矩形,那么回答sho或should会为您提供所需的解决方案。对于两个以上的问题,需要您提供更多详细信息。问题是,我实际上只有2个矩形,因为我只是在测试,但我稍后会放置很多矩形。这就是为什么我使用一组矩形和一个函数来创建矩形。那么,在我的图片中,哪些黄色区域需要作为中间区域对多个矩形的操作?许多矩形意味着这将变得非常困难。也许需要进行基本的重新思考。我认为这也太复杂了,但这是我发现的唯一纠正此错误的方法:。我在中介绍了更高级的场景。