放射状グラデーションではなく、円を囲む線形グラデーションで円を描こうとしています...基本的に、カラーホイールを作成しようとしていますが、色がカスタマイズ可能になるため、動的にする必要があります.. .しかし、私はこの問題にどのようにアプローチするかについて完全に困惑しています...
自分の円を描いて色を付けてから、より大きな半径でプロセスをループして塗りつぶすことができると思いました。しかし、それは非常に非効率であるだけでなく、非常にバグが多いことも判明しました...
これが私の最初の試みでした: 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
「明るさ」(白から黒へのフェード) は、カラー スペクトルが描画された後に放射状のグラデーションを使用することで実現できることがわかっているため、問題ではありません。ただし、スペクトル自体を描画する方法を理解する上で助けていただければ幸いです。
直線を描いて曲げる(変形させる)こともできると思っていたのですが、それを行うためのネイティブ関数がなく、そのようなことに取り組むことは私のスキルレベルを超えています。:-/