javascript - 关于 for-if 循环中的布尔逻辑的混淆
问题描述
我有一个对象列表,如果它们不干扰列表中已包含的对象,我将向该列表添加新对象(有点像碰撞检测)。我正在尝试创建一个可以检测这种干扰的函数。
我设计它的方式是如果发生碰撞(不直观)输出“false”,如果没有碰撞则输出“true”,因为我稍后将在 if 语句中使用这个结果,我希望它在不发生碰撞的情况下执行该语句。该列表称为顶点。可能有很多错误,但我最困惑的是布尔函数的逻辑以及它是如何通过 if 和 for 循环进行的。
我想要的结果是,如果新对象干扰了列表中已有的任何对象,则该函数将输出“false”,并且当且仅当该对象不干扰任何元素时,它才会输出“true”。但是,我不认为我的代码在做我在这里描述的事情。if 是否采用第一个结果,“真”或“假”?如果所有结果都为真,它是否只输出“真”。我认为这是我问题的症结所在(我可能弄错了)。
可能有一种更有效的方法来做到这一点(如果是这样,请通知我!),但现在我实际上正在使用 for 循环遍历列表中的每个元素,然后使用 if 语句编写碰撞测试. 我的代码如下:
function test(x, y, len) {
var k;
for (k=0; k < vertices.length; k++) {
if (((y + len) < (vertices[k][1])) || (y > (vertices[k][1] + vertices[k][2])) || ((x + len) < vertices[k][0]) || (x > (vertices[k][0] + vertices[k][2])))
{
return false
} else
{
return true
}
}
}
可能是碰撞条件本身有问题(“...或...或...”),但我认为情况并非如此。我认为我上面描述的逻辑有问题。如果有人能给我一些可以澄清问题的解释,将不胜感激。如您所知,我对此很陌生。谢谢!
解决方案
移出return true
for 循环。
然后它只会在循环结束而没有先找到结果的情况下返回 true。
function test(x, y, len) {
var k;
for (k=0; k < vertices.length; k++) {
if (((y + len) < (vertices[k][1])) || (y > (vertices[k][1] + vertices[k][2])) || ((x + len) < vertices[k][0]) || (x > (vertices[k][0] + vertices[k][2])))
{
return false
}
}
return true;
}
推荐阅读
- r - 排除列中值的过滤函数
- ubuntu - boost 不包含 /lib 目录吗?
- javascript - React中无效的挂钩调用,但它适用于其他人
- react-native - Expo app.config.js googleServicesFile 用于不同的构建变体
- java - 我如何在 Spring 中使用 @CachePut 进行收集?
- python - 单元测试时如何从数据库异步获取记录?
- vb.net - VB.NET:是否有替代使用按位逻辑运算符在记录中查找匹配项的方法?
- amazon-web-services - Amazon Textract 在进行分析时会跳过一些表单字段
- javascript - 返回长度为偶数的 firstName 值的数量
- django - 您应该直接在视图中访问cleaned_data,还是拥有一个属于给定表单的方法来处理cleaned_data?