平移變換是指圖形從一個位置到另外一個位置所做的直線移動。若是要把一個位於P(x,y)的點移到新位置P’(x’,y’),如圖1,則只要在原座標上加上平移距離Tx和Ty便可。javascript
即 x’=x+Tx html
y’=y+Tyjava
圖1 點的平移canvas
生成一個六瓣花型圖案的基本數據,經過平移變換繪製8行8列共64個六瓣花型的圖案。數組
編寫以下的HTML代碼。瀏覽器
<!DOCTYPE html>3d
<head>rest
<title>六瓣花平移變換</title>orm
<script type="text/javascript">htm
function draw(id)
{
var canvas=document.getElementById(id);
if (canvas==null)
return false;
var context=canvas.getContext('2d');
context.fillStyle="#EEEEFF";
context.fillRect(0,0,320,320);
context.strokeStyle="blue";
context.lineWidth=1;
var dig=Math.PI/64;
var x=new Array();
var y=new Array();
var r=40;
// 生成一個六瓣花型圖案的基本數據
for (var i=0;i<=128;i++)
{
d=r/2*(0.8+Math.sin(18*i*dig)/5)*1.3;
t=d*(0.5+Math.sin(6*i*dig)/2);
x[i]=t*Math.cos(i*dig);
y[i]=t*Math.sin(i*dig);
}
// 經過平移變換繪製8行8列共64個六瓣花型的圖案
for (var row=1;row<=8;row++)
for (var col=1;col<=8;col++)
{
// 計算平移量px和py
px=(2*col-1)/2*r;
py=(2*row-1)/2*r;
for (i=0;i<=128;i++)
{
x1=x[i]+px;
y1=y[i]+py;
if (i==0)
{
context.moveTo(x1,y1);
bx=x1; by=y1;
}
else
context.lineTo(x1,y1);
}
}
context.lineTo(bx,by);
context.closePath();
context.stroke();
}
</script>
</head>
<body onload="draw('myCanvas');">
<canvas id="myCanvas" width="320" height="320">您的瀏覽器不支持canvas!
</canvas>
</body>
</html>
將上述HTML代碼保存到一個html文本文件中,再在瀏覽器中打開包含這段HTML代碼的html文件,能夠看到在瀏覽器窗口中繪製出64個六瓣花型的圖案,如圖2所示。
圖2 64個六瓣花型的圖案
對稱變換的公式以下:
x’=ax+by
y’=cx+dy
當a,b,c,d 取不一樣值時,產生不一樣的對稱變換。
(1)當b=c=0,a=-1,d=1 時,產生相對於y 軸對稱的反射圖形。
(2)當b=c=0,a=1,d=-1 時,產生相對於x 軸對稱的反射圖形。
(3)當b=c=0,a=d=-1 時,產生相對於原點對稱的反射圖形。
(4)當b=c=1,a=d=0 時,產生相對於直線y=x 對稱的反射圖形。
(5)當b=c=-1,a=d=0 時,產生相對於直線y=-x 對稱的反射圖形。
各對稱變換如圖3所示。
圖3 對稱變換
在半徑爲60的圓周上取5個等分點,用這5個點依次首尾鏈接畫5條線,能夠繪製出一個正多邊形。用這個正多邊形爲原圖,根據選擇的方式,進行對稱變換。
編寫以下的HTML代碼。
<!DOCTYPE html>
<head>
<title>對稱變換</title>
<script type="text/javascript">
// 定義保存基本圖案數據的數組
var x=new Array(10);
var y=new Array(10);
var dig=2*Math.PI/5;
for (var i=0;i<=5;i++)
{
x[i]=-75+60*Math.sin(i*dig);
y[i]=-75+60*Math.cos(i*dig);
}
function draw()
{
var sele=document.frm.shape.selectedIndex;
var canvas=document.getElementById("myCanvas");
if (canvas==null)
return false;
var context=canvas.getContext('2d');
context.fillStyle="#EEEEFF";
context.fillRect(0,0,300,300);
//繪製x軸、y軸(注意:咱們不進行旋轉,故y軸向下)
context.beginPath();
context.moveTo(0,150);
context.lineTo(285,150);
context.moveTo(150,0);
context.lineTo(150,285);
context.strokeStyle = "blue";
context.stroke();
context.fillStyle = "blue";
context.beginPath();
context.moveTo(285,145);
context.lineTo(295,150);
context.lineTo(285,155);
context.closePath();
context.fill();
context.beginPath();
context.moveTo(145,285);
context.lineTo(150,295);
context.lineTo(155,285);
context.closePath();
context.fill();
context.fillStyle="yellow";
context.strokeStyle="red";
context.lineWidth=1;
context.save();
context.translate(150,150);
context.beginPath();
context.moveTo(x[0],y[0]);
for (n=1;n<=5;n++)
{
context.lineTo(x[n],y[n]);
}
context.closePath();
context.stroke();
context.fill();
context.beginPath();
context.moveTo(x[0],y[0]);
context.lineTo(x[2],y[2]);
context.strokeStyle="black";
context.stroke();
context.fillStyle="red";
context.strokeStyle="yellow";
context.beginPath();
switch(sele)
{
case 1: b=c=0,a=1,d=-1; break;
case 2: b=c=0,a=-1,d=1; break;
case 3: b=c=0,a=d=-1; break;
case 4: b=c=1,a=d=0; break;
case 5: b=c=-1,a=d=0; break;
}
context.moveTo(a*x[0]+b*y[0],c*x[0]+d*y[0]);
for (n=1;n<=5;n++)
{
context.lineTo(a*x[n]+b*y[n],c*x[n]+d*y[n]);
}
context.closePath();
context.stroke();
context.fill();
context.beginPath();
context.moveTo(a*x[0]+b*y[0],c*x[0]+d*y[0]);
context.lineTo(a*x[2]+b*y[2],c*x[2]+d*y[2]);
context.strokeStyle="black";
context.stroke();
context.restore();
}
</script>
</head>
<body>
<form name="frm">對稱方式選擇:
<select name="shape" onchange="draw();">
<option>--請選擇--</option>
<option>X軸對稱</option>
<option>Y軸對稱</option>
<option>原點對稱</option>
<option>直線Y=X對稱</option>
<option>直線Y=-X對稱</option>
</select>
</form>
<br/>
<canvas id="myCanvas" width="300" height="300">您的瀏覽器不支持canvas!</canvas>
</body>
</html>
將上述HTML代碼保存到一個html文本文件中,再在瀏覽器中打開包含這段HTML代碼的html文件,能夠看到在瀏覽器窗口中,出現「對稱方式選擇:」下拉列表框,提供5種對稱方式的選擇,改變選定的對稱方式後,能夠繪製出基本圖案的相應對稱變換圖案。整個演示過程錄屏後展現如圖8所示。
圖4 圖形的對稱變換