ブログの説明

学校に通わないで学んだことを記しています。間違っているところが何かありましたらご指摘下さると幸いです。コメントに対する返信が遅れる可能性があります。その場合は申し訳ありません。

このブログではサイドバーに広告を表示しています。このブログ内の投稿記事を検索するには右上の拡大鏡のアイコンを、アーカイブやラベル付けから投稿記事を閲覧するには左上の三重線のアイコンをクリックして下さい。

数式の表示にはMathJaxを利用させていただいています。数式の表示のためにJavaScriptが有効である必要があります。そうでない場合、訳の分からないLatexのコードが表示されます。幾何学図形やチャートの表示にはHTML5 CanvasやGoogle Chartを使用しています。その表示のためにもJavaScriptが有効である必要があります。

HTML5のCanvas 2Dを利用して直線を描く

Canvas 2Dを表示するためのHTML文書は次のとおり。body要素の中にcanvas要素を設け、id属性とCanvasの大きさをwidth(幅)とheight(高さ)で指定する。このid名はJavaScriptのソースから参照するために使う。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Canvasを学ぶ</title>
</head>
<body>
<canvas id="canvas" width="350" height="350">
あなたのブラウザはCanvas要素に対応していません。
</canvas>
<script type="text/javascript" src="canvas_straight_line.js"></script>
</body>
</html>

canvas_straight_line.jsという名のファイルに次のようなコードを記述して保存。最初の2行はCanvasで2D画を描くときのお決まりのコード。lineWidthプロパティで線幅を指定している。beginPathメソッドで初期化。moveToメソッドの引数で線の視点をxy座標の値として指定し、lineToメソッドの引数で線の終点をxy座標の値として指定している。xy座標系はCanvasの左上端が(0,0)となる。そこから下へ伸びるほど(0,100)のようにyの値が増し、右へ伸びるほど(100,0)のようにxの値が増す。そして最後にstrokeメソッドを使って線を描いている。

let canvas = document.getElementById("canvas");
let context = canvas.getContext("2d");

// x軸

context.beginPath(); //パスのリセット
context.lineWidth = 1; //線幅

let mx = 10;
let my = 10;
let lx = 10;
let ly = 300;
context.moveTo(mx, my); //線の始点
context.lineTo(lx, ly); //線の終点
context.stroke(); //描画

// y軸

context.lineWidth = 1;
context.beginPath();

mx = 10;
my = 300;
lx = 300;
ly = 300;
context.moveTo(mx, my);
context.lineTo(lx, ly);
context.stroke();

// 正比例線

context.lineWidth = 1;
context.beginPath();

mx = 10;
my = 300;
lx = 300;
ly = 10;
context.moveTo(mx, my);
context.lineTo(lx, ly);
context.stroke();

この結果はこうなる。

あなたのブラウザはCanvas要素に対応していません。

次は格子状に直線を引くコード。繰り返し線を引くためにfor文を用いている。

let canvas = document.getElementById("canvas");
let context = canvas.getContext("2d");

const topMargin = 5.5; // 上余白
const leftMargin = 5.5; // 左余白
const verticalGridNum = 13; // 垂直枠の数
const horizontalGridNum = 13; // 水平枠の数
const gridSize = 25; // 枠線間の幅

context.beginPath(); // パスの初期化
context.lineWidth = 1; // 枠線の太さ
context.strokeStyle = "black"; // 枠線の色

// 垂直枠線の開始位置
let verticalMx = leftMargin; // x座標
let verticalMy = topMargin; // y座標

// 垂直枠線の終了位置
let verticalLx = leftMargin; // x座標
let verticalLy = topMargin + (gridSize * verticalGridNum); // y座標

// 垂直の枠線を描く
for (let i = 0; i <= horizontalGridNum; i++) {
  context.moveTo(verticalMx, verticalMy); // 枠線の始点
  context.lineTo(verticalLx, verticalLy); // 枠線の終点
  context.stroke(); // 描画
  verticalMx = verticalMx + gridSize;
  verticalLx = verticalLx + gridSize;
}

// 水平枠線の開始位置
let horizontalMx = leftMargin; // x座標
let horizontalMy = topMargin; // y座標

// 水平枠線の終了位置
let horizontalLx = leftMargin + (gridSize * horizontalGridNum); // x座標
let horizontalLy = topMargin; // y座標

// 水平の枠線を描く
for (let i = 0; i <= verticalGridNum; i++) {
  context.moveTo(horizontalMx, horizontalMy); // 枠線の始点
  context.lineTo(horizontalLx, horizontalLy); // 枠線の終点
  context.stroke(); // 描画
  horizontalMy = horizontalMy + gridSize;
  horizontalLy = horizontalLy + gridSize;
}

この結果はこうなる。

このブラウザはHTML5 CanvasかJavaScriptをサポートしていません。

まとめ

パス
図形の見えない下書きのようなもの。この見えない設計図に基づいて図形が実際に描かれる。1つのキャンバスには1つのカレントパスがあり、その中に複数のサブパスを設計できる構造になっている。
beginPath()
カレントパスをリセットする。その際、サブパスもすべて消去する。パスを使って2D図形を描くときに最初に使うお決まりのメソッド。見えない下書きが消されるだけなので描画された図形が消えるわけではない。
lineWidth
線分の幅をピクセル値で指定する。
moveTo(x, y)
直線のサブパスの始点を座標で指定する。xが縦軸、yが横軸。いずれもdouble型。座標系は左上端が(0,0)となる。
lineTo(x, y)
直線のサブパスを作成する。引数は座標。xが縦軸、yが横軸。いずれもdouble型。座標系は左上端が(0,0)となる。
stroke()
指定されたパスに基づいてその線分を描画する。

コメント

このブログの人気の投稿

Visual Studio 2019にはC++のためのフォームデザイナーがない件

10の補数と9の補数と2の補数と1の補数

LATEXで数式:指数と順列などで使う添数・添字