JavaScript圖形實例:Levy曲線及其變形

来源:https://www.cnblogs.com/cs-whut/archive/2020/07/03/13229512.html
-Advertisement-
Play Games

Levy曲線是將一條線段不停地分形成兩條長度相等且相互垂直的線段而生成的。Levy分形的最後很像一個英文字母C,所以也稱它為C曲線。 Levy曲線的生成示意如圖1所示。 圖1 Levy曲線的生成 1.Levy曲線 Levy曲線採用遞歸過程易於實現,編寫如下的HTML代碼。 <!DOCTYPE htm ...


      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曲線 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • JavaScript中數組去重的幾種方法 正常情況下,數據去重的工作一般都是由後端同事來完成的,但是前端也要掌握好處理數據的能力,萬一去重的工作交給我們大前端處理,我們也不能慫呀。現在我總結了一些去重的方法,希望對大家有點幫助。 方法一:new Set()實現數組去重 ES6 提供了新的數據結構 S ...
  • CSS實現居中對齊的幾種方式 頁面佈局中,居中對齊是我們經常遇到的場景,現在總結幾個常用的方式供大家參考。 場景一:按鈕文字居中對齊,line-height + text-align html代碼: <div class="btn">Hello World</div> CSS代碼: .btn{ wi ...
  • 做一個簡易計算器,效果圖片 c表示清空,為一個空字元串 +/-表示該值為正還是負 %表示當前值/100 ←表示退格,往前刪除一個值 eval 函數是能夠計算出字元串表達式或者語句的結果,把結果求出來。 代碼如下 <!DOCTYPE html> <html> <head> <meta charset= ...
  • 我第一次直播寫代碼是在去年七月份。我想要直播一下我在業餘時間內為開源項目領域所做的工作,儘管在youtube上的大部分直播都是關於游戲的。我比較擅長於NodeJS的硬體庫方面的工作(儘管大部分項目都是自己的)。並且我在youtube上曾經開啟過一個房間了,那為什麼我不繼續做下去?我的欄目可以叫做:基 ...
  • 現在,Safari(技術預覽版106)和Firefox(版本78)的預覽版均支持新的CSS :is() 和 :where() 偽類。 Chrome的實施仍然落後。 使用 :is() 減少重覆 你可以使用 :is() 偽類來刪除選擇器列表中的重覆項。 /* BEFORE */ .embed .save ...
  • 接下來就好好介紹一下這七個開發調試工具,用起來是真的爽啊。建議收藏使用哦! Web瀏覽器中的開發工具 任何現代的 Web 瀏覽器都配有功能強大的工具來調試應用程式。 如使用控制台語句cconsole.log(),使用alert()的彈出視窗,還可以使用debugger語句暫停代碼執行,這些對於我們的 ...
  • 一、Why choose front-end 2012.07畢業後,進了一家游戲公司做運營策劃,寫過營銷方案、做過內容編輯、知道廣告投放和換量,還得兼職產品經理畫原型。 每天9.30-23.00以後,周末經常加班,像無頭蒼蠅一樣碰撞一年後,我沒有任何成就感,我開始思考自己每天做的是什麼,將來會做什麼 ...
  • 下麵是總結的css技巧,建議大家收藏,以後用的時候就不用到處查資料了。當然這些也不是所有的,大家如果有什麼好的css有趣樣式技巧也可以發出來哦 三角形 最常見的一種形狀了。切圖,不存在的。 /** 正三角 */ .triangle { width: 0; height: 0; border-styl ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...