Я пытаюсь нарисовать круг с не радиальными градиентами, а линейными градиентами, которые идут по кругу ... В основном, я пытаюсь создать цветовое колесо, и оно должно быть динамичным, поскольку цвета будут настраиваться ... Однако я полностью озадачен тем, как подойти к этому вопросу ...HTML5 Холст - рисование линейных градиентов на круге (колесо цвета)
Я думал, что смогу нарисовать собственный круг и покрасить его, затем переместите процесс с большим радиусом, чтобы заполнить его. Но это оказалось не только крайне неудобным, но и очень багги ...
Была здесь моя первая попытка: 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, я разместил пример на http://jsfiddle.net/f3SQ2/1/, но, как вы сказали, вам нужны цвета, которые можно настроить вам нужно что-то другое? – Kris
@ Kris вы должны опубликовать это как ответ, это намного лучше, чем мое. – Shmiddty
@ Kris Wow!Это какая-то приятная кодировка ... К сожалению, у меня есть трудности, связанные с этим из-за моих недостаточных математических навыков. Однажды я надеюсь, что смогу создать такие вещи. Спасибо, что поделились! – user1960364