JavaScript キャンバスで動的な点と線の効果を実現

JavaScript キャンバスで動的な点と線の効果を実現

この記事では、動的な点と線の効果を実現するためのJavaScriptキャンバスの具体的なコードを参考までに紹介します。具体的な内容は次のとおりです。

効果プレビュー

1. 成果を達成する

  • 色のついた点を描く
  • 接続ポイント
  • 点線の動き、境界の反発に遭遇
  • ポイントを選択してドラッグし、位置を変更します*

2. 具体的な実施

関連する変数を初期化する

var c = document.getElementById("myCanvas");
      //キャンバスのサイズを設定します c.height = document.body.offsetHeight;
      c.width = document.body.offsetWidth;
      //キャンバスはウィンドウのサイズに従います window.onresize = function() {
        c.height = ドキュメント本体のオフセット高さ;
        c.width = document.body.offsetWidth;
      };

      var theCanvas = c.getContext("2d");
      var pointList = []; //ポイントを保存
      var アニメーション = null;
      var selectPoint = null;

関連するポイントとラインデータを格納するオブジェクトを構築する

var PointLine = function(キャンバス、x、y、r、色) {
        this.theCanvas = キャンバス;
        this.x = x;
        y = y;
        r を次のように記述します。
        this.color = color; //点の色 this.speed = 5; //点の移動速度 //移動方向 this.direction = parseInt(Math.random() * 1000) % 4; //0 -x 1 x 2-y 3 y
        this.drawPoint = 関数() {
          このCanvasのbeginPath();
          this.theCanvas.fillStyle = this.color;
          this.theCanvas.arc(this.x, this.y, this.r, 0, 360);
          キャンバスに塗りつぶしを追加します。
        };
        // 範囲外かどうかをチェックし、範囲外の場合は反対方向に変更します this.checkX = function(x) {
          (x - this.r <= 0)の場合{
            this.x = this.r;
            this.direction = 1;
          } そうでない場合 (x + this.r >= this.theCanvas.canvas.width) {
            this.x = this.theCanvas.canvas.width - this.r;
            this.direction = 0;
          } それ以外の場合は this.x = x;
        };
        this.checkY = 関数(y) {
          (y - this.r <= 0)の場合{
            this.y = this.r;
            this.direction = 3;
          } そうでない場合 (y + this.r >= this.theCanvas.canvas.height) {
            this.y = this.theCanvas.canvas.height - this.r;
            this.direction = 2;
          } それ以外の場合は this.y = y;
        };
        //ポイントを移動する this.movePoints = function() {
          (this.direction == 0)の場合{
            this.checkX(this.x - parseInt(Math.random() * this.speed));
          } それ以外の場合 (this.direction == 1) {
            this.checkX(this.x + parseInt(Math.random() * this.speed));
          } それ以外の場合 (this.direction == 2) {
            this.checkY(this.y - parseInt(Math.random() * this.speed));
          } それ以外の場合 (this.direction == 3) {
            this.checkY(this.y + parseInt(Math.random() * this.speed));
          }
        };
        これを返します。
      };

2点間に線を引く

//2つの点を結ぶ function drawLine(start, end) {
        theCanvas.strokeStyle = "rgba(204,204,204,0.5)";
        キャンバスのパスの開始位置を指定します。
        theCanvas.moveTo(開始位置.x、開始位置.y);
        キャンバスの端から端までの線の長さを x で割った値。
        キャンバスのストローク();
      }
      //2点間の距離 function getDistance(p1, p2) {
        Math.pow(p1.x - p2.x, 2) + Math.pow(p1.y - p2.y, 2) を返します。
      }
      var minDistance = parseInt(0.1 * theCanvas.canvas.height);
      minDistance = minDistance * minDistance; // 線の最短距離 // 点は別の点に接続されています function drawLinkLine(p1) {
        (var j = 0; j < pointList.length; j++) の場合 {
          var p2 = pointList[j];
          (p2.x == p1.x && p2.y == p1.y) の場合、継続します。

          var 行 = getDistance(p1, p2);
          (線が最小距離< && 線> 0)の場合{
            線を描画します(p1, p2);
          }
        }
      }

ランダムポイントを生成する

//ランダムな色を生成する function randColor() {
        戻る (
          "rgb(" +
          [
            Math.floor(Math.random() * 255)、
            Math.floor(Math.random() * 255)、
            Math.floor(Math.random() * 255)
          ].join(",") +
          「)」
        );
      }
//ランダムなポイントを生成する function createPoint() {
        var x = parseInt(Math.random() * theCanvas.canvas.width);
        var y = parseInt(Math.random() * theCanvas.canvas.height);
        var r = 5 + parseInt(Math.random() * 20);
        (x - r < 0) の場合 x = r;
        そうでない場合 (x + r > theCanvas.canvas.width) x = theCanvas.canvas.width - r;

        (y - r < 0) の場合 x = r;
        そうでない場合 (y + r > theCanvas.canvas.height)
          y = theCanvas.canvas.height - r;
        新しい PointLine(theCanvas, x, y, r, randColor()) を返します。
      }
      // 100個のランダムポイントを生成する for (var i = 0; i < 100; i++) {
        pointList.push(createPoint());
      }

ブラウザキャンバスアニメーションフレームと互換性あり

// アニメーションを有効にする関数 canvasAnimation() {
        戻る (
          ウィンドウのアニメーションフレームをリクエストします。
          window.webkitRequestAnimationFrame ||
          window.mozRequestAnimationFrame ||
          ウィンドウ.msRequestAnimationFrame ||
          関数(コールバック、要素) {
            var self = this、
              始める、
              仕上げる;
            ウィンドウ.setTimeout(関数() {
              開始 = +新しい日付();
              コールバック(開始);
              終了 = +新しい日付();
              self.timeout = 1000 / 60 - (終了 - 開始);
            }, 自己タイムアウト);
          }
        );
      }
      //アニメーションをキャンセルする関数 canvasCancleAnim() {
        戻る (
          ウィンドウをキャンセル
          window.webkit アニメーションフレームをキャンセルします ||
          window.mozCancelAnimationFrame ||
          window.mosCancelAnimationFrame ||
          ウィンドウクリアタイムアウト
        );
      }

アニメーションを開始

//キャンバスアニメーション関数のループ実行 start() {
        アニメーションをキャンバスから開始します。
        // キャンバスをクリアする
        キャンバスをクリアする(
          0,
          0,
          キャンバスの幅、
          キャンバスの高さ
        );
        //点と線を描画します for (var i = 0; i < this.pointList.length; i++) {
          var p = pointList[i];
          リンクラインを描画します(p);
          p.drawPoint();
          selectPoint && selectPoint == p の場合、続行します。
          p.movePoints();
        }
      }

      //アニメーションを開始します。start();

ポイントを選択してドラッグします

// px座標をキャンバス座標に変換する function windowToCanvas(canvas, x, y) {
        bbox を canvas.getBoundingClientRect() に追加します。
        戻る {
          x: x - bbox.left * (canvas.width / bbox.width),
          y: y - bbox.top * (canvas.height / bbox.height)
        };
      }
      //アクションを設定し、選択したポイントを押します theCanvas.canvas.onmousedown = function(e) {
       
        var loc = windowToCanvas(theCanvas.canvas, e.clientX, e.clientY);      
        (var i = 0; i < pointList.length; i++) の場合 {
          var p = pointList[i];
         
          (getDistance(p, loc)<100)の場合{
            選択ポイント = p;
            壊す;
          }
        }
      };
      //ポイントを移動する theCanvas.canvas.onmousemove = function(e) {
        if (選択ポイント) {
          var loc = windowToCanvas(theCanvas.canvas, e.clientX, e.clientY);
          選択ポイントx = loc.x;
          選択ポイントのy座標をloc.y座標に変更します。
         
        }
      };
      //ポイントの選択を解除 theCanvas.canvas.onmouseup = function(e) {
        選択ポイント = null;
       
      };

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • キャンバスの始点と終点を指定して線を描くjs+html5メソッド

<<:  MySQLの保存場所を新しいディスクに移行する方法

>>:  MySQL トリガー: トリガーの作成と使用

推薦する

MySQL が uuid または snowflake id を主キーとして使用することを推奨しない理由の詳細な分析

前書き: MySQL でテーブルを設計する場合、MySQL では UUID や非連続かつ非繰り返しの...

MySQLからOracleへのリアルタイム同期ソリューションの詳細な説明

1 要件の概要MySQL5.6本番データベースの複数のテーブルのデータは、Oracle11gデータウ...

時間のかかるMySQLレコードのSQL例の詳細な説明

mysqlは時間のかかるSQLを記録しますMySQL は、最適化と分析のために、時間のかかる SQL...

MySQL は SQL ステートメントの最新のレコードをクエリします (最適化)

最悪の選択肢は、結果を時間順に並べ替えて最初のものを取ることです。 *から選択 ここで、create...

Tomcat での jar のロードに関する異常な問題の分析と解決

現象の説明:プロジェクトでは、Springboot を使用して Web プロジェクトを開始します。起...

mysql 解凍パッケージの基本インストールチュートリアル

新しいコンピューターに変更したので、すべての環境を新しいコンピューター上で設定する必要があります。ふ...

HTML インライン要素と HTML ブロックレベル要素の概要と違い

ブロックレベル要素の機能: • 常に新しい行から始まり、それ自体で 1 行を占め、後続の要素も新しい...

HTMLタグの説明

HTMLタグの説明1. HTMLタグタグ: !DOCTYPE説明: HTML ドキュメントが準拠する...

24 の実用的な JavaScript 開発のヒント

目次1.配列を初期化する2. 配列の合計、最大値、最小値3. エラー値をフィルタリングする4. 論理...

ウェブページのCSSの優先順位について詳しく説明します

CSS の優先順位について話す前に、CSS とは何か、CSS が何に使用されるのかを理解する必要があ...

海外でダウンロードできる25個の新鮮で便利なアイコンセット

1. Eコマースアイコン2. アイコンスイーツ2 3. 携帯電話アイコンパック4. 旗アイコンセット...

Docker swarm を使用して Nebula Graph クラスターを迅速にデプロイする方法のチュートリアル

1. はじめにこの記事では、Docker Swarm を使用して Nebula Graph クラスタ...

Linux のインスタンスにパブリック IP アドレスを割り当てる方法

説明するこのインターフェースを呼び出すときは、次の点に注意する必要があります。パブリック IP アド...

ウェブサイト上で flv/MP4 やその他のビデオ ファイルを再生できない問題は、MIME タイプに関連しています。

ウェブサイトを作成している際に、flv や MP4 形式などのビデオ ファイルはローカルでは正常に再...

Docker デプロイメント Consul 構成プロセスの分析

コマンドを実行docker run -d --name consul -p 8500:8500 co...