Javascript遞歸繪製二叉樹

 

<html>
    <head>
        <title>標準二叉樹</title>
    </head>
    <body>
<!--        svg元素-->
        <svg id ="mySvg" width = 800 height = 600></svg>
        
        <script>
            //獲取屏幕寬度
            var w = window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth;
            
            //獲取屏幕高度
            var h = window.innerHeight||document.documentElement.clientHeight||document.body.clientHeight;
            
            //設置變量mysvg獲取svg元素
            var mysvg = document.getElementById("mySvg");
            
            //修改SVG的寬度
            mysvg.setAttribute("width",w*0.9);
            
            //修改SVG的高度
            mysvg.setAttribute("height",h*0.9);
       
            //起始長度
            var length = 200;
            
            //衰減係數
            var rate = 0.6;
            
            //第一截線段的起點爲x0爲屏幕一般,y0爲屏幕底端
            var x0 = w/2;
            var y0 = h;
            
            //迭代次數
            var count = 7;
            
            //我沒搞懂iter的作用是什麼
            var iter = 0;
            
            //定義遞歸二叉樹函數
            /*根據起點(x1,y1)和終點(x2,y2繪製一個線段,長度爲length,然後將終點作爲起點,並對直線旋轉一個角度angle,把線段長度衰減一個係數rate,根據旋轉角度和衰減係數,新的終點(x2,y2)可以通過計算得到。*/
            function show(x0,y0,length,rate,a,count){
                
//                var iter++;這行代碼會使屏幕一片空白,更改爲下面的形式後纔有所顯示

                var iter = iter + 1;
                
                //設置起點位置
                var x1 = x0;
                var y1 = y0;
                
                //設置終點,實際上我也不知道怎麼算的
                var x2 = x1+length*Math.cos(a);
                var y2 = y1+length*Math.sin(a);
                
                //創建線段svgline的節點document.createElement("line"),課本里沒有加上var。
                svgline = document.createElement("line");
                
                //mysvg的子節點爲svgline
                mysvg.appendChild(svgline);
                

                svgline.outerHTML="<line x1="+x1+" y1="+y1+" x2="+x2+" y2="+y2+" style='stroke:rgb(99,99,99);stroke-width:2' />"
//                svgline.outerHTML="<line x1="+x1+" y1="+y1+" x2="+x2+" y2="+y2+" stroke=rgb(99,99,99) stroke-width="+count+" />";
                
                //向左和向右旋轉的角度
                var aL = a - Math.PI/4;
                var aR = a + Math.PI/4;
                
                if(count>0){
                   
//                   我這裏打少了一個變量rate,難怪沒有出來樹枝的變化
                   show(x2,y2,length*rate,rate,aL,count-1);
                    
                    show(x2,y2,length*rate,rate,aR,count-1);
                }
            }
            
            //調用遞歸二叉樹函數
            show(x0,y0,length,rate,-Math.PI/2,count);
            
            
            
            
        </script>
    </body>
</html>

這幅圖的代碼應該是這樣的,只改變了向左和向右的旋轉角度,還有就是iter用來設置樹的顏色,但是不知道爲什麼我的電腦裏一直出不來這個圖。有沒有大佬能救命啊

<!DOCTYPE html> 
<html>
<!--在標準二叉樹上爲線段添加隨機部分-->
    <head>
        <meta charset="UTF-8">
        <title>角度隨機二叉樹</title>
    </head>
    
    <body>
        <!--        svg元素-->
        <svg id ="mySvg" width = 800 height = 600></svg>
        
        <script>
            
            //獲取屏幕寬度
            var w = window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth;
            
            //獲取屏幕高度
            var h = window.innerHeight||document.documentElement.clientHeight||document.body.clientHeight;
            
            //設置變量mysvg獲取svg元素
            var mysvg = document.getElementById("mySvg");
            
            //修改SVG的寬度
            mysvg.setAttribute("width",w*0.9);
            
            //修改SVG的高度
            mysvg.setAttribute("height",h*0.9);
            
            //起始長度
            var length = 200;
            
            //衰減係數
            var rate = 0.6;
            
            //第一截線段的起點爲x0爲屏幕一般,y0爲屏幕底端
            var x0 = w/2;
            var y0 = h;
            
            //迭代次數
            var count = 7;
            
            var iter = 0;
            
            //定義遞歸二叉樹函數
            /*根據起點(x1,y1)和終點(x2,y2繪製一個線段,長度爲length,然後將終點作爲起點,並對直線旋轉一個角度angle,把線段長度衰減一個係數rate,根據旋轉角度和衰減係數,新的終點(x2,y2)可以通過計算得到。*/
            function show(x0,y0,length,rate,a,count){
                
                //var iter++;這行代碼會使屏幕一片空白,更改爲下面的形式後纔有所顯示
                var iter = iter + 1;
                
                var x1 = x0;
                var y1 = y0;
                
                var x2 = x1+length*(0.5+0.5*Math.random())*Math.cos(a);
                
                var y2 = y1+length*(0.5+0.5*Math.random())*Math.sin(a);
                
                
                //創建線段svgline的節點document.createElement("line"),課本里沒有加上var。
                svgline = document.createElement("line");
                
                //mysvg的子節點爲svgline
                mysvg.appendChild(svgline);
                
                svgline.outerHTML="<line x1="+x1+" y1="+y1+" x2="+x2+" y2="+y2+" style='stroke:rgb(0,"(+iter+)",0);stroke-width:"(+count+)"' />"
                
                var aL = a-Math.PI/4*(0.5+0.5*Math.random());
                
                var aR = a-Math.PI/4*(0.5+0.5*Math.random());
                
                if(count>0){
                    show(x2,y2,length*rate,rate,aL,count-1);
                    
                    show(x2,y2,length*rate,rate,aR,count-1);
                }
            }
            
            show(x0,y0,length,rate,-Math.PI/2,count);
        </script>
    </body>
</html>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章