gpt4 book ai didi

javascript - 绘制分形时迭代更改 Canvas 中的 fillStyle 颜色

转载 作者:行者123 更新时间:2023-11-28 02:29:23 25 4
gpt4 key购买 nike

我使用以下代码通过 HTML5 Canvas 元素生成毕达哥拉斯分形树:

<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<script src="jquery.js" type="text/javascript"></script>
<style>
#sketch
{
border: 1px solid black;
}
</style>
<script type="text/javascript">
window.onload = function()
{
var canvas = document.getElementById("sketch");
var context = canvas.getContext("2d");

context.fillStyle = "rgba(0, 0, 200, 0.5)";
context.beginPath();

context.moveTo(450,550);
context.lineTo(450,450);
context.lineTo(550,450);
context.lineTo(550,550);
context.fill();

fractal(context,[450,550],[450,450],[550,450],[550,550],5);
};

function fractal(context,P1,P2,P3,P4,depth)
{
context.fillStyle = "rgba(0,0,200,"+(depth/8).toString()+")";
context.save();
if(depth < 0)
{
return null;
}

/*Find C*/
C = divide(add(divide(add(P1,P2),2),divide(add(P3,P4),2)),2);

var V1 = divide(minus(C,P1),length(C,P1));
var V2 = divide(minus(C,P4),length(C,P4));

var P6 = add(P2,multiply(V2,length(P1,P2)/Math.sqrt(2)));
var P7 = add(P6,multiply(V1,length(P1,P2)/Math.sqrt(2)));
var P5 = add(P2,multiply(V1,length(P1,P2)/Math.sqrt(2)));
var P9 = add(P3,multiply(V1,length(P1,P2)/Math.sqrt(2)));
var P8 = add(P9,multiply(V2,length(P1,P2)/Math.sqrt(2)));

context.moveTo(P2[0],P2[1]);
context.lineTo(P6[0],P6[1]);
context.lineTo(P7[0],P7[1]);
context.lineTo(P5[0],P5[1]);
context.fill();

context.moveTo(P5[0],P5[1]);
context.lineTo(P8[0],P8[1]);
context.lineTo(P9[0],P9[1]);
context.lineTo(P3[0],P3[1]);
context.fill();

fractal(context,P2,P6,P7,P5,depth-1);
fractal(context,P5,P8,P9,P3,depth-1);
}

function multiply(v, num){
return [v[0]*num, v[1]*num];
}

function divide(v, num){
return [v[0]/num, v[1]/num];
}

function add(a, b){
return [a[0]+b[0], a[1]+b[1]];
}

function minus(a, b){
return [a[0]-b[0], a[1]-b[1]];
}

function length(a, b){
return Math.sqrt(Math.pow(a[0] - b[0],2) +
Math.pow(a[1] - b[1],2));
}
</script>
<title>Square</title>
</head>
<body>
<canvas id="sketch" height="1000" width="1000"></canvas>
</body>

</html>

我每次迭代都会更改不透明度值。但我在结果中没有看到它。

如何解决这个问题?

最佳答案

您非常接近正确的解决方案。看这里: http://jsfiddle.net/mbessey/Wj4VH/

这里的关键区别是在为每个方 block 启动 moveTo() 和 lineTo() 之前调用 beginPath()。所以,而不是:

context.moveTo(P2[0],P2[1]);
context.lineTo(P6[0],P6[1]);
context.lineTo(P7[0],P7[1]);
context.lineTo(P5[0],P5[1]);
context.fill();

context.moveTo(P5[0],P5[1]);
context.lineTo(P8[0],P8[1]);
context.lineTo(P9[0],P9[1]);
context.lineTo(P3[0],P3[1]);
context.fill();

你想要:

context.beginPath()
context.moveTo(P2[0],P2[1]);
context.lineTo(P6[0],P6[1]);
context.lineTo(P7[0],P7[1]);
context.lineTo(P5[0],P5[1]);
context.fill();

context.beginPath()
context.moveTo(P5[0],P5[1]);
context.lineTo(P8[0],P8[1]);
context.lineTo(P9[0],P9[1]);
context.lineTo(P3[0],P3[1]);
context.fill();

您所做的本质上是创建一条包含所有方 block 的大路径,然后用相同的颜色填充它。

关于javascript - 绘制分形时迭代更改 Canvas 中的 fillStyle 颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14452092/

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