javascript - 如何确定 Javascript 中项目网格中选择范围之间的重叠

标签 javascript algorithm range normalization

想象一下类似项目网格的东西。 用户可以选择网格中的多个项目范围。当有多个范围(选择)时,我想确定最后创建的范围是否与现有范围重叠。 网格系统可以与文本区域中的字符进行比较,可以突出显示多个文本范围。

  • 每个范围始终存在相邻项目,紧邻每个项目 其他,或网格中下一行的第一项。 (也完全 类似于在文本文档中选择文本。)
  • 当用户创建范围时,它可以与现有范围重叠,甚至完全适合现有范围。

范围在内存中存储为:

{
    'rangeStartLineIndex': 2,
    'rangeStartColIndex': 9,
    'rangeEndLineIndex': 4,
    'rangeEndColIndex': 7
}

以上范围可以如图所示进行可视化。但请注意,网格的行数和列数不是恒定的。

enter image description here

目标是循环遍历现有范围,并查看刚刚创建的范围是否与现有范围重叠(或完全适合)。如果是这样,则采用现有范围,并将其扩展,以便创建的范围与其重叠的范围合并。所以,这是一种标准化数据。

代码中的另一个示例:

var ranges = []; // stores the range objects that are created earlier.
var createdRange = {...}; // range object just created.

for(var i = 0; i < ranges; i++) {
    var overlap = doesThisOverlap(createdRange, ranges[i]);

    if(overlap) {

        // overlaps, which means we extend the existing range.
        range[i].rangeStartLineIndex = Math.min(range[i].rangeStartLineIndex, createdRange.rangeStartLineIndex);
        range[i].rangeStartColIndex = Math.min(range[i].rangeStartColIndex, createdRange.rangeStartColIndex);
        range[i].rangeEndLineIndex = Math.max(range[i].rangeEndLineIndex, createdRange.rangeEndLineIndex);
        range[i].rangeEndColIndex = Math.max(range[i].rangeEndColIndex, createdRange.rangeEndColIndex);

    } else {
        // means the new range does not extend an existing range, so add it.
        ranges.push(createdRange);
    }
}

function doesThisOverlap(rangeA, rangeB) {
    // ???
}

当尝试实现函数 doesThisOverlap 时,我最终遇到了过多的 if block 。我很困惑,也是因为我感觉已经找到了一个算法。

我还尝试过将范围起点的行和列索引相加,以给它一个“分数”(并对端点的行和列索引执行相同的操作)。 然后比较范围之间的起点/终点分数。

最佳答案

问题并不是真正的二维问题,如果将范围表示为

,事情就会变得容易得多
{
  rangeStart: 29,
  rangeEnd:48
}

您可以通过计算转换为这种表示形式

lineIndex * COLUMN_NUMBER + columnIndex.

您基本上应该迭代所有范围并找到最小 rangeStart 和 rangeEnd。然后您可以使用以下方法将结果转换为列/行:

columnIndex = x % COLUMN_NUMBER;
lineIndex = parseInt(x / COLUMN_NUMBER).

关于javascript - 如何确定 Javascript 中项目网格中选择范围之间的重叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52100986/

相关文章:

javascript - 如何使用 lodash.js 或 underscore.js 过滤 json?

algorithm - 将一组给定的数字 N 分成两组,使它们的总和之差最小?

c# - 使用 LINQ 使用特定范围的数字填充列表

mysql - sql查询范围选择

Java Connect 4 算法检查是否获胜

Python - For 循环和计数器

javascript - 在javascript中 chop (不四舍五入)小数

javascript - React Stytch 尚未加载

JavaScript:如何检查 "HTMLUnknownElement"?

c# - .NET BCL API 或框架方法的时间复杂度