JavaScript圖像放大鏡效果實(shí)現(xiàn)方法詳解
1. 基本四瓣花型圖案
根據(jù)四瓣花卉線的參數(shù)方程:
t= r*(1+sin(12*θ)/5)*(0.5+sin(4*θ)/2);
x=t*cos(θ));
y=t*sin(θ));
編寫如下的HTML文件。
<!DOCTYPE html>
<head>
<title>基本的四瓣花型圖案</title>
<script type="text/javascript">
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;
context.beginPath();
for (var i = 0; i <= 128; i++)
{
d = 120 * (1 + Math.sin(12 * i *
dig) / 5);
t = d * (0.5 + Math.sin(4 * i * dig) /
2);
x = (160 + t * Math.cos(i * dig));
y = (160 + t * Math.sin(i * dig));
if (i == 0)
context.moveTo(x, y);
else
context.lineTo(x, y);
}
context.stroke();
}
</script>
</head>
<body onload="draw('myCanvas');">
<canvas id="myCanvas" width="320" height="320"></canvas>
</body>
</html>
在瀏覽器中打開包含這段HTML代碼的html文件,可以看到在畫布中繪制出如圖1所示的四瓣花卉線圖案。

圖1 四瓣花卉線圖案
2.平鋪的100朵四瓣花
用一個(gè)二重循環(huán)將圖1的四瓣花卉繪制10行10列共100朵。編寫的HTML文件內(nèi)容如下。
<!DOCTYPE html>
<head>
<title>平鋪的100朵四瓣花</title>
<script type="text/javascript">
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;
context.beginPath();
for (px = 20; px < 320; px += 30)
for (py = 20; py < 320; py += 30)
{
for (var i = 0; i <= 128; i++)
{
d = 20 * (1 + Math.sin(12 * i *
dig) / 5);
t = d * (0.5 + Math.sin(4 * i *
dig) / 2);
x = px + t * Math.cos(i * dig);
y = py + t * Math.sin(i * dig);
if (i == 0)
context.moveTo(x, y);
else
context.lineTo(x, y);
}
context.stroke();
}
}
</script>
</head>
<body onload="draw('myCanvas');">
<canvas id="myCanvas" width="320" height="320"></canvas>
</body>
</html>
在瀏覽器中打開包含這段HTML代碼的html文件,可以看到在畫布中繪制出如圖2所示的平鋪的100朵四瓣花卉圖案。

圖2 平鋪的100朵四瓣花卉圖案
3.放大鏡看平鋪的四瓣花
將圖2圖形中位于中心點(diǎn)周圍100以內(nèi)的點(diǎn)的坐標(biāo)進(jìn)行球面鏡反射變換,可以實(shí)現(xiàn)放大鏡效果。編寫的HTML文件內(nèi)容如下。
<!DOCTYPE html>
<head>
<title>球面鏡反射變換</title>
<script type="text/javascript">
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;
context.beginPath();
var r = 140;
var x0 = 160;
var y0 = 160;
for (px = 20; px < 320; px += 30)
for (py = 20; py < 320; py += 30)
{
for (var i = 0; i <= 128; i++)
{
d = 20 * (1 + Math.sin(12 * i *
dig) / 5);
t = d * (0.5 + Math.sin(4 * i *
dig) / 2);
x = px + t * Math.cos(i * dig);
y = py + t * Math.sin(i * dig);
l = Math.sqrt((x - x0) * (x - x0) +
(y - y0) * (y - y0));
if (l < r)
{ // 圓心為(160,160),半徑為140的圓內(nèi)各點(diǎn)進(jìn)行球面鏡反射變換
s = x - x0 < 0 ? -1 : 1;
if (x - x0 == 0) x = x0 + 0.1;
bt = 2 * Math.atan(l / r);
th = Math.atan((y - y0) / (x - x0));
m = r * Math.sin(bt);
x = s * m * Math.cos(th) + x0;
y = s * m * Math.sin(th) + y0;
}
if (i == 0)
context.moveTo(x, y);
else
context.lineTo(x, y);
}
context.stroke();
}
}
</script>
</head>
<body onload="draw('myCanvas');">
<canvas id="myCanvas" width="320" height="320"></canvas>
</body>
</html>
在瀏覽器中打開包含這段HTML代碼的html文件,可以看到在畫布中繪制出如圖3所示的圖形放大鏡效果1。

圖3 圖形放大鏡效果1
上面程序中語句var r=140;、var x0=160;和var y0=160;用于設(shè)置放大鏡的圓心坐標(biāo)和半徑。若修改r=100,x0=100,y0=100,則在畫布中繪制出如圖4所示的圖形放大鏡效果2。

圖4 圖形放大鏡效果2
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- JavaScript如何使用插值實(shí)現(xiàn)圖像漸變
- JavaScript實(shí)現(xiàn)圖像模糊化的方法實(shí)例
- Javascript基礎(chǔ)_嵌入圖像的簡(jiǎn)單實(shí)現(xiàn)
- JavaScript圖像延遲加載庫(kù)Echo.js
- javascript實(shí)現(xiàn)圖像循環(huán)明暗變化的方法
- JS預(yù)覽圖像將本地圖片顯示到瀏覽器上
- javascript圖像處理—仿射變換深度理解
- Javascript圖像處理—圖像形態(tài)學(xué)(膨脹與腐蝕)
- Javascript圖像處理—為矩陣添加常用方法
- 10大Js圖像處理庫(kù)
相關(guān)文章
Select標(biāo)簽下拉列表二級(jí)聯(lián)動(dòng)級(jí)聯(lián)實(shí)例代碼
這篇文章主要介紹了Select標(biāo)簽下拉列表二級(jí)聯(lián)動(dòng)級(jí)聯(lián)實(shí)例代碼,需要的朋友可以參考下2014-02-02
JavaScript中Object.freeze()和Object.seal()的使用
Object.freeze()和Object.seal()是JavaScript中用于控制對(duì)象可變性的兩個(gè)方法,本文就詳細(xì)的介紹一下這兩種方法,感興趣的可以了解一下2024-09-09
一個(gè)簡(jiǎn)單的Node.js異步操作管理器分享
這篇文章主要介紹了一個(gè)簡(jiǎn)單的Node.js異步操作管理器分享,需要的朋友可以參考下2014-04-04
javascript將ip地址第四段用星號(hào)代替的兩種方法
javascript將ip地址第四段用星號(hào)代替的方法,需要的朋友可以參考下。2010-03-03
JavaScript仿靜態(tài)分頁實(shí)現(xiàn)方法
這篇文章主要介紹了JavaScript仿靜態(tài)分頁實(shí)現(xiàn)方法,可實(shí)現(xiàn)模擬靜態(tài)效果的分頁功能,并且可以控制分頁的字符數(shù),使用時(shí)可根據(jù)情況進(jìn)行相應(yīng)的字段修改即可,非常靈活實(shí)用,需要的朋友可以參考下2015-08-08
使用JS在瀏覽器中判斷當(dāng)前網(wǎng)絡(luò)連接狀態(tài)的幾種方法
本篇文章主要介紹了使用JS在瀏覽器中判斷當(dāng)前網(wǎng)絡(luò)狀態(tài)的幾種方法,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-05-05
js傳中文參數(shù)controller里獲取參數(shù)亂碼問題解決方法
js傳中文參數(shù),在controller里獲取參數(shù)亂碼的問題在本文有個(gè)不錯(cuò)的解決方法,感興趣的朋友可以參考下2014-01-01

