gpt4 book ai didi

javascript - HTML5 Canvas - 在圆上绘制线性渐变(色轮)

转载 作者:行者123 更新时间:2023-11-30 08:54:36 32 4
gpt4 key购买 nike

我正在尝试绘制一个圆圈,而不是径向渐变,而是围绕圆圈的线性渐变...基本上,我正在尝试创建一个色轮,它必须是动态的,因为颜色会可定制...但是,我完全不知道如何处理这个问题...

我想我可以画自己的圆并给它上色,然后用更大的半径循环这个过程来填充它。但事实证明,这不仅极其低效,而且还存在很多问题......

这是我的第一次尝试: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

“亮度”(白色到黑色渐变)不是问题,因为我知道它可以通过在绘制色谱后使用径向渐变来实现。但是,如果您能帮助我弄清楚如何绘制频谱本身,我将不胜感激。

我什至想我可以画一个线性的然后弯曲(变换)它,但是没有任何原生函数可以做到这一点并处理超出我技能水平的事情。 :-/

最佳答案

检查一下:http://jsfiddle.net/f3SQ2/5/

var can = $('#canvas')[0],
ctx = can.getContext('2d'),
radius = 120,
thickness = 80,
p = {
x: can.width,
y: can.height
},
start = Math.PI,
end = start + Math.PI / 2,
step = Math.PI / 180,
ang = 0,
grad,
r = 0,
g = 0,
b = 0,
pct = 0;

ctx.translate(p.x, p.y);
for (ang = start; ang <= end; ang += step) {
ctx.save();
ctx.rotate(-ang);
// linear gradient: black->current color->white
grad = ctx.createLinearGradient(0, radius - thickness, 0, radius);
grad.addColorStop(0, 'black');

h = 360-(ang-start)/(end-start) * 360;
s = '100%';
l = '50%';

grad.addColorStop(.5, 'hsl('+[h,s,l].join()+')');
grad.addColorStop(1, 'white');
ctx.fillStyle = grad;

// the width of three for the rect prevents gaps in the arc
ctx.fillRect(0, radius - thickness, 3, thickness);
ctx.restore();
}

编辑:固定色谱。显然我们可以只给它 HSL 值,不需要转换或困惑的计算!

修改了一些内容以更好地处理缩放:http://jsfiddle.net/f3SQ2/6/

step = Math.PI / 360

ctx.fillRect(0, radius - thickness, radius/10, thickness);

例如,您可以像这样设置渐变停止点:

h = 360-(ang-start)/(end-start) * 360;
s = '100%';

grad.addColorStop(0, 'hsl('+[h,s,'0%'].join()+')'); //black
grad.addColorStop(.5,'hsl('+[h,s,'50%'].join()+')'); //color
grad.addColorStop(1, 'hsl('+[h,s,'100%'].join()+')');//white

关于javascript - HTML5 Canvas - 在圆上绘制线性渐变(色轮),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14777315/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com