【问题标题】:Return intersection position and size返回交点位置和大小
【发布时间】:2014-04-21 15:56:15
【问题描述】:

我正在使用 HTML5 canvas 标签开发一个小游戏,我发现了一个问题 (that you can see here),为了解决它,我需要检查数组中每个矩形之间的交集(完成)和返回交叉点的位置和大小(我不能这样做,因为我的数学知识很差)。有人可以帮我吗?

这里是矩形数组碰撞检测:

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
            }
        }
    }
}

And here is the entire code, in JSFiddle

此计算的目的是我需要禁用英雄与矩形交点内的矩形之间的任何碰撞。例如这个区域:

【问题讨论】:

标签: javascript jquery html5-canvas collision-detection easeljs


【解决方案1】:

演示:http://jsfiddle.net/m1erickson/TqRxG/

如果你有 2 个这样定义的矩形:

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));
}

【讨论】:

    【解决方案2】:

    这个jsfiddle 将为您提供两个矩形的相交矩形。如果没有交叉点,宽度将为零。

    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 的交点不相交

    以及其他各种方式。

    矩形越多,可能性就越大。

    【讨论】:

    • 我想要做的是禁用矩形碰撞内的英雄碰撞(即圆形),正如您在这张图片中看到的i.imgur.com/YLw8ToC.png 因为如果我不这样做,圆形碰撞计算不知道这种碰撞是否可能。我已经使用以下方法完成了左侧和顶部交叉点的计算:if(rects[i].y &lt;= rects[others].y){intertop[i] = rects[i].y+rects[i].height-rects[others].y;}else{intertop[i] = rects[others].y+rects[others].height-rects[i].y;},但我仍然在计算底部和右侧时遇到问题。
    • 你有一个矩形数组,大概这意味着两个以上的矩形,所以我仍然不清楚你是如何解释许多交叉点的。我使用矩形和 markE 提出的逻辑显示了计算两个矩形的底部和右侧的不同方法。如果您只有两个矩形,那么任何一个答案都应该为您提供所需的解决方案。需要您提供两个以上的详细信息。
    • 问题是我实际上只有2个矩形,因为我只是在测试,但我稍后会放很多。这就是我使用矩形数组和创建矩形的函数的原因。
    • 那么我图片中的哪个黄色区域需要作为多个矩形的交集?许多矩形将意味着它变得非常困难。也许需要进行根本的重新思考。
    • 我认为它也过于复杂,但这是我发现的唯一纠正此错误的方法:stackoverflow.com/questions/22344784/…
    猜你喜欢
    • 2012-04-14
    • 2020-10-23
    • 2020-02-29
    • 2012-02-02
    • 2018-10-08
    • 1970-01-01
    • 1970-01-01
    • 2014-04-23
    • 2014-02-02
    相关资源
    最近更新 更多