久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

HTML5實(shí)驗(yàn):JavaScript模擬流體效果

第1頁繪制橢圓

把現(xiàn)實(shí)世界當(dāng)中的物體模擬到計(jì)算機(jī)當(dāng)中,一些簡(jiǎn)單的物理實(shí)驗(yàn)、碰撞旋轉(zhuǎn)等等難度還是不算很大,難度較大的應(yīng)當(dāng)算流體模擬。

本文將在Canvas當(dāng)中模擬出一個(gè)2D平面內(nèi)的水珠,涉及的知識(shí)點(diǎn)和技巧包括:Jscex基礎(chǔ)知識(shí),貝塞爾曲線的繪制,合理利用CanvasRenderingContext2D的translate和rotate等API。

繪制橢圓

在模擬水滴之前,我們先思考一下怎么在canvas當(dāng)中繪制一個(gè)橢圓。

大家可以很容易想到 下面幾種方案:

1.根據(jù)橢圓笛卡爾坐標(biāo)系方程繪制

2.根據(jù)橢圓極坐標(biāo)方程繪制

3.根據(jù)橢圓曲率變化繪制

4.利用四條貝塞爾曲線繪制

第四種,也是性能最好的一種,這樣可以避免復(fù)雜的計(jì)算,充分利用CanvasRenderingContext2D的API(API的性能是通過嚴(yán)格測(cè)試,一般情況下比較靠譜).

所以我們采用第四種方式來繪制橢圓。

var canvas;

var ctx;

ctx = canvas.getContext(“2d”);

ctx.strokeStyle = “#fff”;

function drawEllipse(x, y, w, h) {

var k = 0.5522848;

var ox = (w / 2) * k;

var oy = (h / 2) * k;

var xe = x + w;

var ye = y + h;

var xm = x + w / 2;

var ym = y + h / 2;

ctx.beginPath();

ctx.moveTo(x, ym);

ctx.bezierCurveTo(x, ym – oy, xm – ox, y, xm, y);

ctx.bezierCurveTo(xm + ox, y, xe, ym – oy, xe, ym);

ctx.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye);

ctx.bezierCurveTo(xm – ox, ye, x, ym + oy, x, ym);

ctx.stroke();

ctx.clearRect(0,0,canvas.width,canvas.border=”1″ Height);

drawEllipse(10, 10, 40, 82);

(改變drawEllipse的四個(gè)參數(shù)試試)

旋轉(zhuǎn)橢圓

這里的旋轉(zhuǎn)不是繞上面的drawEllipse的前兩個(gè)參數(shù)x,y旋轉(zhuǎn),二是繞橢圓的中心旋轉(zhuǎn)。所以僅僅 CanvasRenderingContext2D.rotate是不夠的,因?yàn)镃anvasRenderingContext2D.rotate是繞畫 布的左上角(0,0)旋轉(zhuǎn)。所以我們先要把(0,0)通過CanvasRenderingContext2D.translate到橢圓的中心,然后再 drawEllipse(-a/2, –b/2, a, b).

上面這句話,就是繞中心旋轉(zhuǎn)的核心。這里還可以推廣到任意圖形或者圖片(假設(shè)有約定的中心)。如圖:

HTML5實(shí)驗(yàn):JavaScript模擬流體效果

第2頁旋轉(zhuǎn)橢圓

然后我們就可以先繪制一個(gè)鳥巢出來:

html>

head>

script src=”http://files.cnblogs.com/iamzhanglei/jscex.jscexRequire.min.js” type=”text/javascript”>script>

head>

body>

style type=”text/css”>

input.css3btn

background: -moz-linear-gradient(270deg, #d2ebf8, #0c8ab5);

background: -webkit-linear-gradient(top, #d2ebf8, #0c8ab5);

background: -o-linear-gradient(top, #d2ebf8, #0c8ab5);

filter: progid:DXImageTransform.Microsoft.Gradient(GradientType=0, StartColorStr=”#000099CC”, EndColorStr=”#FF0087B4″);

border-top: 1px solid #38538c;

border-right: 1px solid #1f2d4d;

border-bottom: 1px solid #151e33;

border-left: 1px solid #1f2d4d;

border-radius: 4px;

box-shadow: inset 0 1px 10px 1px #5c8bee, 0px 1px 0 #1d2c4d, 0 2px 0px #1f3053, 0 4px 4px 1px #111111;

color: #f0f0f0;

font: bold 20px “helvetica neue” , helvetica, arial, sans-serif;

padding: 10px 0 10px 0;

text-align: center;

text-shadow: 0px -1px 1px #1e2d4d;

width: 150px;

background-clip: padding-box;

input.css3btn:hover

box-shadow: inset 0 0px 20px 1px #87adff, 0px 1px 0 #1d2c4d, 0 3px 0px #1f3053, 0 4px 4px 1px #111111;

cursor: pointer;

input.css3btn:active

box-shadow: inset 0 1px 10px 1px #5c8bee, 0 1px 0 #1d2c4d, 0 2px 0 #1f3053, 0 4px 3px 0 #111111;

style>

canvas width=”350″ border=”1″ height=”350″ style=”border: solid 15px #222; background-color: #111;

color: #CCC;”>

Your browser does not support the canvas element.

canvas>

script>

var canvas;

var ctx;

var px = 0;

var py = 0;

function init() {

ctx = canvas.getContext(“2d”);

ctx.strokeStyle = “#fff”;

ctx.translate(70, 70);

init();

var i = 0;

function drawEllipse(x, y, w, h) {

var k = 0.5522848;

var ox = (w / 2) * k;

var oy = (h / 2) * k;

var xe = x + w;

var ye = y + h;

var xm = x + w / 2;

var ym = y + h / 2;

ctx.beginPath();

ctx.moveTo(x, ym);

ctx.bezierCurveTo(x, ym – oy, xm – ox, y, xm, y);

ctx.bezierCurveTo(xm + ox, y, xe, ym – oy, xe, ym);

ctx.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye);

ctx.bezierCurveTo(xm – ox, ye, x, ym + oy, x, ym);

ctx.stroke();

ctx.translate(x + 70, y + 100);

px = -70;

py = -100;

ctx.rotate(10 * Math.PI * 2 / 360);

var ct;

var drawAsync = eval(Jscex.compile(“async”, function (ct) {

while (true) {

drawEllipse(px, py, 140, 200)

$await(Jscex.Async.sleep(200, ct));

}))

function Button1_onclick() {

ct.cancel();

function Button2_onclick() {

ct = new Jscex.Async.CancellationToken();

drawAsync(ct).start();

script>

br />

input type=”button” value=”run” onclick=”return Button2_onclick()” />

input type=”button” value=”stop” onclick=”return Button1_onclick()” />

body>

html>

第3頁繪制水滴

HTML5實(shí)驗(yàn):JavaScript模擬流體效果

 

繪制水滴

旋轉(zhuǎn)的橢圓和鳥巢神馬的和水滴有什么關(guān)系呢?

我們通過改變橢圓的長(zhǎng)軸和短軸,令其非常接近圓形(只能接近,不能等于圓形),然后每次旋轉(zhuǎn)擦除畫布,就可以達(dá)你預(yù)想不到的效果!

這里需要注意的是,擦除畫布不再是一句 CanvasRenderingContext2D.clearRect(0,0,canvas.width,canvas.border=”1″ Height)就可以,因?yàn)楫嫴家呀?jīng)旋轉(zhuǎn)和畫布原點(diǎn)已經(jīng)translate,所以我們使用 ctx.clearRect(-canvas.width, -canvas.border=”1″ Height, 2 * canvas.width, 2 * canvas.border=”1″ Height)來擦除畫布。

我們畫一個(gè)長(zhǎng)軸42,短軸40的橢圓,旋轉(zhuǎn)并擦除畫布:

function drawEllipse(x, y, w, h) {

ctx.clearRect(-canvas.width, -canvas.border=”1″ Height, 2 * canvas.width, 2 * canvas.border=”1″ Height);

var k = 0.5522848;

var ox = (w / 2) * k;

var oy = (h / 2) * k;

var xe = x + w;

var ye = y + h;

var xm = x + w / 2;

var ym = y + h / 2;

ctx.beginPath();

ctx.moveTo(x, ym);

ctx.bezierCurveTo(x, ym – oy, xm – ox, y, xm, y);

ctx.bezierCurveTo(xm + ox, y, xe, ym – oy, xe, ym);

ctx.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye);

ctx.bezierCurveTo(xm – ox, ye, x, ym + oy, x, ym);

ctx.stroke();

ctx.translate(x + 20, y + 21);

px = -20;

py = -21;

ctx.rotate(10 * Math.PI * 2 / 360);

var ct;

var drawAsync = eval(Jscex.compile(“async”, function (ct) {

while (true) {

drawEllipse(px, py, 40, 42)

$await(Jscex.Async.sleep(10, ct));

}))

會(huì)是什么效果呢?

在線演示效果查看

http://www.cnblogs.com/iamzhanglei/archive/2011/12/12/2284188.html

現(xiàn)在大家可以看到一個(gè)晃動(dòng)的水珠了

【網(wǎng)站聲明】本站除付費(fèi)源碼經(jīng)過測(cè)試外,其他素材未做測(cè)試,不保證完整性,網(wǎng)站上部分源碼僅限學(xué)習(xí)交流,請(qǐng)勿用于商業(yè)用途。如損害你的權(quán)益請(qǐng)聯(lián)系客服QQ:2655101040 給予處理,謝謝支持。

相關(guān)文檔推薦

這篇文章主要介紹了有關(guān)HTML5頁面在iPhoneX適配問題,需要的朋友可以參考下
本篇文章主要介紹了html5中canvas圖表實(shí)現(xiàn)柱狀圖的示例,本文使用canvas來實(shí)現(xiàn)一個(gè)圖表,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
Adobe公司出品的多媒體處理軟件產(chǎn)品線較多,涵蓋了音視頻編輯、圖像處理、平面設(shè)計(jì)、影視后期等領(lǐng)域。這篇文章主要介紹了Adobe Html5 Extension開發(fā)初體驗(yàn)圖文教程,非常不錯(cuò),需要的朋
這篇文章主要介紹了基于HTML5的WebGL經(jīng)典3D虛擬機(jī)房漫游動(dòng)畫,需要的朋友可以參考下
這篇文章主要介紹了手機(jī)端用rem+scss做適配的詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
本篇文章主要介紹了canvas 實(shí)現(xiàn) github404動(dòng)態(tài)效果的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
主站蜘蛛池模板: 国产精品不卡视频 | 一区二区三区四区日韩 | 欧美一级在线观看 | 国产精品福利在线观看 | 日韩欧美三级电影在线观看 | 久久久久无码国产精品一区 | 亚洲综合久久久 | 亚洲福利精品 | 精品国产一区二区三区四区在线 | 一区影院 | 国产高清在线观看 | 久久一| 国产精品视频一区二区三区不卡 | 欧美中文字幕在线 | 欧美电影一区 | 天天艹逼网 | 国产精品久久久久久238 | 色婷婷一区二区三区四区 | 就操在线| 天堂在线免费视频 | 伊人超碰 | 成人做爰9片免费看网站 | 亚洲免费视频播放 | 欧美视频在线看 | 国产一区久久久 | 国产精品区二区三区日本 | 亚洲免费在线观看av | 91免费看片| 欧美午夜一区 | 日本成人区 | 国产精品久久久久久久久久久新郎 | 亚洲自拍偷拍av | 精精国产xxxx视频在线野外 | 久久久久成人精品免费播放动漫 | jlzzjlzz国产精品久久 | 精品一区国产 | 欧美日产国产成人免费图片 | 精品一二区 | 亚洲免费三级 | 成人黄在线观看 | 成人精品久久 |