【发布时间】:2018-03-23 00:45:27
【问题描述】:
对于我的应用程序,我有一个 SVG 绘制的矩形,我将其用作命中框,并且我正在寻找一个 JavaScript 函数,该函数在命中框接触到另一个围绕其中心旋转的矩形时返回一个布尔值 true从某个角度使用 CSS 转换。我从http://www.inkfood.com/collision-detection-with-svg/ 发现了这段代码:
function intersectRect(r1, r2) {
var r1 = r1.getBoundingClientRect(); //BOUNDING BOX OF THE FIRST OBJECT
var r2 = r2.getBoundingClientRect(); //BOUNDING BOX OF THE SECOND OBJECT
//CHECK IF THE TWO BOUNDING BOXES OVERLAP
return !(r2.left > r1.right ||
r2.right < r1.left ||
r2.top > r1.bottom ||
r2.bottom < r1.top);
}
这对常规矩形非常有效,但我不确定如何在此基础上构建旋转矩形。当我在 Web 浏览器中使用开发人员工具检查旋转的矩形时,我可以看到它正确突出显示了矩形。话虽如此,当我尝试使用 JavaScript 提取边界客户端矩形时,它会以未旋转的形式返回矩形的尺寸。我的问题是如何接收旋转矩形的正确尺寸,以便检测它何时与我的命中框矩形发生碰撞?是否有另一种方法可以检测我的命中框何时触及我的旋转矩形?任何帮助将非常感激。
【问题讨论】:
-
如果您愿意改用
canvas,您可能会更轻松。isPointInPath尤其可以为您省去很多麻烦:w3schools.com/tags/canvas_ispointinpath.asp -
@jmcgriz 感谢您的回复!我正在玩 W3Schools 上的画布,我可以看到 isPointInPath 似乎在我绘制的没有旋转的矩形中完美地工作。但是,在旋转之后,当给定它内部的一个点时,它似乎不会触发 true。我也尝试过使用 lineTo(),但它只适用于实际的细线本身,当我增加 lineWidth 时,它仍然只适用于原始线条,而不适用于新的笔划区域。有没有办法克服这两种情况?
-
我会稍微弄乱它,但我认为您的答案将来自实际跟踪矩形并使用转换矩阵进行旋转,而不是仅使用内置的
rect和rotate方法
标签: javascript html svg collision