这里是另一种方法是采用一种略微更注重功能的做法:
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) {
// Get deltas
var deltaX = x2 - x1,
deltaY = y2 - y1;
// Calculate distance from center
return Math.sqrt(deltaX*deltaX+deltaY*deltaY);
}
var angleBetween = function(x1,y1,x2,y2) {
// Get deltas
var deltaX = x2 - x1,
deltaY = y2 - y1;
// Calculate angle
return Math.atan2(deltaY, deltaX);
}
var radiansToDegrees = _.memoize(function(radians) {
// Put in range of [0,2PI)
if (radians < 0) radians += Math.PI * 2;
// convert to degrees
return radians * 180/Math.PI;
})
// Partial application of center (x,y)
var distanceFromCenter = _.bind(distanceBetween, undefined, center.x, center.y)
var angleFromCenter = _.bind(angleBetween, undefined, center.x, center.y)
// Color formatters
var hslFormatter = function(h,s,l) { return "hsl("+h+","+s+"%,"+l+"%)"; },
fromHue = function(h) { return hslFormatter(h,100,50); };
// (x,y) => color
var getColor = function(x,y) {
// If distance is greater than radius, return black
return (distanceFromCenter(x,y) > diameter/2)
// Return black
? "#000"
// Determine color
: 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进行实验。
这是完美的... – MarsOne
那么,在这种情况下呢。但该步骤必须是光盘尺寸的功能,否则绘图不完整。让我们尝试2000x2000的画布大小而不更改代码:http://jsfiddle.net/afkLY/4/ 这是一个极端的例子,但无论如何都是一个例子。 – dooxe
这看起来非常棒!谢谢,你能详细阐述你对绘图步骤的含义吗?你是什么意思,这一步必须是光盘大小的函数? – Yonder