Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 返回交点位置和大小_Javascript_Jquery_Html5 Canvas_Collision Detection_Easeljs - Fatal编程技术网

Javascript 返回交点位置和大小

Javascript 返回交点位置和大小,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)

我正在使用HTML5
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个矩形,因为我只是在测试,但我稍后会放置很多矩形。这就是为什么我使用一组矩形和一个函数来创建矩形。那么,在我的图片中,哪些黄色区域需要作为中间区域对多个矩形的操作?许多矩形意味着这将变得非常困难。也许需要进行基本的重新思考。我认为这也太复杂了,但这是我发现的唯一纠正此错误的方法:。我在中介绍了更高级的场景。