例えば、JavaScriptのパターン:パターン変換及び環状セクター変換

1.1部門変換

        図1に示す上側パターンは、セクタ変換変換と呼ばれる下位セクタの矩形パターンに変換されます。

        任意の点Pにおける矩形パターンを設けた。1(X- 1、Y 。1)ファンパターンP上の点に変換され、2(X- 2、Y 2)、長方形の長さX、セクタの中心座標(X- 0、Y 0)セクタ半径L、Bなどの扇形のX軸の最小角度、セクタCの円弧角に対応する、P点2を座標として計算されます。

            X 2 =(L + Y 1)* COS(I)+ X 0

            Y 2 = - (L + Y 1)* SIN(I)+ Y 0

        ここで、θ= C *(XX 1)/ X- 1 + B

 

セクタ変換図1

        基本的な6つの花のパターンデータを生成し、セクタの指定された数を変換するための基本的なパターン、の8つの矩形パターンの6。

        下の書き込みHTMLコード。

<!DOCTYPE HTML>

<ヘッド>

<タイトル>部門の変革</ TITLE>

ます。<script type = "text / javascriptの">

  関数drawBase(ID)

  {

     VARキャンバス=のdocument.getElementById(ID)。

     (キャンバス== null)の場合

        falseを返します。

     VARコンテキスト= canvas.getContext( '2D');

     context.fillStyle = "#1 EEEEFF"。

     context.fillRect(0,0,700,100)。

     context.fillStyle =「黄色」。

     context.strokeStyle =「赤」。

     context.lineWidth = 2。

     context.beginPath();

     あなたがにMath.PI / 64 =でした。

     VAR X =新しいArray();

     VaRのY =新しいアレイ();

     W = 80。

     //データ6つの花のパターンを生成します

     (; I <= 128; I ++ varがI = 0)するため

     {

          D = W / 2 *(0.8 + Math.sin * I * DIG(18)/ 10)* 1.2。

          T = D *(0.5 + Math.sin(6 * I * DIG)/ 2)。

          X [I] = T * Math.cos(I * DIG)。

          Y [I] = T * Math.sin(I * DIG)。

     }

     //横一列に8つの6花模様を描きます

     ため(N = 1、N <= 8; N ++)

     {

          PX =(2 * N-1)/ 2 * 30 + W。

          ための式(I 0 =; I <= 128; I ++)

          {

             X1 = PX + X [i]は、

             Y1 = / 2-Y W [i]は、

             (私は== 0)の場合

             {

                context.moveTo(X1、Y1);

                BX = X1; よる= Y1;

             }

             そうしないと

                context.lineTo(X1、Y1);

          }

      }

      context.lineTo(BX、によります)。

      context.closePath();

      context.stroke();

      context.fill();

  }

  関数drawSector(ID)

  {

     VARキャンバス=のdocument.getElementById(ID)。

     (キャンバス== null)の場合

        falseを返します。

     VARコンテキスト= canvas.getContext( '2D');

     context.fillStyle = "#1 EEEEFF"。

     context.fillRect(0,0,700,500)。

     context.fillStyle =「黄色」。

     context.strokeStyle =「赤」。

     context.lineWidth = 2。

     context.beginPath();

     あなたがにMath.PI / 64 =でした。

     W = 80。       

     VAR X =新しいArray();

     VaRのY =新しいアレイ();

     //データ6つの花のパターンを生成します

     (; I <= 128; I ++ varがI = 0)するため

     {

          D = W / 2 *(0.8 + Math.sin * I * DIG(18)/ 10)* 1.2。

          T = D *(0.5 + Math.sin(6 * I * DIG)/ 2)。

          X [I] = T * Math.cos(I * DIG)。

          Y [I] = T * Math.sin(I * DIG)。

     }

     VaRのK =評価(document.myForm.levelNum.value)。

     もし(K <1 || K> = 6){

        アラートが(「!ファンは、層数が1〜5のいずれかに設定する必要があります」);

        リターン;

     }

     //多重セクターの変革

     L = 100。B =にMath.PI / 3。C =にMath.PI / 3。X0 = 350。Y0 = 500;

     用(M = 1、M <= K; M ++)

       ため(N = 1、N <= 8; N ++)

         (; I <= 128; I ++ varがI = 0)するため

         {

            PX =(2 * N-1)/ 2 * W。 

            PY =(2 * M-1)/ 2 * W。

            X1 = PX + X [i]は、

            Y1 = PY-Y [i]は、

            第= C *(W * 8-X1)/(8 * W)+ B。

            X2 =(L + Y1)* Math.cos(TH)+ X0。

            Y2 = - (L + Y1)* Math.sin(TH)+ Y0。

            (私は== 0)の場合

            {

              context.moveTo(X2、Y2);

              BX = X2; よる= Y2。

            }

            そうしないと

              context.lineTo(X2、Y2);

          }

          context.lineTo(BX、によります)。

          context.closePath();

          context.stroke();

          context.fill();

  }

</ SCRIPT>

</ head>の

<本体のonload = "drawBase( 'myCanvas1');">

基本的なパターン<BR/>

<キャンバスのid =「myCanvas1」幅=「700」高さ=「100」>お使いのブラウザはキャンバスをサポートしていません!</キャンバス>

<フォーム名= "あるmyForm">

セクタレベルの基本パターンの数の<input type =数名=「levelNum」値= 4サイズ= 3>

<input type =ボタン値= "确定" のonClick = "drawSector( 'myCanvas2');">

</フォーム> <BR>

<キャンバスのid =「myCanvas2」幅=「700」高さ=「500」>お使いのブラウザはキャンバスをサポートしていません!</キャンバス>

</ BODY>

</ HTML>

        HTML形式のテキストファイルにHTMLコードを格納し、その後、値ボックス「5」、「基本パターンレベルのセクタ番号の」入力で、ブラウザでHTMLファイルを備え、このHTMLコードを開くには、「OK」ボタンをクリックしてください図に示すように、あなたは、部門を変換し、ブラウザウィンドウ層5に基本的な6つの花模様を見ることができます。

 

セクタ変換図2

1.2変換環状

        図3に示す上側変換変換と呼ばれる下部環状リング形状パターンの矩形ストライプパターンに変換されます。円ストリップチャートの互いに左右端部を置換し、したがって図リボンの上側部分が延伸されており、下部は圧縮されます。

        任意の点Pに設けられたストライプパターン1(X- 1、Y 。1)、点Pに環状パターンに変換され、2(X- 2、Y 2)、短冊長さXは、周期的パターンは、中心座標(ありますPX、PY)は、Lは、内側環状半径(L値、変換後のパターンの大きな変形)であり、点P 2を座標として計算されます。

             X 2 =(L + Y 1)* COS(θ)+ PX

            Y 2 = - (L + Y 1)* SIN(θ)+ PY

        ここで、θ= 2・π*(XX 1)/ X-

 

図3の環状変換します

        図に示すように、実質的に環状のパターンを変換する方法によれば、4は環状の変換であろう。

図4は、リングのための基本的なパターン変換であります

下の書き込みHTMLコード。

<!DOCTYPE HTML>

<ヘッド>

<タイトル>環状変換</ TITLE>

ます。<script type = "text / javascriptの">

  関数draw1(ID)

  {

     VARキャンバス=のdocument.getElementById(ID)。

     if (canvas==null)

        return false;

     var context=canvas.getContext('2d');

     context.fillStyle="#EEEEFF";

     context.fillRect(0,0,800,500);

     context.fillStyle="yellow";

     context.strokeStyle="red";

     context.lineWidth=1;

     context.beginPath();

     var dig=Math.PI/64;

     var x=new Array();

     var y=new Array();

     var w=100;

     // 生成一个六瓣花型图案的数据

     for (var i=0;i<=128;i++)

     {

          d=w/2*(0.8+Math.sin(18*i*dig)/5)*1.2;

          t=d*(0.5+Math.sin(6*i*dig)/2);

          x[i]=t*Math.cos(i*dig);

          y[i]=t*Math.sin(i*dig);

     }

     // 在水平一行中绘制8个六瓣花型图案

     for (n=1;n<=8;n++)

     {

          px=(2*n-1)/2*w;

          for (i=0;i<=128;i++)

          {

             x1=px+x[i];

             y1=w/2-y[i];

             if (i==0)

             {

                context.moveTo(x1,y1);

                bx=x1;  by=y1;

             }

             else

                context.lineTo(x1,y1);

          }

      }

      context.lineTo(bx,by);

      context.closePath();

      context.stroke();

      context.fill();

  }

  function draw2(id)

  {

     var canvas=document.getElementById(id);

     if (canvas==null)

        return false;

     var context=canvas.getContext('2d');

     context.fillStyle="#EEEEFF";

     context.fillRect(0,0,800,500);

     context.fillStyle="yellow";

     context.strokeStyle="red";

     context.lineWidth=2;

     context.beginPath();

     var dig=Math.PI/64;

     var x=new Array();

     var y=new Array();

     var w=100;

     var l=80;

     // 生成一个六瓣花型图案的数据

     for (var i=0;i<=128;i++)

     {

          d=w/2*(0.8+Math.sin(18*i*dig)/5)*1.2;

          t=d*(0.5+Math.sin(6*i*dig)/2);

          x[i]=t*Math.cos(i*dig);

          y[i]=t*Math.sin(i*dig);

     }

     // 进行一重环形变换

     for (n=1;n<=8;n++)

         for (var i=0;i<=128;i++)

         {

            px=(2*n-1)/2*w;

            x1=px+x[i];

            y1=w/2+y[i];

            th=2*Math.PI*(w*8-x1)/(w*8);

            x2=(l+y1)*Math.cos(th)+400;

            y2=(l+y1)*Math.sin(th)+250;

            if (i==0)

            {

              context.moveTo(x2,y2);

              bx=x2;  by=y2;

            }

            else

              context.lineTo(x2,y2);

          }

          context.lineTo(bx,by);

          context.closePath();

          context.stroke();

          context.fill();

  }

  function draw3(id,k)

  {

     var canvas=document.getElementById(id);

     if (canvas==null)

        return false;

     var context=canvas.getContext('2d');

     context.fillStyle="#EEEEFF";

     context.fillRect(0,0,800,500);

     context.fillStyle="yellow";

     context.strokeStyle="red";

     context.lineWidth=2;

     context.beginPath();

     var dig=Math.PI/64;

     w=200/k;  l=0;      

     var x=new Array();

     var y=new Array();

     // 生成一个六瓣花型图案的数据

     for (var i=0;i<=128;i++)

     {

          d=w/2*(0.8+Math.sin(18*i*dig)/5)*1.2;

          t=d*(0.5+Math.sin(6*i*dig)/2);

          x[i]=t*Math.cos(i*dig);

          y[i]=t*Math.sin(i*dig);

     }

     // 进行多重环形变换

     for (m=1;m<=k;m++)

       for (n=1;n<=8;n++)

         for (var i=0;i<=128;i++)

         {

            px=(2*n-1)/2*w; 

            py=(2*m-1)/2*w;

            x1=px+x[i];

            y1=py-y[i];

            th=2*Math.PI*(w*8-x1)/(w*8);

            x2=(l+y1)*Math.cos(th)+400;

            y2=(l+y1)*Math.sin(th)+250;

            if (i==0)

            {

              context.moveTo(x2,y2);

              bx=x2;  by=y2;

            }

            else

              context.lineTo(x2,y2);

          }

          context.lineTo(bx,by);

          context.closePath();

          context.stroke();

          context.fill();

  }

</script>

</head>

<body>

<button onClick="draw1('myCanvas');">基本图案</button>&nbsp;&nbsp;

<button onClick="draw2('myCanvas');">环形变换</button>&nbsp;&nbsp;

<button onClick="draw3('myCanvas',2);">二重环形变换</button>&nbsp;&nbsp;

<button onClick="draw3('myCanvas',3);">三重环形变换</button>

<br/><br/>

<canvas id="myCanvas" width="800" height="500">您的浏览器不支持canvas!</canvas>

</body>

</html>

        将上述HTML代码保存到一个html文本文件中,再在浏览器中打开包含这段HTML代码的html文件,可以看到在浏览器窗口中,出现“基本图案”、“环形变换”、“二重环形变换”、“三重环形变换”这四个按钮,单击“基本图案”按钮,绘制出如图4所示的基本图案,单击“环形变换”,绘制出如图5所示的环形变换图案,单击“二重环形变换”,绘制出如图6所示的二重环形变换图案,单击“三重环形变换”,绘制出如图7所示的三重环形变换图案。

        

图5  环形变换图案

 

图6 二重环形变换图案

 

图7 三重环形变换图案 

        下面我们将上面的例子进行扩充,提供多种基本图案的选择,选择好基本图案后,进行环形变换。编写的HTML文件内容如下。

<!DOCTYPE html>

<head>

<title>可选择图案的环形变换</title>

<script type="text/javascript">

  // 定义保存基本图案数据的二维数组

  var x=new Array(10);

  var y=new Array(10);

  for (var i=0;i<10;i++)

  {

     x[i]=new Array(129);

     y[i]=new Array(129);

  }

  var sele=0;

  function initGraph()

  {

     var dig=Math.PI/64;

     var w=100;

     // 生成一个六瓣花型图案的数据

     for (var i=0;i<=128;i++)

     {

          d=10*Math.sin(8*(i*dig+Math.PI/16));

          x[0][i]=d*Math.cos(i*dig)+30*Math.cos(i*dig)*Math.cos(i*dig)*Math.cos(i*dig);

          y[0][i]=d*Math.sin(i*dig)+30*Math.sin(i*dig)*Math.sin(i*dig)*Math.sin(i*dig);

     }

     // 生成一个六瓣花型图案的数据

     for (var i=0;i<=128;i++)

     {

          d=w/2*(0.8+Math.sin(18*i*dig)/5)*1.2;

          t=d*(0.5+Math.sin(6*i*dig)/2);

          x[1][i]=t*Math.cos(i*dig);

          y[1][i]=t*Math.sin(i*dig);

     }

     // 生成一个六瓣花型图案的数据

     for (var i=0;i<=128;i++)

     {

          d=35*Math.sqrt(Math.abs(Math.cos(3*i*dig)));

          t=d+10*Math.sqrt(Math.abs(Math.cos(9*i*dig)));

          x[2][i]=t*Math.cos(i*dig)*1.2;

          y[2][i]=t*Math.sin(i*dig);

     }

  }

  initGraph();

  function seleShape()

  {

      sele=document.frm.shape.selectedIndex-1;

      drawBase('myCanvas');

  }

  function drawBase(id)

  {

     var canvas=document.getElementById(id);

     if (canvas==null)

        return false;

     var context=canvas.getContext('2d');

     context.fillStyle="#EEEEFF";

     context.fillRect(0,0,800,500);

     context.fillStyle="yellow";

     context.strokeStyle="red";

     context.lineWidth=1;

     context.beginPath();

     var dig=Math.PI/64;

     var w=100;

     // 在水平一行中绘制8个基本花型图案

     for (n=1;n<=8;n++)

     {

          px=(2*n-1)/2*w;

          for (i=0;i<=128;i++)

          {

             x1=px+x[sele][i];

             y1=w/2-y[sele][i];

             if (i==0)

             {

                context.moveTo(x1,y1);

                bx=x1;  by=y1;

             }

             else

                context.lineTo(x1,y1);

          }

      }

      context.lineTo(bx,by);

      context.closePath();

      context.stroke();

      context.fill();

  }

  function drawRound(id,k)

  {

     var canvas=document.getElementById(id);

     if (canvas==null)

        return false;

     var context=canvas.getContext('2d');

     context.fillStyle="#EEEEFF";

     context.fillRect(0,0,800,500);

     context.fillStyle="yellow";

     context.strokeStyle="red";

     context.lineWidth=2;

     context.beginPath();

     var dig=Math.PI/64;

     w=80;  l=10;      

     // 进行多重环形变换

     for (m=1;m<=k;m++)

       for (n=1;n<=10;n++)

         for (var i=0;i<=128;i++)

         {

            px=(2*n-1)/2*w; 

            py=(2*m-1)/2*w;

            x1=px+x[sele][i];

            y1=py-y[sele][i];

            th=2*Math.PI*(w*10-x1)/(w*10);

            x2=(l+y1)*Math.cos(th)+400;

            y2=(l+y1)*Math.sin(th)+250;

            if (i==0)

            {

              context.moveTo(x2,y2);

              bx=x2;  by=y2;

            }

            else

              context.lineTo(x2,y2);

          }

          context.lineTo(bx,by);

          context.closePath();

          context.stroke();

          context.fill();

  }

</script>

</head>

<body>

<form name="frm">基本图案选择:

<select name="shape" onchange="seleShape();">

<option value="图案1">--请选择--</option>

<option value="图案1">图案1</option>

<option value="图案2">图案2</option>

<option value="图案3">图案3</option>

</select>

</form>

<button onClick="drawRound('myCanvas',1);">环形变换</button>&nbsp;&nbsp;

<button onClick="drawRound('myCanvas',2);">二重环形变换</button>&nbsp;&nbsp;

<button onClick="drawRound('myCanvas',3);">三重环形变换</button>

<br/><br/>

<canvas id="myCanvas" width="800" height="500">您的浏览器不支持canvas!</canvas>

</body>

</html>

        将上述HTML代码保存到一个html文本文件中,再在浏览器中打开包含这段HTML代码的html文件,可以看到在浏览器窗口中,出现“基本图案选择”下拉列表框,提供三种基本图案的选择,还有“环形变换”、“二重环形变换”、“三重环形变换”这三个命令按钮。选定“基本图案”后,单击某个按钮,绘制出基本图案的相应环形变换图案。整个演示过程录屏后展示如图8所示。

 

图8  可选择图案的环形变换

おすすめ

転載: www.cnblogs.com/cs-whut/p/12083053.html
おすすめ