HTML5・3次元リサジュー曲線

x軸方向の振幅:Ax
y軸方向の振幅:Ay
z軸方向の振幅:Az
x軸方向の周波数:ωx
y軸方向の周波数:ωy
z軸方向の周波数:ωz
x軸方向の位相:θx [deg]
y軸方向の位相:θy [deg]
z軸方向の位相:θz [deg]
3次元リサジュー曲線の色:





お持ち帰りコーナー

「PNG画像を保存する」ボタンを押すと、以下に画像が生成される。



解説

3次元リサジュー曲線を表す式は、
xAx sin (ωx tθx)
yAy sin (ωy tθy)
zAz sin (ωz tθz)
と書ける。




ソースコード

lissajous3d.html

<form><!-- getElementByIdを使用する為、name属性を指定しない -->
<table border="5" style="margin-left:auto;margin-right:auto;text-align:center;">
  <tr>
    <td style="text-align:center" bgcolor="#000000" rowspan="11">
      <canvas id="lissajous3d" width="500" height="500"></canvas></td>
    <td style="text-align:right"><i>x</i>軸方向の振幅:<i>A<sub>x</sub></i>=</td>
    <td style="text-align:left"><input type="text" id="ampx" value="100"></td>
  </tr>
  <tr>
    <td style="text-align:right"><i>y</i>軸方向の振幅:<i>A<sub>y</sub></i>=</td>
    <td style="text-align:left"><input type="text" id="ampy" value="100"></td>
  </tr>
  <tr>
    <td style="text-align:right"><i>z</i>軸方向の振幅:<i>A<sub>z</sub></i>=</td>
    <td style="text-align:left"><input type="text" id="ampz" value="100"></td>
  </tr>
  <tr>
    <td style="text-align:right"><i>x</i>軸方向の周波数:<i>&omega;<sub>x</sub></i>=</td>
    <td style="text-align:left"><input type="text" id="omegax" value="1"></td>
  </tr>
  <tr>
    <td style="text-align:right"><i>y</i>軸方向の周波数:<i>&omega;<sub>y</sub></i>=</td>
    <td style="text-align:left"><input type="text" id="omegay" value="1"></td>
  </tr>
  <tr>
    <td style="text-align:right"><i>z</i>軸方向の周波数:<i>&omega;<sub>z</sub></i>=</td>
    <td style="text-align:left"><input type="text" id="omegaz" value="1"></td>
  </tr>
  <tr>
    <td style="text-align:right"><i>x</i>軸方向の位相:<i>&theta;<sub>x</sub></i>=</td>
    <td style="text-align:left"><input type="text" id="thetax" value="0">[deg]</td>
  </tr>
  <tr>
    <td style="text-align:right"><i>y</i>軸方向の位相:<i>&theta;<sub>y</sub></i>=</td>
    <td style="text-align:left"><input type="text" id="thetay" value="0">[deg]</td>
  </tr>
  <tr>
    <td style="text-align:right"><i>z</i>軸方向の位相:<i>&theta;<sub>z</sub></i>=</td>
    <td style="text-align:left"><input type="text" id="thetaz" value="0">[deg]</td>
  </tr>
  <tr>
    <td style="text-align:right">3次元リサジュー曲線の色:</td>
    <td style="text-align:left">
      <select id="linecolor">
        <option value="#00ffff" style="background-color:#00ffff;" selected>cyan</option>
        <option value="#00ff00" style="background-color:#00ff00;">lime</option>
        <option value="#ff00ff" style="background-color:#ff00ff;">magenta</option>
        <option value="#ffa500" style="background-color:#ffa500;">orange</option>
        <option value="#ffff00" style="background-color:#ffff00;">yellow</option>
      </select>
    </td>
  </tr>
  <tr>
    <td style="text-align:center" colspan="2">
      <input type="button" value="軌跡を描画する" onclick="lissajous3d()"
       style="width:200px;height:50px;background-color:#000000;color:#00ffff;"><br>
      <input type="button" value="PNG画像を保存する" onclick="saveasPNG()"
       style="width:200px;height:50px;background-color:#000000;color:#00ffff;"><br>
    </td>
  </tr>
</table>
</form>

lissajous3d.js

// グローバル変数
var cvs; // canvas要素のオブジェクトを取得する為の変数
var cnt; // コンテキストを取得する為の変数

var w = 500; // canvasの横幅
var h = 500; // canvasの高さ
var hw = 250; // canvasの横幅の半値幅
var hh = 250; // canvasの高さの半値幅
var linecolor = "#00ffff"; // リサジュー図形の描画色を表す変数を初期値と共に宣言

var ampx = 100, ampy = 100, ampz = 100; // 【変更】x軸方向及び、y軸方向、z軸方向の振幅を表す変数を初期値と共に宣言
var omegax = 1, omegay = 1, omegaz = 1; // 【変更】x軸方向及び、y軸方向、z軸方向の周波数を表す変数を初期値と共に宣言
var thetax = 0, thetay = 0, thetaz = 0; // 【変更】x軸方向及び、y軸方向、z軸方向の位相を表す変数を初期値と共に宣言
var t = 0, dt = 1.0; // 時刻及び、時間の刻み幅を表す変数を初期値と共に宣言
var xi, yi, zi, xf, yf, zf; // 【変更】始点及び終点のx座標、y座標、z座標を宣言
var xidraw, xfdraw, yidraw, yfdraw; // 【追加】描画用の変数を宣言

window.onload = function(){
  cvs = document.getElementById("lissajous3d"); // canvas要素のオブジェクトを取得
  cnt = cvs.getContext("2d"); // コンテキストを取得

  setup(); // 初期化処理(背景色と軸の描画を含む)
};

// 初期化処理をまとめた関数(背景色と軸の描画を含む)
var setup = function(){
  ampx = parseFloat(document.getElementById("ampx").value);
  ampy = parseFloat(document.getElementById("ampy").value);
  ampz = parseFloat(document.getElementById("ampz").value); // 【追加】
  // 【追加】x軸方向及び、y軸方向、z軸方向の振幅をテキストフィールドの文字列を実数化して取得
  omegax = parseFloat(document.getElementById("omegax").value);
  omegay = parseFloat(document.getElementById("omegay").value);
  omegaz = parseFloat(document.getElementById("omegaz").value); // 【追加】
  // 【追加】x軸方向及び、y軸方向、z軸方向の周波数をテキストフィールドの文字列を実数化して取得
  thetax = parseFloat(document.getElementById("thetax").value);
  thetay = parseFloat(document.getElementById("thetay").value);
  thetaz = parseFloat(document.getElementById("thetaz").value); // 【追加】
  // 【追加】x軸方向及び、y軸方向、z軸方向の位相をテキストフィールドの文字列を実数化して取得

  linecolor = document.getElementById("linecolor").value;
  // リサジュー図形の描画色を表す文字列をテキストフィールドから取得して、変数に代入

  t = 0; // 時刻を初期化
  thetax = thetax * Math.PI/180; // 度数法から孤度法への変換
  thetay = thetay * Math.PI/180; // 度数法から孤度法への変換
  thetaz = thetaz * Math.PI/180; // 【追加】度数法から孤度法への変換
  omegax = omegax * Math.PI/180; // 度数法から孤度法への変換
  omegay = omegay * Math.PI/180; // 度数法から孤度法への変換
  omegaz = omegaz * Math.PI/180; // 【追加】度数法から孤度法への変換

  cnt.fillRect(0, 0, w, h); // canvas全体を黒色の矩形で塗りつぶす
  drawColorLine(370, 90, 130, 410, "#c0c0c0"); // 【変更】x軸を銀色の直線で描画
  drawColorLine(90, 130, 410, 370, "#c0c0c0"); // 【変更】y軸を銀色の直線で描画
  drawColorLine(250, 50, 250, 450, "#c0c0c0"); // 【変更】z軸を銀色の直線で描画
};

// 共通の描画処理をまとめた関数(更新処理を含む)
var draw = function(){
  xi = ampx * Math.sin(omegax * t + thetax); // 【変更】始点のx座標
  yi = ampy * Math.sin(omegay * t + thetay); // 【変更】始点のy座標
  zi = ampz * Math.sin(omegaz * t + thetaz); // 【追加】始点のz座標
  xidraw = hw - xi * 0.6 + yi * 0.8; // 【追加】始点の描画用キャンバス内のx座標
  yidraw = hh + xi * 0.8 + yi * 0.6 - zi;  // 【追加】始点の描画用キャンバス内のy座標

  t += dt; // 時刻の更新処理(微小時間dtだけ進める)
  xf = ampx * Math.sin(omegax * t + thetax); // 【変更】終点のx座標
  yf = ampy * Math.sin(omegay * t + thetay); // 【変更】終点のy座標
  zf = ampz * Math.sin(omegaz * t + thetaz); // 【追加】終点のz座標
  xfdraw = hw - xf * 0.6 + yf * 0.8; // 【追加】終点の描画用キャンバス内のx座標
  yfdraw = hh + xf * 0.8 + yf * 0.6 - zf;  // 【追加】終点の描画用キャンバス内のy座標

  drawColorLine(xidraw, yidraw, xfdraw, yfdraw, linecolor);
};

// カラー版直線を引く関数
var drawColorLine = function(x0, y0, x1, y1, color){
  cvs = document.getElementById("lissajous3d"); // canvas要素のオブジェクトを取得
  cnt = cvs.getContext("2d"); // コンテキストを取得

  cnt.beginPath();
  cnt.moveTo(x0,y0);
  cnt.lineTo(x1,y1);
  cnt.strokeStyle = color;
  cnt.stroke();
};

// 3次元リサジュー曲線を描画する関数本体
var lissajous3d = function(){
  setup(); // 初期化処理(背景色と軸の描画を含む)
  setInterval("draw()",10); // 共通の描画処理(更新処理を含む)
};

// PNG画像として保存
var saveasPNG = function(){
  var png = cvs.toDataURL("image/png");
  document.getElementById("newImg").src = png;
};



Shadow Academy トップへ戻る

inserted by FC2 system