整合營銷服務商

          電腦端+手機端+微信端=數(shù)據(jù)同步管理

          免費咨詢熱線:

          少兒學編程系列-使用python turtle畫基本

          少兒學編程系列-使用python turtle畫基本圖形

          urtle簡介

          turtle(海龜)繪圖很適合用來引導少兒學習編程,通過簡單的命令,可以輕松地繪制出精美的形狀和圖案。

          常用命令介紹

          更多命令可以參見:https://docs.python.org/zh-cn/3/library/turtle.html#introduction

          forward() | fd() 前進
          backward() | bk() | back() 后退
          right() | rt() 右轉(zhuǎn)
          left() | lt() 左轉(zhuǎn)
          goto() | setpos() | setposition() 前往/定位
          setx() 設置x坐標
          sety() 設置y坐標
          setheading() | seth() 設置朝向
          home() 返回原點
          circle() 畫圓
          dot() 畫點
          stamp() 印章
          clearstamp() 清除印章
          clearstamps() 清除多個印章
          undo() 撤消
          speed() 速度

          畫基本圖形的效果

          畫基本圖形的代碼

          lb gltf模型(webvrmodel)-gltf模型下載定制,glb模型下載定制,三維項目電商網(wǎng)站在線三維展示,usdz格式,vr模型網(wǎng),網(wǎng)頁VR模型下載,三維模型下載,webgl網(wǎng)頁模型下載

          我們下面會學習使用直線畫一個網(wǎng)格出來,為了更好的理解這個網(wǎng)格在空間中的位置,我們是時候,講一講空間坐標系了。

          1、右手坐標系

          Threejs使用的是右手坐標系,這源于opengl默認情況下,也是右手坐標系。下面是右手坐標系的圖例,如果對這個概念不理解,可以百度一下,我保證你伸出手比劃的那一瞬間你就明白了,如果不明白請給作者留言,我會盡快補上關(guān)于坐標系的知識。

          圖中右邊那個手對應的坐標系,就是右手坐標系。在Threejs中,坐標和右邊的坐標完全一樣。x軸正方向向右,y軸正方向向上,z軸由屏幕從里向外。

          5、線條的深入理解

          在Threejs中,一條線由點,材質(zhì)和顏色組成。

          點由THREE.Vector3表示,Threejs中沒有提供單獨畫點的函數(shù),它必須被放到一個THREE.Geometry形狀中,這個結(jié)構(gòu)中包含一個數(shù)組vertices,這個vertices就是存放無數(shù)的點(THREE.Vector3)的數(shù)組。這個表示可以如下圖所示:

          為了繪制一條直線,首先我們需要定義兩個點,如下代碼所示:

          var p1=new THREE.Vector3( -100, 0, 100 );


          var p2=new THREE.Vector3( 100, 0, -100 );

          請大家思考一下,這兩個點在坐標系的什么位置,然后我們聲明一個THREE.Geometry,并把點加進入,代碼如下所示:

          var geometry=new THREE.Geometry();


          geometry.vertices.push(p1);


          geometry.vertices.push(p2);

          geometry.vertices的能夠使用push方法,是因為geometry.vertices是一個數(shù)組。這樣geometry 中就有了2個點了。

          然后我們需要給線加一種材質(zhì),可以使用專為線準備的材質(zhì),THREE.LineBasicMaterial。

          最終我們通過THREE.Line繪制了一條線,如下代碼所示:

          var line=new THREE.Line( geometry, material, THREE.LinePieces );

          ok,line就是我們要的線條了。

          6、畫高中時深愛的坐標平面

          我還深愛著高中時的那個坐標平面,它勾起了我關(guān)于前排同學的細細長發(fā)的回憶…

          這個平面的效果如下所示,截圖不完整哦:

          它橫豎分別繪制了20條線段,在攝像機的照射下,就形成了這般模樣。你可以在[初級教程\chapter2-2.html]發(fā)現(xiàn)這些代碼:

          <!DOCTYPE html>

          <html>

          <head>

          <meta charset="UTF-8">

          <title>Three框架</title>

          <script src="js/Three.js"></script>

          <style type="text/css">

          div#canvas-frame {

          border: none;

          cursor: pointer;

          width: 100%;

          height: 600px;

          background-color: #EEEEEE;

          }


          </style>

          <script>

          var renderer;

          function initThree() {

          width=document.getElementById('canvas-frame').clientWidth;

          height=document.getElementById('canvas-frame').clientHeight;

          renderer=new THREE.WebGLRenderer({

          antialias : true

          });

          renderer.setSize(width, height);

          document.getElementById('canvas-frame').appendChild(renderer.domElement);

          renderer.setClearColor(0xFFFFFF, 1.0);

          }


          var camera;

          function initCamera() {

          camera=new THREE.PerspectiveCamera(45, width / height, 1, 10000);

          camera.position.x=0;

          camera.position.y=1000;

          camera.position.z=0;

          camera.up.x=0;

          camera.up.y=0;

          camera.up.z=1;

          camera.lookAt({

          x : 0,

          y : 0,

          z : 0

          });

          }


          var scene;

          function initScene() {

          scene=new THREE.Scene();

          }


          var light;

          function initLight() {

          light=new THREE.DirectionalLight(0xFF0000, 1.0, 0);

          light.position.set(100, 100, 200);

          scene.add(light);

          }


          var cube;

          function initObject() {

          var geometry=new THREE.Geometry();

          geometry.vertices.push( new THREE.Vector3( - 500, 0, 0 ) );

          geometry.vertices.push( new THREE.Vector3( 500, 0, 0 ) );


          for ( var i=0; i <=20; i ++ ) {


          var line=new THREE.Line( geometry, new THREE.LineBasicMaterial( { color: 0x000000, opacity: 0.2 } ) );

          line.position.z=( i * 50 ) - 500;

          scene.add( line );


          var line=new THREE.Line( geometry, new THREE.LineBasicMaterial( { color: 0x000000, opacity: 0.2 } ) );

          line.position.x=( i * 50 ) - 500;

          line.rotation.y=90 * Math.PI / 180;

          scene.add( line );


          }

          }


          function threeStart() {

          initThree();

          initCamera();

          initScene();

          initLight();

          initObject();

          renderer.clear();

          renderer.render(scene, camera);

          }


          </script>

          </head>


          <body onload="threeStart();">

          <div id="canvas-frame"></div>

          </body>

          </html>

          畫網(wǎng)格關(guān)鍵之處initObject函數(shù)中,我們不浪費紙,但是浪費一些電,在下面重復一下上面的代碼:

          var cube;

          function initObject() {

          var geometry=new THREE.Geometry();

          // B begin

          geometry.vertices.push( new THREE.Vector3( - 500, 0, 0 ) );

          geometry.vertices.push( new THREE.Vector3( 500, 0, 0 ) );

          // B end


          for ( var i=0; i <=20; i ++ ) {


          var line=new THREE.Line( geometry, new THREE.LineBasicMaterial( { color: 0x000000, opacity: 0.2 } ) );

          line.position.z=( i * 50 ) - 500;

          scene.add( line );


          var line=new THREE.Line( geometry, new THREE.LineBasicMaterial( { color: 0x000000, opacity: 0.2 } ) );

          line.position.x=( i * 50 ) - 500;

          line.rotation.y=90 * Math.PI / 180;

          scene.add( line );


          }

          }

          思路:我們要畫一個網(wǎng)格的坐標,那么我們就應該找到線的點。把網(wǎng)格虛擬成正方形,在正方形邊界上找到幾個等分點,用這些點兩兩連接,就能夠畫出整個網(wǎng)格來。

          1、定義2個點

          在x軸上定義兩個點p1(-500,0,0),p2(500,0,0)。

          geometry.vertices.push( new THREE.Vector3( - 500, 0, 0 ) );


          geometry.vertices.push( new THREE.Vector3( 500, 0, 0 ) );

          2、算法

          這兩個點決定了x軸上的一條線段,將這條線段復制20次,分別平行移動到z軸的不同位置,就能夠形成一組平行的線段。

          同理,將p1p2這條線先圍繞y軸旋轉(zhuǎn)90度,然后再復制20份,平行于z軸移動到不同的位置,也能形成一組平行線。

          經(jīng)過上面的步驟,就能夠得到坐標網(wǎng)格了。代碼如下:

          for ( var i=0; i <=20; i ++ ) {


          var line=new THREE.Line( geometry, new THREE.LineBasicMaterial( { color: 0x000000, opacity: 0.2 } ) );

          line.position.z=( i * 50 ) - 500;

          scene.add( line );


          var line=new THREE.Line( geometry, new THREE.LineBasicMaterial( { color: 0x000000, opacity: 0.2 } ) );

          line.position.x=( i * 50 ) - 500;

          line.rotation.y=90 * Math.PI / 180; // 旋轉(zhuǎn)90度

          scene.add( line );


          }

          好了,本節(jié)課講完了,感覺自己寫了好久好久。要兼顧深度和初學者,確實有些困難。最后,希望您喜歡。

          用C語言實現(xiàn)二維,三維繪圖算法(2)-解析曲面的顯示

          ---- 引言----

          每次使用OpenGL或DirectX寫三維程序的時候, 都有一種隔靴搔癢的感覺, 對于內(nèi)部的三維算法的實現(xiàn)不甚了解. 其實想想, Win32中既然存在畫線畫點函數(shù), 利用計算機圖形學的知識, 我們用可以用純C調(diào)用Win32實現(xiàn)三維繪圖, 完全不用借助OpenGL和DirectX, 這有重復造輪子的嫌疑, 但是自己動手實現(xiàn)一遍, 畢竟也是有意義的.

          [效果演示]

          原始效果(100條浮動曲線)

          加密以后的效果(200條浮動曲線)

          [浮動水平線法繪圖過程]

          固定一個y值按步長變換給定一個x值, 從而可計算出平面截線一個點的z坐標值. 將改點投影到xoy平面上, 然后再變換到屏幕上. 如果是曲線端點要填充邊界值. 接著檢驗此點的可見性,并用1表示上方可見, 0表示不可見, -1表示下方可見. 可見性檢測就是用當前點的y值與上下浮動水平線數(shù)組中相應的元素值進行比較,y值大于上水平線數(shù)組中元素值或小于下水平線數(shù)組中元素值, 則當前點可見, 否則不可見. 往下再計算同一平面截線的另一點, 和上面點一樣, 先投影到坐標平面上, 再變換到屏幕上. 先前的點叫緊前點, 當前的點為當前點. 緊前點和當前點的可見性主要有下面一些可能情形:

          [編程實現(xiàn)要點]

          曲面函數(shù)的定義

          float SurfaceFun(float X, float Y)
          {
              float w1, w2, w3, FV;
              w1=4*(X-2)*(X-2) + (Y-4)*(Y-4) - 1;
              w2=(X-5)*(X-5)/9 + 4*(Y-2)*(Y-2) - 1;
              w3=(X-5)*(X-5)/9 + 4*(Y-6)*(Y-6) - 1;
              
              if(w1>85) w1=85;
              if(w2>85) w2=85;
              if(w3>85) w3=85;    
              
              FV=w1*w1*exp(-w1) + w2*w2*exp(-w2) + w3*w3*exp(-w3);
              
              return(FV);
              
          }

          繪制曲面函數(shù)

          void DrawSurface()
          {
              int Xe, Ye, Ln, Pt, XPre, YPre, XCur, YCur, Xi, Yi;
              int *pi, LimY, VisCur, VisPre;
              float X, Y, Z;
              
              LimY=GetWindowHeight();
              SetLineColor(BLUE); 
          
              for(Ln=0; Ln<=LNo; ++Ln)
              {
                  Y=Y2-Ln*IncY;
                  X=X1;
                  Z=SurfaceFun(X,Y);
                  CalcuProject(X, Y, Z);
                  XPre=0.5 + (XProj-F1)*EchX + C1;
                  YPre=0.5 + (YProj-F3)*EchY + C3;
                  
                  FillEdge(XPre, YPre, Xd, Yd);
                  
                  VisPre=VisibilityTest(XPre, YPre);
                  
                  for(Pt=0; Pt<=PNo; ++Pt)
                  {
                      X=X1+Pt*IncX;
                      Z=SurfaceFun(X,Y);
                      CalcuProject(X, Y, Z);
                      XCur=0.5 + (XProj-F1)*EchX + C1;
                      YCur=0.5 + (YProj-F3)*EchY + C3;
                      VisCur=VisibilityTest(XCur, YCur);
                      
                      if( (HMax[XCur]==0) || (HMin[XCur]==LimY) ) VisCur=VisPre;
                      
                      if(VisCur==VisPre)
                      {
                          if( (VisCur==1) || (VisCur==-1) )
                          {
                              if(0<=XCur)
                                  PlotLine(XPre, LimY-60-YPre, Xi, LimY-60-YCur);
                              else if(0<=YCur)
                                  PlotLine(XPre, LimY-60-YPre, XPre, LimY-60-YCur);
                              else
                                  PlotLine(Xi, LimY-60-YPre, XPre, LimY-60-YPre);
                              
                              HorizonInc(XPre, YPre, XCur, YCur);
                          }
                      }
                      else    // VisCur!=VisPre
                      {
                          if(VisCur==0)
                          {
                              if(VisPre==1)
                              {
                                  pi=Inter(XPre, YPre, XCur, YCur, HMax);
                                  Xi=*pi;
                                  Yi=*(pi+1);
                              }
                              else
                              {
                                  pi=Inter(XPre, YPre, XCur, YCur, HMin);
                                  Xi=*pi;
                                  Yi=*(pi+1);
                              }
                              
                              if(0<=Xi)
                                  PlotLine(XPre, LimY-60-YPre, Xi, LimY-60-Yi);
                              else if(0<=Yi)
                                  PlotLine(XPre, LimY-60-Yi, XPre, LimY-60-Yi);
                              else
                                  PlotLine(XPre, LimY-60-YPre, XPre, LimY-60-YPre);
                              
                              HorizonInc(XPre, YPre, Xi, Yi);
                          }
                          else    
                          {
                              if(VisCur==1)
                              {
                                  if(VisPre==0)  
                                  {
                                      pi=Inter(XPre, YPre, XCur, YCur, HMax);
                                      Xi=*pi;
                                      Yi=*(pi+1);  
                                      
                                      if(0<=Xi)
                                          PlotLine(Xi, LimY-60-Yi, XCur, LimY-60-YCur);       
                                      else if(0<=Yi)
                                          PlotLine(XCur, LimY-60-YCur, XCur, LimY-60-YCur);
                                      else
                                          PlotLine(XCur, LimY-60-YCur, XCur, LimY-60-YCur);
                                      
                                      HorizonInc(Xi, Yi, XCur, YCur);   
                                  }
                                  else   
                                  {
                                      pi=Inter(XPre, YPre, XCur, YCur, HMin);
                                      Xi=*pi;
                                      Yi=*(pi+1);  
                                      
                                      if(0<=Xi)
                                          PlotLine(XPre, LimY-60-YPre, Xi, LimY-60-Yi);       
                                      else if(0<=Yi)
                                          PlotLine(XPre, LimY-60-YPre, XPre, LimY-60-Yi);
                                      else
                                          PlotLine(XPre, LimY-60-YPre, XPre, LimY-60-YPre);
                                      
                                      HorizonInc(XPre, YPre, Xi, Yi);    
                                      
                                      pi=Inter(XPre, YPre, XCur, YCur, HMax);
                                      Xi=*pi;
                                      Yi=*(pi+1);  
                                      
                                      if(0<=Xi)
                                          PlotLine(Xi, LimY-60-YCur, XCur, LimY-60-YCur);       
                                      else if(0<=Yi)
                                          PlotLine(XCur, LimY-60-Yi, XCur, LimY-60-YCur);
                                      else
                                          PlotLine(XCur, LimY-60-YCur, XCur, LimY-60-YCur);
                                      
                                      HorizonInc(Xi, Yi, XCur, YCur);
                                  }
                              }
                              else    // VisCur!=0, VisCur!=1
                              {
                                  if(VisPre==0)  
                                  {
                                      pi=Inter(XPre, YPre, XCur, YCur, HMin);
                                      Xi=*pi;
                                      Yi=*(pi+1);  
                                      
                                      if(0<=Xi)
                                          PlotLine(Xi, LimY-60-YCur, XCur, LimY-60-YCur); 
                                      else if(0<=Yi)
                                          PlotLine(XCur, LimY-60-Yi, XCur, LimY-60-YCur);
                                      else
                                          PlotLine(XCur, LimY-60-YCur, XCur, LimY-60-YCur);
                                      
                                      HorizonInc(Xi, Yi, XCur, YCur);   
                                  }
                                  else    // VisCur!=0, VisCur!=1, VisPre!=0
                                  {
                                      pi=Inter(XPre, YPre, XCur, YCur, HMax);
                                      Xi=*pi;
                                      Yi=*(pi+1);  
                                      
                                      if(0<=Xi)
                                          PlotLine(XPre, LimY-60-YPre, Xi, LimY-60-Yi);      
                                      else if(0<=Yi)
                                          PlotLine(XPre, LimY-60-YPre, XPre, LimY-60-Yi);
                                      else
                                          PlotLine(XPre, LimY-60-YPre, XPre, LimY-60-YPre);
                                      
                                      HorizonInc(XPre, YPre, Xi, Yi);    
                                      
                                      pi=Inter(XPre, YPre, XCur, YCur, HMin);
                                      Xi=*pi;
                                      Yi=*(pi+1);  
                                      
                                      if(0<=Xi)
                                          PlotLine(Xi, LimY-60-Yi, XCur, LimY-60-YCur);      
                                      else
                                          PlotLine(XCur, LimY-60-YCur, XCur, LimY-60-YCur);
                                      
                                      HorizonInc(Xi, Yi, XCur, YCur);
                                  }                        
                              }
                          }
                      }
                      
                      VisPre=VisCur;
                      XPre=XCur;
                      YPre=YCur;
                  }
                  
                  FillEdge(XCur, YCur, Xg, Yg);
              }
          }

          原文:https://www.cnblogs.com/chinamming/p/3427442.html


          主站蜘蛛池模板: 无码人妻精品一区二区蜜桃百度| 精品国产免费一区二区| 在线不卡一区二区三区日韩| 国产在线视频一区二区三区98| 蜜臀AV在线播放一区二区三区| 成人精品一区二区不卡视频| 精品国产一区二区三区久久 | 中文人妻av高清一区二区| 一区二区亚洲精品精华液| 精品aⅴ一区二区三区| 在线观看一区二区精品视频| 麻豆AV一区二区三区久久| 亚洲爽爽一区二区三区| 无码一区二区三区亚洲人妻| 中文字幕视频一区| 日韩精品成人一区二区三区| 国产91一区二区在线播放不卡| 久久蜜桃精品一区二区三区| 奇米精品视频一区二区三区| 日本大香伊一区二区三区| 高清一区高清二区视频| 精品国产一区二区麻豆| 亚洲AV无码一区二区一二区| 国产高清在线精品一区| 亚洲日本va午夜中文字幕一区| 亚洲第一区在线观看| 天天看高清无码一区二区三区| 国产精品99精品一区二区三区| 亚洲av乱码一区二区三区 | 一区二区三区免费视频观看| 国产成人免费一区二区三区| 日本无码一区二区三区白峰美| 亚洲一区中文字幕在线观看| 亚洲一区二区三区四区在线观看| 亚洲乱码一区二区三区在线观看| 国产日韩AV免费无码一区二区三区| 琪琪see色原网一区二区| 精品在线视频一区| 日本精品少妇一区二区三区| 福利一区在线视频| 日韩精品一区二区三区在线观看|