Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript HTML5画布上的多点/颜色渐变_Javascript_Html5 Canvas_Gradient - Fatal编程技术网

Javascript HTML5画布上的多点/颜色渐变

Javascript HTML5画布上的多点/颜色渐变,javascript,html5-canvas,gradient,Javascript,Html5 Canvas,Gradient,我想在html5画布上填充一个形状,在不同的位置用不同的颜色创建一个渐变,比如在 你对我如何做到这一点有什么想法吗?搜索一下,我从Mozilla开发网络中找到了这个例子 function draw() { var ctx = document.getElementById('canvas').getContext('2d'); var radgrad = ctx.createRadialGradient(0,0,1,0,0,150); radgrad.addColorS

我想在html5画布上填充一个形状,在不同的位置用不同的颜色创建一个渐变,比如在


你对我如何做到这一点有什么想法吗?

搜索一下,我从Mozilla开发网络中找到了这个例子

function draw() {
    var ctx = document.getElementById('canvas').getContext('2d');

    var radgrad = ctx.createRadialGradient(0,0,1,0,0,150);
    radgrad.addColorStop(0, '#A7D30C');
    radgrad.addColorStop(1, 'rgba(1,159,98,0)');

    var radgrad2 = ctx.createRadialGradient(0,150,1,0,150,150);
    radgrad2.addColorStop(0, '#FF5F98');
    radgrad2.addColorStop(1, 'rgba(255,1,136,0)');

    var radgrad3 = ctx.createRadialGradient(150,0,1,150,0,150);
    radgrad3.addColorStop(0, '#00C9FF');
    radgrad3.addColorStop(1, 'rgba(0,201,255,0)');

    var radgrad4 = ctx.createRadialGradient(150,150,1,150,150,150);
    radgrad4.addColorStop(0, '#F4F201');
    radgrad4.addColorStop(1, 'rgba(228,199,0,0)');

    ctx.fillStyle = radgrad4;
    ctx.fillRect(0,0,150,150);
    ctx.fillStyle = radgrad3;
    ctx.fillRect(0,0,150,150);
    ctx.fillStyle = radgrad2;
    ctx.fillRect(0,0,150,150);
    ctx.fillStyle = radgrad;
    ctx.fillRect(0,0,150,150);
}
基于此,您可以将每个单元格绘制为径向渐变,并使用完全透明的颜色作为其最后一步,以便更好地与其他单元格混合

如果没有它,我认为您将需要根据每个像素距每个单元的距离来计算每个像素的颜色

通常,如果在创建voronoi纹理时,在网格中分割曲面,然后为每个顶点指定颜色,然后根据到形成其单元的顶点的距离对像素的颜色进行插值


另请参阅,以了解html5中real voronoi的实现。它是开源的,并且是在麻省理工学院的许可下授权的,所以你可以使用它。

搜索一下,我在Mozilla开发网络上找到了这个例子

function draw() {
    var ctx = document.getElementById('canvas').getContext('2d');

    var radgrad = ctx.createRadialGradient(0,0,1,0,0,150);
    radgrad.addColorStop(0, '#A7D30C');
    radgrad.addColorStop(1, 'rgba(1,159,98,0)');

    var radgrad2 = ctx.createRadialGradient(0,150,1,0,150,150);
    radgrad2.addColorStop(0, '#FF5F98');
    radgrad2.addColorStop(1, 'rgba(255,1,136,0)');

    var radgrad3 = ctx.createRadialGradient(150,0,1,150,0,150);
    radgrad3.addColorStop(0, '#00C9FF');
    radgrad3.addColorStop(1, 'rgba(0,201,255,0)');

    var radgrad4 = ctx.createRadialGradient(150,150,1,150,150,150);
    radgrad4.addColorStop(0, '#F4F201');
    radgrad4.addColorStop(1, 'rgba(228,199,0,0)');

    ctx.fillStyle = radgrad4;
    ctx.fillRect(0,0,150,150);
    ctx.fillStyle = radgrad3;
    ctx.fillRect(0,0,150,150);
    ctx.fillStyle = radgrad2;
    ctx.fillRect(0,0,150,150);
    ctx.fillStyle = radgrad;
    ctx.fillRect(0,0,150,150);
}
基于此,您可以将每个单元格绘制为径向渐变,并使用完全透明的颜色作为其最后一步,以便更好地与其他单元格混合

如果没有它,我认为您将需要根据每个像素距每个单元的距离来计算每个像素的颜色

通常,如果在创建voronoi纹理时,在网格中分割曲面,然后为每个顶点指定颜色,然后根据到形成其单元的顶点的距离对像素的颜色进行插值


另请参阅,以了解html5中real voronoi的实现。它是开源的,并获得麻省理工学院的许可证,因此您可以使用它。

您可以使用一种原理,将初始点可以产生的所有可能的双色线性渐变相乘(而不是求和)。请看我的例子:

函数getProjectionDistance(a、b、c){ 常数k2=b.x*b.x-b.x*a.x+b.y*b.y-b.y*a.y; 常数k1=a.x*a.x-b.x*a.x+a.y*a.y-b.y*a.y; 常数ab2=(a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y); 常数kcom=(c.x*(a.x-b.x)+c.y*(a.y-b.y)); 常数d1=(k1-kcom)/ab2; 常数d2=(k2+kcom)/ab2; 返回{d1,d2}; } 功能限制01(值){ 如果(值<0){ 返回0; } 如果(值>1){ 返回1; } 返回值; } 函数paddingleft0(v,v_长度){ 而(v.长度totalratiosum+=c); forEach((c,i)=>colorRatios[i]/=totalratiosum); c=getWeightedColorMix(点、色度比); 返回c; } 设点=[ {x:10,y:10,c:#FF0000}, {x:70,y:150,c:#FFFF00}, {x:224,y:300,c:#00FF00}, {x:121,y:100,c:#00FFFF}, {x:160,y:10,c:#FF00FF}, ]; // 这些是绘制渐变的起点 var canv=document.getElementById(“myCanvas”); var ctx=canv.getContext(“2d”); 设xcs=points.map(p=>p.x); 设ycs=points.map(p=>p.y); 设xmin=Math.min(…xcs); 设xmax=Math.max(…xcs); 设ymin=Math.min(…ycs); 设ymax=Math.max(…ycs); 设x,y; 让我们混合颜色; //迭代给定点之间的所有像素 对于(x=xmin;x您可以使用将初始点可以产生的所有可能的双色线性渐变相乘(而不是求和)的原则。请看我的例子:

函数getProjectionDistance(a、b、c){ 常数k2=b.x*b.x-b.x*a.x+b.y*b.y-b.y*a.y; 常数k1=a.x*a.x-b.x*a.x+a.y*a.y-b.y*a.y; 常数ab2=(a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y); 常数kcom=(c.x*(a.x-b.x)+c.y*(a.y-b.y)); 常数d1=(k1-kcom)/ab2; 常数d2=(k2+kcom)/ab2; 返回{d1,d2}; } 功能限制01(值){ 如果(值<0){ 返回0; } 如果(值>1){ 返回1; } 返回值; } 函数paddingleft0(v,v_长度){ 而(v.长度