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 トリガー: トリガーの作成と使用

推薦する

nginx で正規表現を使用してワイルドカードドメイン名を自動的に一致させる方法

Nginxは正規表現を使用して、ワイルドカードドメイン名をディレクトリに自動的に一致させます。 Ng...

uniapp vue および nvue カルーセル コンポーネントのサンプル コード

vueの部分は以下のとおりです。 <テンプレート> <ビュークラス="&...

Dockerコンテナのログ分析

コンテナログを表示するまず、 docker run -it --rm -d -p 80:80 ngi...

Javascript イベントキャプチャとバブリングメソッドの詳細な説明

目次1. イベント処理モデル1. イベントバブリング(1)3つのdiv要素にイベントをバインドする(...

CSS3セレクターの新機能の実装

目次基本的なセレクタ拡張属性セレクタ疑似クラスと疑似要素セレクター基本的なセレクタ拡張1. 子要素セ...

DockerでEurekaを設定する方法

ユーレカ: 1. JDKイメージを構築するEurekaコンテナを起動するjdkフォルダと必要なファイ...

bodyタグの主な属性の概要

bgcolor="テキストの色" background="背景画像&q...

tomcat+nginx を使用してマルチアプリケーション デプロイメントを実装するためのサンプル コード

目次マルチアプリケーションの展開1-Tomcat 構成1.1- プロジェクト構成1.2-サービス構成...

Docker デプロイメント RabbitMQ コンテナ実装プロセス分析

1. イメージをプルするまず、次のコマンドを実行して、イメージをローカル コンピューターにダウンロー...

Baota Linux パネル コマンド リスト

目次Pagodaをインストールする管理塔Nginx サービス管理Apache サービス管理MySQL...

1 つの記事で React における Redux の初期の使用を理解する

Redux はデータ状態管理プラグインです。React や Vue を使用してコンポーネント化された...

Docker-compose を使用して Django アプリケーションをオフラインでデプロイする方法

目次開発環境用のDocker-ceをインストールする開発環境用のDocker-composeをインス...

ウェブデザインにおけるポップアップウィンドウとフローティングレイヤーのデザイン

従来のソフトウェアから Web ウェアへの段階的な移行の傾向の中で、デザイン パターンとテクノロジは...

VMware 仮想マシンの 3 つのネットワーク方式と原則 (概要)

1. ブリッジ: デフォルトでは VMnet0 が使用されます1. 原則:ブリッジは、それぞれ 2...

Windows 10 での MySQL 8.0.12 解凍バージョンのインストール グラフィック チュートリアル

この記事は、MySQL 8.0.12解凍版のインストールグラフィックチュートリアルを記録しています。...