摘要:而這篇文章的目的是要用前端的方式,畫出笛卡爾心形線。根據(jù)這個(gè)參數(shù)方程,用上面說的平面直角坐標(biāo)系的畫法,把代碼里的方程換一下,就可以畫出這樣的心形。
說明
寫這篇文章是因?yàn)槟程炜吹竭@樣一個(gè)公式 r=a(1-cosθ) ,我上網(wǎng)搜了下,原來是笛卡爾心形線的極坐標(biāo)方程,這個(gè)方程里面的確有一個(gè)浪漫又悲情的愛情故事,感興趣的朋友可以點(diǎn)這里看看,而至于這個(gè)故事是真是假,這 并不重要。
而這篇文章的目的是要用前端的方式,畫出笛卡爾心形線。
本來我想,這么經(jīng)典的公式,網(wǎng)上應(yīng)該已經(jīng)有人實(shí)現(xiàn)過了吧。
我搜了搜,不得不佩服網(wǎng)友們,有 Java 實(shí)現(xiàn)的,有 C# 實(shí)現(xiàn)的,也有 canvas 實(shí)現(xiàn)的,還能用 ECharts 畫 ,可以學(xué)習(xí)學(xué)習(xí)。
好的,開始正文!
先來了解下心形線
心形線,是一個(gè)圓上的固定一點(diǎn)在它繞著與其相切且半徑相同的另外一個(gè)圓周滾動(dòng)時(shí)所形成的軌跡,因其形狀像心形而得名。
因?yàn)?canvas 是直角坐標(biāo)系的,所以先來看
平面直角坐標(biāo)系 畫法先貼出網(wǎng)上搜來的 心形線的平面直角坐標(biāo)系方程表達(dá)式
分別為 x^2+y^2+a*x=a*sqrt(x^2+y^2) 和 x^2+y^2-a*x=a*sqrt(x^2+y^2
為什么會(huì)有兩個(gè)方程表達(dá)式?
因?yàn)樾男尉€的水平方向 和 垂直方向 對(duì)應(yīng)的方程表達(dá)式不同,而用相同的方程表達(dá)式畫的心形線,把每個(gè)點(diǎn)的 x 坐標(biāo)和 y 坐標(biāo)交換下,又會(huì)改變方向,所以會(huì)有兩個(gè)方程表達(dá)式。
好了,開始畫吧,看看這位朋友的做法
思路
根據(jù)方程表達(dá)式得到所有點(diǎn)的坐標(biāo),然后把每個(gè)點(diǎn)連接起來,然后填充,最后就行成一個(gè)心形了。
參數(shù)方程
x=a*(2*sin(t)+sin(2*t)) y=a*(2*cos(t)+cos(2*t))
x,y 分別表示一個(gè)點(diǎn)的 x 坐標(biāo) 和 y 坐標(biāo),
a:是一個(gè)常數(shù),用來控制心形的大小,
t :代表 弧度
t 的取值范圍:-pi<=t<=pi 或 0<=t<=2*pi
代碼
效果圖
平面直角坐標(biāo)系 畫法 (空心心形)上面的代碼是畫一個(gè)實(shí)心的心形,當(dāng)然我們也可以畫空心的,只需要做出一點(diǎn)點(diǎn)的修改就可以。
我們只需要改改 draw( ) 函數(shù)就好,把原來的 fill( ) 方法,改為 stroke( ) 方法,并且把 strokeStyle 設(shè)置了顏色就行了。
function draw(){ //context.fillStyle="#c00"; context.strokeStyle="#c00"; // 把每個(gè)點(diǎn)連接起來 for(var i=1;i極坐標(biāo)系畫法 極坐標(biāo)系是這樣的
極坐標(biāo)系中確定一個(gè)點(diǎn)的位置,靠的是極點(diǎn)(圖中點(diǎn)O),和 角度 來確定的。
更多關(guān)于極坐標(biāo)系的知識(shí),可以看看這里看看這位朋友的做法
思路
根據(jù)極坐標(biāo)方程 r=a(1+sinθ) ,得到 r ,以 r 作為半徑,根據(jù) r 連續(xù)的去畫圓弧,畫完一圈后,心形就出來了。心形線 極坐標(biāo)方程
r=a(1+sinθ)代碼
效果圖
極坐標(biāo)系 畫法 (空心心形)用極坐標(biāo)系 畫法,畫空心心形,也是一樣的需要改改 draw( ) 函數(shù),把原來的 fill( ) 方法,改為 stroke( ) 方法,并且把 strokeStyle 設(shè)置了顏色就行了。
function draw() { var r = 0; var start = 0; var end = 0; var a = 100; //context.fillStyle = "#e21f27"; context.strokeStyle = "#e21f27"; for (var i = 0; i < 500; i++) { start += Math.PI * 2 / 500; end = start + Math.PI * 2 / 500; r = a * (1 + Math.sin(start)); context.arc(0, 0, r, start, end, false); } //context.fill(); // 改用 stroke() 方法 context.stroke(); }可能你會(huì)覺得這樣的心形并不好看。
看看這個(gè)參數(shù)方程吧!x=16 * (sin(t)) ^ 3; y=13 * cos(t) - 5 * cos(2 * t) - 2 * cos(3 * t) - cos(4 * t)。根據(jù)這個(gè)參數(shù)方程,用上面說的平面直角坐標(biāo)系的畫法,把代碼里的方程換一下,就可以畫出這樣的心形。
代碼
也許我們還可以再做點(diǎn)什么,比如加點(diǎn)動(dòng)畫,看看下面這個(gè)吧。
總結(jié)
點(diǎn)這里下載源碼,里面已經(jīng)加了很詳細(xì)的注釋了。這篇文章主要是說用笛卡爾心形線方程畫心形,但是想要畫出心形的方式絕對(duì)是多種多樣的,單純的用CSS也可以,復(fù)雜點(diǎn) 用貝塞爾曲線也能畫出來,大家不妨去試試,說不定又有什么新發(fā)現(xiàn)呢。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/110140.html
摘要:而這篇文章的目的是要用前端的方式,畫出笛卡爾心形線。根據(jù)這個(gè)參數(shù)方程,用上面說的平面直角坐標(biāo)系的畫法,把代碼里的方程換一下,就可以畫出這樣的心形。 說明 寫這篇文章是因?yàn)槟程炜吹竭@樣一個(gè)公式 r=a(1-cosθ) ,我上網(wǎng)搜了下,原來是笛卡爾心形線的極坐標(biāo)方程,這個(gè)方程里面的確有一個(gè)浪漫又悲情的愛情故事,感興趣的朋友可以點(diǎn)這里看看,而至于這個(gè)故事是真是假,這 并不重要。 而這篇文章的...
摘要:故而總結(jié)如下編成的代碼浪漫的環(huán)境親手制作的禮物注意請(qǐng)將下面的程序員的情人節(jié)禮物換成語言。言歸正傳程序員的情人節(jié)禮物入門之材料構(gòu)思情人節(jié)禮物之設(shè)備展示想著在這個(gè)移動(dòng)盛行的時(shí)代,再用電腦就不太合適了。 是時(shí)候應(yīng)該反擊了 當(dāng)我看到@鄢得諼草 的那幾篇黑我黑到體無完膚的#極客愛情# @Phodal 故事的時(shí)候,我發(fā)現(xiàn)我竟無言以對(duì)?;蛟S,作為一名程序員,我們或多或少都有這樣的共性。 ...
摘要:平均每月孵化個(gè)頁面的全視角覆蓋范圍業(yè)務(wù)支持周年慶,旅游節(jié),營(yíng)銷,專題,主題游,頻道頁涉及品類跟團(tuán),自助自駕門票當(dāng)?shù)鼐频旰炞C機(jī)票金融通信攻略玩法超級(jí)自由行下面請(qǐng)跟隨大喇叭,一睹運(yùn)營(yíng)播種機(jī)的前世今生。發(fā)布,支持超級(jí)自由行模塊配置。 序 人生短短幾個(gè)秋,不醉不罷休。 CMS即將迎來2周歲生日,服務(wù)期間生產(chǎn)了*2200+*個(gè)內(nèi)容頁面。(平均每月孵化100個(gè)頁面) CMS的全視角: 覆蓋范圍(...
摘要:平均每月孵化個(gè)頁面的全視角覆蓋范圍業(yè)務(wù)支持周年慶,旅游節(jié),營(yíng)銷,專題,主題游,頻道頁涉及品類跟團(tuán),自助自駕門票當(dāng)?shù)鼐频旰炞C機(jī)票金融通信攻略玩法超級(jí)自由行下面請(qǐng)跟隨大喇叭,一睹運(yùn)營(yíng)播種機(jī)的前世今生。發(fā)布,支持超級(jí)自由行模塊配置。 序 人生短短幾個(gè)秋,不醉不罷休。 CMS即將迎來2周歲生日,服務(wù)期間生產(chǎn)了*2200+*個(gè)內(nèi)容頁面。(平均每月孵化100個(gè)頁面) CMS的全視角: 覆蓋范圍(...
程序員愛情?520/表白/七夕情人節(jié)/求婚?專用html5+css3+js 生日快樂網(wǎng)站模板 HTML生日快樂祝福網(wǎng)頁模板,該模板有多種動(dòng)態(tài)效果圖,全局采用藍(lán)色裝飾,適用于給女朋友的生日祝福,只需簡(jiǎn)單修改,即可用網(wǎng)頁生成打開。 戳下方鏈接↓查看線上演示地址 ??0.生日演示地址?? 賬號(hào)是 cyl 密碼是 1007 ??1.生日快樂????(多頁面html模板)★在線演示地址...
閱讀 2281·2021-09-07 09:58
閱讀 3470·2019-08-30 14:07
閱讀 1352·2019-08-29 12:32
閱讀 721·2019-08-29 11:06
閱讀 3744·2019-08-26 18:18
閱讀 3807·2019-08-26 17:35
閱讀 1438·2019-08-26 11:35
閱讀 669·2019-08-26 11:35