【发布时间】:2013-02-08 16:43:20
【问题描述】:
我正在尝试绘制一个圆圈,而不是径向渐变,而是围绕圆圈的线性渐变...基本上,我正在尝试创建一个色轮,它必须是动态的,因为颜色将是可定制...但是,我完全不知道如何处理这个问题...
我想我可以自己画一个圆圈并给它上色,然后用更大的半径循环这个过程来填充它。但事实证明,这不仅效率极低,而且非常有问题......
这是我的第一次尝试:http://jsfiddle.net/gyFqX/1/ 我坚持使用该方法,但将其更改为为圆上的每个点填充一个 2x2 正方形。它可以混合多达 3 种颜色,但随后您开始注意到它的失真。
无论如何,我一直在努力,这就是我现在所拥有的:http://jsfiddle.net/f3SQ2/
var ctx = $('#canvas')[0].getContext('2d'),
points = [],
thickness = 80;
for( var n = 0; n < thickness; n++ )
rasterCircle( 200, 200, (50 + n) );
function fillPixels() {
var size = points.length,
colors = [
hexToRgb( '#ff0000' ), // Red
hexToRgb( '#ff00ff' ), // Magenta
hexToRgb( '#0000ff' ), // Blue
hexToRgb( '#00ffff' ), // Teal
hexToRgb( '#00ff00' ), // Green
hexToRgb( '#ffff00' ), // Yellow
hexToRgb( '#ff0000' ), // Red
],
colorSpan = colors.length - 1;
if ( colors.length > 0 ) {
var lastPadding = size % colorSpan,
stepSize = size / colorSpan,
steps = null,
cursor = 0;
for ( var index = 0; index < colorSpan; index++ ) {
steps = Math.floor( ( index == colorSpan - 1 ) ? stepSize + lastPadding : stepSize );
createGradient( colors[ index ], colors[ index + 1 ], steps, cursor );
cursor += steps;
}
}
function createGradient( start, end, steps, cursor ) {
for ( var i = 0; i < steps; i++ ) {
var r = Math.floor( start.r + ( i * ( end.r - start.r ) / steps ) ),
g = Math.floor( start.g + ( i * ( end.g - start.g ) / steps ) ),
b = Math.floor( start.b + ( i * ( end.b - start.b ) / steps ) );
ctx.fillStyle = "rgba("+r+","+g+","+b+",1)";
ctx.fillRect( points[cursor][0], points[cursor][1], 2, 2 );
cursor++;
}
}
points = [];
}
function setPixel( x, y ) {
points.push( [ x, y ] );
}
function rasterCircle(x0, y0, radius) {
var f = 1 - radius,
ddF_x = 1,
ddF_y = -2 * radius,
x = 0,
y = radius;
setPixel(x0, y0 + radius);
while(x < y) {
if(f >= 0) {
y--;
ddF_y += 2;
f += ddF_y;
}
x++;
ddF_x += 2;
f += ddF_x;
setPixel(x0 - x, y0 - y);
}
var temp = [];
f = 1 - radius,
ddF_x = 1,
ddF_y = -2 * radius,
x = 0,
y = radius;
while(x < y) {
if(f >= 0) {
y--;
ddF_y += 2;
f += ddF_y;
}
x++;
ddF_x += 2;
f += ddF_x;
temp.push( [x0 - y, y0 - x] );
}
temp.push( [x0 - radius, y0] );
for(var i = temp.length - 1; i > 0; i--)
setPixel( temp[i][0], temp[i][1] );
fillPixels();
}
我想要完成的是这样的:http://img252.imageshack.us/img252/3826/spectrum.jpg
“亮度”(白色到黑色渐变)不是问题,因为我知道它可以通过在绘制色谱后使用径向渐变来完成。不过,如果您能帮我弄清楚如何绘制频谱本身,我将不胜感激。
我什至在想我可以画一个线性的然后弯曲(变换)它,但是没有任何本机函数可以做到这一点,并且处理这样的事情超出了我的技能水平。 :-/
【问题讨论】:
-
创建与您链接的图像类似的东西最好通过从 HSB 转换为 RGB 来完成,我在jsfiddle.net/f3SQ2/1 上发布了一个示例,但正如您所说,您需要自定义颜色是否需要不同的东西?
-
@Kris 你应该把它作为答案发布,它比我的要好得多。
-
@Kris 哇!这是一些很好的编码......不幸的是,由于我的数学技能不足,我很难理解它。有一天,我希望我能创造出这样的东西。谢谢分享!
标签: javascript html5-canvas linear-gradients radial-gradients color-wheel