Levy曲線是將一條線段不停地分形成兩條長度相等且相互垂直的線段而生成的,Levy分形的最后很像一個英文字母C,所以也稱它為C曲線, Levy曲線的生成示意如圖1所示,

圖1 Levy曲線的生成
1.Levy曲線
Levy曲線采用遞回程序易于實作,撰寫如下的HTML代碼,
<!DOCTYPE html>
<head>
<title>Levy曲線</title>
</head>
<body>
<canvas id="myCanvas" width="600" height="400" style="border:3px double #996633;">
</canvas>
<script type="text/javascript">
var canvas = document.getElementById('myCanvas');
var ctx = canvas.getContext('2d');
var depth=12;
ctx.lineWidth = 2;
fractal_c(depth,{x:150,y:100},{x:450,y:100});
function fractal_c(n,p1,p2)
{
if (n>0)
{
var x3=(p1.x+p1.y+p2.x-p2.y)/2;
var y3=(p2.x+p2.y+p1.y-p1.x)/2;
fractal_c(n-1,p1,{x:x3,y:y3});
fractal_c(n-1,{x:x3,y:y3},p2);
}
if (n==0)
{
ctx.strokeStyle = "red";
ctx.beginPath();
ctx.moveTo(p1.x,p1.y);
ctx.lineTo(p2.x,p2.y);
ctx.closePath();
ctx.stroke();
}
}
</script>
</body>
</html>
在瀏覽器中打開包含這段HTML代碼的html檔案,可以看到在瀏覽器視窗中繪制出的Levy曲線,如圖2所示,

圖2 遞回深度depth =12的Levy曲線
將上面HTML檔案中的呼叫陳述句“fractal_c(depth,{x:150,y:100},{x:450,y:100}); ”修改為“fractal_c(depth,{x:350,y:100},{x:350,y:300});”,則可在瀏覽器視窗中繪制出如圖3所示的Levy曲線,它很像字母C,

圖3 C曲線
2.龍形曲線
Levy曲線是將一條線段不停地分形成兩條長度相等且相互垂直的線段而生成的,分形是對折方向都是沿著同一個方向,如果將分形對折方向進行交替切換會如何呢?繪制出的曲線像龍形,稱為龍形曲線,
龍形曲線的生成方式與Levy曲線相似,也是將線段不停地分形成兩條長度相等且相互垂直的線段,不同之處是其對折的方向是一個左一個右,而levy曲線則是始終朝著一邊對折,龍形曲線的生成示意如圖4所示,

圖4 龍形曲線的生成
龍形曲線采用遞回程序易于實作,撰寫如下的HTML代碼,
<!DOCTYPE html>
<head>
<title>龍形曲線</title>
</head>
<body>
<canvas id="myCanvas" width="600" height="400" style="border:3px double #996633;">
</canvas>
<script type="text/javascript">
var canvas = document.getElementById('myCanvas');
var ctx = canvas.getContext('2d');
var depth=10;
ctx.lineWidth = 2;
fractal_c(depth,{x:150,y:150},{x:450,y:150},true);
function fractal_c(n,p1,p2,left)
{
if (n>0)
{
if (left)
{
var x3=(p1.x+p1.y+p2.x-p2.y)/2;
var y3=(p2.x+p2.y+p1.y-p1.x)/2;
}
else
{
var x3=(p1.x+p2.y+p2.x-p1.y)/2;
var y3=(p1.x+p2.y+p1.y-p2.x)/2;
}
fractal_c(n-1,p1,{x:x3,y:y3},true);
fractal_c(n-1,{x:x3,y:y3},p2,false);
}
if (n==0)
{
ctx.strokeStyle = "red";
ctx.beginPath();
ctx.moveTo(p1.x,p1.y);
ctx.lineTo(p2.x,p2.y);
ctx.closePath();
ctx.stroke();
}
}
</script>
</body>
</html>
在瀏覽器中打開包含這段HTML代碼的html檔案,可以看到在瀏覽器視窗中繪制出的龍形曲線,如圖5所示,

圖5 遞回深度depth =10的龍形曲線
3.變形的Levy曲線
為了繪制Levy曲線,還可以撰寫如下的HTML代碼,
<!DOCTYPE html>
<head>
<title>變形的Levy曲線</title>
</head>
<body>
<canvas id="myCanvas" width="600" height="400" style="border:3px double #996633;">
</canvas>
<script type="text/javascript">
var canvas = document.getElementById('myCanvas');
var ctx = canvas.getContext('2d');
var d=45;
ctx.lineWidth = 2;
ctx.strokeStyle = "red";
ctx.beginPath();
ctx.moveTo(400,100);
drawC(400,100,150,90+45);
ctx.stroke();
function drawC(x,y,L,angle)
{
if (L>=5)
{
var x1=x+L*Math.cos(angle*Math.PI/180);
var y1=y+L*Math.sin(angle*Math.PI/180);
drawC(x,y,L*0.707,angle-d);
drawC(x1,y1,L*0.707,angle+d);
}
else
{
ctx.lineTo(x,y);
}
}
</script>
</body>
</html>
在瀏覽器中打開包含這段HTML代碼的html檔案,可以看到在瀏覽器視窗中繪制出的Levy曲線,如圖6所示,

圖6 d=45時的Levy曲線
上面程式中的d取不同值時,所繪制的曲線會變化,下圖7~9分別是d值取75、90和150時繪制的曲線,

圖7 d=75時的Levy曲線

圖8 d=90時的Levy曲線

圖9 d=150時的Levy曲線
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/47796.html
標籤:JavaScript
上一篇:vue開發環境和生產環境配置
