我有一个10+
数字数组。它们表示圆上的坐标-以度为单位,即每个数字介于0
和359.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[或相差5的72个元素,则while循环可能不会结束。
编辑:最小化块应该迭代,直到所有值都被修正。