我想画一个scrollmap
有canvas
一堆Y
坐标的。
这样做最有效的是什么?我想带有一些平均点的渐变是最好的方法,但我不知道该怎么做。
我现在想做的是填充画布,red
然后green
从顶部到每个Y
坐标绘制矩形。如果矩形具有一定程度的透明度,则应该会产生相当不错的滚动热图。
还有其他想法吗?或者,如果有人知道如何实现渐变,那就太好了。
如果您不知道,滚动图应该如下所示:
我想画一个scrollmap
有canvas
一堆Y
坐标的。
这样做最有效的是什么?我想带有一些平均点的渐变是最好的方法,但我不知道该怎么做。
我现在想做的是填充画布,red
然后green
从顶部到每个Y
坐标绘制矩形。如果矩形具有一定程度的透明度,则应该会产生相当不错的滚动热图。
还有其他想法吗?或者,如果有人知道如何实现渐变,那就太好了。
如果您不知道,滚动图应该如下所示:
根据评论中的其他信息,您可能希望使用分箱方法。如果我们将页面分割成X个高度区域(每个区域的高度是页面高度的1/X倍),那么我们可以简单地根据用户的最终滚动高度落入哪个“bin”来执行计数。在 JSesque 伪代码中:
var X = 5, bins = [], idx;
userScrollHeights.forEach(function(Y) {
idx = Math.floor(map(Y, 0, pageHeight, 0, X));
bins[id] = bins[idx] ? bins[idx]++ : 1;
});
奇怪的是,标准 JS API 中缺少映射函数,但很容易实现为:
function map(value, istart, istop, ostart, ostop) {
return ostart + (ostop - ostart) * ((value - istart) / (istop - istart));
}
bins 数组现在包含每个 bin 的“强度”。您选择的垃圾箱越多,您的滚动图就越准确。
当然,基本的滚动图不是彩色的,它只是强度,所以它更自然地是白到黑的叠加。如果您真的想要一张彩色地图,“最强烈”映射到红色,“最不强烈”映射到紫色,您可以使用具有 255 个 bin 的设置,并在找到最大值后简单地将每个强度级别映射到颜色值强度:
var bin_max = 0;
bins.forEach(function(value) {
if(value > bin_max) bin_max= value;
});
接下来是基于“彩虹”渐变中的五个切片的颜色映射:
function mapIntensityToColor(intensity, min, max) {
var cint = map(intensity,min,max,0,255);
var step = (max - min) / 5;
if(cint > 204)
return [255, map(intensity, max-step,max, 255,0), 0];
if(cint > 153)
return [map(intensity, max-2*step,max-step, 0,255), 255, 0];
if(cint > 102)
return [0, 255, map(intensity, max-3*step,max-2*step, 255,0)];
if(cint > 51)
return [0, map(intensity, max-4*step,max-3*step, 0,255), 255];
return [map(intensity, min,max-4*step, 255,0), 0, 255];
}
将您的画布(或 div)分割为 255 个步骤并根据每个步骤着色,mapIntensityToColor(bin[step_number], 0, bin_max)
现在应该可以为您提供准确的滚动图。