【发布时间】:2013-10-21 17:36:37
【问题描述】:
我要解决的算法有问题,我有一个我要检查碰撞的点列表,我可能使用一些 pytagoras,但我的主要问题是效率该算法,因为我需要检查是否仅在一个轴上相交,假设我有一个矩形点(0,100),其他点(300,100),两者都在y = 100,所以对于我的应用程序我决定它们发生碰撞,现在我如何检查是否有任何矩形与其他矩形发生碰撞?
我的第一次尝试是循环检查我添加的每个矩形是否与其他矩形发生碰撞,但我认为这是错误的,因为如果我有 100 个矩形,我将需要检查第一个碰撞其他 99 个,以及它们中的每一个(如果它们与其余部分发生碰撞)。
我很确定循环会以指数方式增加,这很糟糕,所以有人可以指出正确的方向,告诉我如何才是最有效的检查方式,谢谢!
编辑 13 年 10 月 22 日 使用@John Phu Nguyen 函数
var events = [ {start: 30, end: 150}, {start: 540, end: 600}, {start: 560, end: 620}, {start: 610, end: 670} ];
//each start and end props are y coordinates, basically where the rect start and ends
function layOutDay(events) {
//console.log(events);
var events_container = document.querySelector('.events-col');
var frag = document.createDocumentFragment();
for(var i=0; i<events.length; i++){
//console.log(events[i].start);
var top = events[i].start;
var bottom = events[i].end-events[i].start;
var event = createEventDOM();
var gutter = event.querySelector('.gutter');
event.style.top = top + 'px';
event.style.height = gutter.style.height = bottom + 'px';
if(y_coords.indexOf(top) === -1 && y_coords.indexOf(bottom) === -1){
y_coords.push(top);
y_coords.push(bottom);
y_coords.sort();
event.style.left = '10px';
console.log('NO collision', top, bottom);
}else{
console.log('collision', top, bottom);
event.style.width = '250px';
event.style.left = '220px';
}
frag.appendChild(event);
}
events_container.appendChild(frag);
}
所以运行函数我得到 2 个矩形碰撞,但有 3 个而不是 2 个,我需要知道谁在与谁在 x 轴上相互移动矩形!
Here is a screenshot of what I'm trying to do
可能是一个调整,但我找不到它,非常感谢任何帮助,谢谢!!!
【问题讨论】:
-
如果你有一组点,那么它们怎么会“碰撞”呢?当我想到点碰撞时,在同一个地方对我来说似乎是最明显的方式。但是,您似乎正在绘制矩形来检测碰撞?您能否更深入地解释一下在您的情况下如何确定碰撞,以及什么构成碰撞?
-
除非所有矩形都一直在移动,否则您只需要检查那些确实移动的矩形。
-
首先,感谢大家的回复,感谢大家抽出宝贵时间提供帮助!,我将留下一些最适合我的解决方案,但一切都完全有意义
-
所有的矩形都在同一个 y 上还是只是你的例子,它们可以在任何 y 上并且有任何咏叹调?
-
是的,它们可以在任何y,基本上我需要知道谁在y的同一范围内,我可以使用for循环来做到这一点,但我想检查它们中的每一个是不是效率
标签: javascript algorithm collision-detection