javascript - 在javascript数组中分散数字

标签 javascript arrays algorithm sorting html5-canvas

我有一组 10+ 数字。它们表示圆上的坐标 - 以度为单位,即每个数字都在 0359.999999...

之间

我试图解决的问题是,当我在圆圈上绘制项目时(通过 html5 canvas api),有时它们会聚集在一起,导致项目相互绘制。

所以我想创建一个算法,将项目均匀地分散在它们的初始集群位置周围。假设(我希望这是一个可配置的选项)两个项目之间的最小距离是 5 度。

因此,如果初始数组是 [5, 41, 97, 101, 103, 158, 201, 214, 216, 217, 320] 那么我希望算法得出类似[5, 41, 95, 100, 105, 158, 201, 211, 216, 221, 320 ] (粗体项目分散在其初始“重心”周围,无论这些项目是否为 2 个或更多项目)。

此外,该算法还需要将 0 和 359 识别为仅相隔 1 个单位(度),并将这些项目均匀分布。

有没有人创建过这样的算法或知道如何实现它?欢迎提出一些一般性的想法。 我确信我可以通过大量的试验和错误来实现这一目标,但我想先听听一些有根据的猜测,如果你愿意的话。

最佳答案

var val = [5, 41, 96, 101, 103, 158, 201, 214, 216, 217, 320, 1201, 1213, 1214, 1216, 1217, 1320],
    delta = Array.apply(null, { length: val.length }).map(function () { return 0 }),
    result,
    threshold = 5,
    converged = false;

document.write('val: ' + val + '<br>');
while (!converged) {
    converged = true;
    delta = delta.map(function (d, i) {
        if (i < delta.length - 1 && delta.length > 1) {
            if (val[i + 1] + delta[i + 1] - val[i] - d < threshold) {
                converged = false;
                delta[i + 1] += 1;
                return d - 1;
            }
        }
        return d;
    });
    document.write('delta: ' + delta + '<br>');
}

result = val.map(function (v, i) {
    return v + delta[i];
});
document.write('result: ' + result + '<br>');

// try to minimise difference
converged = false;
while (!converged) {
    converged = true;
    delta = delta.map(function (d, i) {
        if (i < delta.length - 2) {
            var space = val[i + 1] + delta[i + 1] - val[i] - d;
            if (d < 0 && space > threshold) {
                converged = false;
                return d + space - threshold;
            }
        }
        return d;
    });
    document.write('delta min: ' + delta + '<br>');
}

result = val.map(function (v, i) {
    return v + delta[i];
});
document.write('result: ' + result + '<br>');

代码将两对距离太近的情侣推开,每边各有一个。这是对称的,有时会导致值被推得很远,这是可以纠正的。

[未实现!] 如果您的值的空间不够,[0..360[ 或超过 72 个元素且相差 5,则 while 循环可能不会结束。

编辑:最小化 block 应该迭代直到所有值都被修正。

关于javascript - 在javascript数组中分散数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29532147/

相关文章:

javascript - 在 firestore 中停止 onSnapshot 函数

javascript - 新日期无法解析 "31"但不是 "32"

javascript - 使用Javascript转换罗马数字的算法

algorithm - 完全二叉树的真正含义是什么?

javascript - if/else 语句代替 switch

javascript - html 是否在同一个对象上使用相同的 id

arrays - 如何使用加入?

javascript - 从对象中删除特定键

arrays - 使用 postgresql 中的其他列更新数组类型的列

grunt 构建期间的 XML 文件预处理