这里提供另一种方法,采用稍微更加函数式的方式:
var canvas = document.getElementById("radial"),
ctx = canvas.getContext("2d"),
width = canvas.width,
height = canvas.height,
center = { x: width/2, y: height/2 },
diameter = Math.min(width, height);
var distanceBetween = function(x1,y1,x2,y2) {
var deltaX = x2 - x1,
deltaY = y2 - y1;
return Math.sqrt(deltaX*deltaX+deltaY*deltaY);
}
var angleBetween = function(x1,y1,x2,y2) {
var deltaX = x2 - x1,
deltaY = y2 - y1;
return Math.atan2(deltaY, deltaX);
}
var radiansToDegrees = _.memoize(function(radians) {
if (radians < 0) radians += Math.PI * 2;
return radians * 180 / Math.PI;
})
var distanceFromCenter = _.bind(distanceBetween, undefined, center.x, center.y)
var angleFromCenter = _.bind(angleBetween, undefined, center.x, center.y)
var hslFormatter = function(h,s,l) { return "hsl("+h+","+s+"%,"+l+"%)"; },
fromHue = function(h) { return hslFormatter(h,100,50); };
var getColor = function(x,y) {
return (distanceFromCenter(x,y) > diameter/2)
? "#000"
: fromHue(radiansToDegrees(angleFromCenter(x,y)));
};
for(var y=0;y<height;y++) {
for(var x=0;x<width;x++) {
ctx.fillStyle = getColor(x,y);
ctx.fillRect( x, y, 1, 1 );
}
}
它使用函数来计算每个像素的颜色 - 这不是最有效的实现方式,但也许你可以从中获得一些有用的东西。
请注意,它使用
underscore作为一些辅助函数,如
bind()
- 用于部分应用程序 - 和
memoize
。
Codepen用于实验。