我正在尝试绘制一个圆圈,而不是径向渐变,而是围绕圆圈的线性渐变......基本上,我正在尝试创建一个色轮,它必须是动态的,因为颜色可以自定义.. .但是,我完全不知道如何处理这件事......
我想我可以画出自己的圆圈并给它上色,然后用更大的半径循环这个过程来填充它。但事实证明,这不仅效率极低,而且非常有问题......
这是我的第一次尝试: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
“亮度”(白色到黑色渐变)不是问题,因为我知道它可以通过在绘制色谱后使用径向渐变来完成。但是,在弄清楚如何绘制频谱本身时,我将不胜感激。
我什至在想我可以画一个线性的然后弯曲(变换)它,但是没有任何本机函数可以做到这一点,并且处理诸如超出我技能水平的事情。:-/