Skip to content

2. グラフィクス

2.1 Canvas 要素の追加

Canvas 要素を追加するには、HTML ページの<body>タグ内に、<canvas>タグを挿入します。

<canvas id="myCanvas" width="600" height="400">
  あなたのブラウザは HTML5 Canvas に対応していません。
</canvas>


主要な属性として、 idwidthheight があり、ここではそれぞれ myCanvas600400 を指定しています。

属性 意味
id JavaScriptから参照する際の名前
width Canvas要素の幅 (default: 300 px)
height Canvas要素の高さ (default: 150 px)


また、ブラウザが HTML5 および Canvas に対応していない場合は、<canvas>タグの内部を返します。 ここでは「あなたのブラウザは HTML5 Canvas に対応していません。」という文字を表示させることにします。


2.1.1 JavaScript からの参照

JavaScript から HTML の要素にアクセスするには、document インタフェースの getElementById() メソッドを利用します。 引数には、取得したい Canvas 要素の ID を指定します(今回の場合は myCanvas)。

const canvas = document.getElementById("myCanvas");


基本的な二次元の描画は、2D コンテキストを通して行うことができるようになっています。 以下のように、定数 ctx を定義し、Canvas 要素から 2D コンテキストを取得します。

const ctx = canvas.getContext("2d");


描画の各命令は、draw() 関数を定義してその中で実行するものとします。 ソースコードをまとめると、次のようになります。


14 ~ 16 行目で draw() 関数を定義し、17 行目で一度だけ呼び出しています。

作成した HTML ファイルを Chrome などのブラウザで開き、幅 600、高さ 400 のキャンバスができていることを確認しましょう。 加えて、「F12」キーを押して開発者モードにし、Console 画面で JavaScript のエラーが発生していないことも確認しておきましょう。


2.1.2 本ページでのコード記述について

本演習資料ページでは、ソースコード全体の見通しを良くするため、 以下のように HTML/CSS/JavaScript を分けて記載することにします。 特に、HTML のコードは<body>タグの抜粋となっていることに、注意してください。


次節以降では、Canvas の 2D コンテキストを利用して、さまざまな図形を描画する方法を紹介します。

2.2 矩形の描画

内部が塗りつぶされた矩形を描画するには、fillRect() 関数を用います。

fillRect(x, y, width, height);


矩形の輪郭を描画するには、strokeRect() 関数を用います。

strokeRect(x, y, width, height);


x, y は矩形の左上角の座標、widthheight は矩形の幅と高さです。


2.2.1 JavaScript コード例

単純な矩形を描画する例を以下に示します。


2.2.2 Canvas 領域の枠線描画

依然として Canvas 領域がわからない状態なので、Canvas の枠線を描画しておきます。 Canvas の幅と高さはそれぞれ canvas.width, canvas.height で取得できるので、 strokeRect() を用いて以下のように枠線を描くことができます。

2.3 パスの描画

矩形を除くすべての図形描画は、パスの描画によって行われます。 パスの開始は beginPath() 関数で行い、stroke() 関数でパスの輪郭の描画、fill() 関数でパス内部の塗りつぶしを行います。

beginPath(); // パスの開始
/*
 * パスの定義
 */
stroke(); // パスの輪郭の描画

beginPath(); // パスの開始
/*
 * パスの定義
 */
fill(); // パス内部の塗りつぶし


2.3.1 直線の描画

直線のパスを描画するには、lineTo() 関数を用います。 また、描画の開始位置は、moveTo() 関数で指定します。

moveTo(x, y);
lineTo(x, y);


x, y はそれぞれ Canvas 上の座標を表します。beginPath() 関数の後、パス描画の関数は連続して記述することができます。


2.3.2 JavaScript コード例

moveTo() 関数と lineTo() 関数を利用して、三角形を描画する例を示します。 fill() 関数で塗りつぶしを行う場合、パスは自動的に閉じる(現在の座標と始点が直線で結ばれる)ことに注意してください。 closePath() 関数を用いて、パスを明示的に閉じることもできます。

2.4 円弧/円の描画

円弧もしくは円を描画する場合は、arc() 関数を用います。

arc(x, y, radius, startAngle, endAngle);
arc(x, y, radius, startAngle, endAngle, anticlockwise);


x, y は円/円弧の中心座標、radius は半径、startAngle は開始角、endAngle は終端角、anticlockwise (true or false) は描画方向です。 角度はラジアンで表記します。時計回りで描画を行う場合、anticlockwise の記述は省略できます。


2.4.1 JavaScript コード例

円周率は Math.PI で定義されており、円の描画は開始角 0、終端角 2 * Math.PI とすることで実現できます。


なお、moveTo() 関数を用いることで、上記コードの輪郭描画部分は、以下のように書き直すことができます。

ctx.beginPath();
ctx.arc(220, 200, 50, 0, 2 * Math.PI);
ctx.moveTo(390, 200);
ctx.arc(340, 200, 50, 0, Math.PI);
ctx.moveTo(510, 200);
ctx.arc(460, 200, 50, 0, Math.PI, true);
ctx.stroke();

演習 7-1

演習 7-1

Canvas に矩形、直線、円等を描画して、好きな絵を描きなさい。


2.5 文字列の描画

文字列の描画は fillText() 関数、文字列の輪郭の描画は strokeText() 関数によって行います。

fillText(text, x, y, maxWidth);
strokeText(text, x, y, maxWidth);


2.5.1 フォントスタイルの変更

Canvas に描画する文字列のフォントスタイルは、font 属性によって調整可能です。 デフォルト値は 10px sans-serif です。


2.5.2 JavaScript コード例

2.6 色の変更

塗りつぶしの色は fillStyle 属性、輪郭の色は strokeStyle 属性で変更することができます。 各属性の色は、rgb 表記(例: rgb(255, 0, 0))、16 進数カラーコード(例: #FFFFFF)、カラーネーム(例: black, orange)などで表現することができます。

透明色を使いたい場合は、rgba(r, g, b, a) を用います。透明度(a)には、0 ~ 1 の実数値が入ります。


2.6.1 JavaScript コード例

fillStroke() で文字を描画した後に、drawStroke() で輪郭を描画する例を以下に示します。


ここで lineWidth 属性は輪郭線の太さを表しており、今回は 3 に指定しています。


2.6.2 色見本

以下は、カラーネームを持つ代表的な色のチャートです。

IndianRed
#CD5C5C
rgb(205, 92, 92)
LightCoral
#F08080
rgb(240, 128, 128)
Salmon
#FA8072
rgb(250, 128, 114)
DarkSalmon
#E9967A
rgb(233, 150, 122)
LightSalmon
#FFA07A
rgb(255, 160, 122)
Crimson
#DC143C
rgb(220, 20, 60)
Red
#FF0000
rgb(255, 0, 0)
FireBrick
#B22222
rgb(178, 34, 34)
DarkRed
#8B0000
rgb(139, 0, 0)
Pink
#FFC0CB
rgb(255, 192, 203)
LightPink
#FFB6C1
rgb(255, 182, 193)
HotPink
#FF69B4
rgb(255, 105, 180)
DeepPink
#FF1493
rgb(255, 20, 147)
MediumVioletRed
#C71585
rgb(199, 21, 133)
PaleVioletRed
#DB7093
rgb(219, 112, 147)
Coral
#FF7F50
rgb(255, 127, 80)
Tomato
#FF6347
rgb(255, 99, 71)
OrangeRed
#FF4500
rgb(255, 69, 0)
DarkOrange
#FF8C00
rgb(255, 140, 0)
Orange
#FFA500
rgb(255, 165, 0)


Gold
#FFD700
rgb(255, 215, 0)
Yellow
#FFFF00
rgb(255, 255, 0)
LightYellow
#FFFFE0
rgb(255, 255, 224)
LemonChiffon
#FFFACD
rgb(255, 250, 205)
LightGoldenrodYellow
#FAFAD2
rgb(250, 250, 210)
PapayaWhip
#FFEFD5
rgb(255, 239, 213)
Moccasin
#FFE4B5
rgb(255, 228, 181)
PeachPuff
#FFDAB9
rgb(255, 218, 185)
PaleGoldenrod
#EEE8AA
rgb(238, 232, 170)
Khaki
#F0E68C
rgb(240, 230, 140)
DarkKhaki
#BDB76B
rgb(189, 183, 107)
Lavender
#E6E6FA
rgb(230, 230, 250)
Thistle
#D8BFD8
rgb(216, 191, 216)
Plum
#DDA0DD
rgb(221, 160, 221)
Violet
#EE82EE
rgb(238, 130, 238)
Orchid
#DA70D6
rgb(218, 112, 214)
Magenta
#FF00FF
rgb(255, 0, 255)
MediumOrchid
#BA55D3
rgb(186, 85, 211)
MediumPurple
#9370DB
rgb(147, 112, 219)
RebeccaPurple
#663399
rgb(102, 51, 153)
BlueViolet
#8A2BE2
rgb(138, 43, 226)
DarkViolet
#9400D3
rgb(148, 0, 211)
DarkOrchid
#9932CC
rgb(153, 50, 204)
DarkMagenta
#8B008B
rgb(139, 0, 139)
Purple
#800080
rgb(75, 0, 130)
Indigo
#4B0082
rgb(102, 51, 153)
SlateBlue
#6A5ACD
rgb(106, 90, 205)
DarkSlateBlue
#483D8B
rgb(72, 61, 139)
MediumSlateBlue
#7B68EE
rgb(123, 104, 238)
GreenYellow
#ADFF2F
rgb(173, 255, 47)
Chartreuse
#7FFF00
rgb(127, 255, 0)
LawnGreen
#7CFC00
rgb(124, 252, 0)
Lime
#00FF00
rgb(0, 255, 0)
LimeGreen
#32CD32
rgb(50, 205, 50)
PaleGreen
#98FB98
rgb(152, 251, 152)
LightGreen
#90EE90
rgb(144, 238, 144)
MediumSpringGreen
#00FA9A
rgb(0, 250, 154)
SpringGreen
#00FF7F
rgb(0, 255, 127)
MediumSeaGreen
#3CB371
rgb(60, 179, 113)
SeaGreen
#2E8B57
rgb(46, 139, 87)
ForestGreen
#228B22
rgb(34, 139, 34)
Green
#008000
rgb(0, 128, 0)
DarkGreen
#006400
rgb(0, 100, 0)
YellowGreen
#9ACD32
rgb(154, 205, 50)
OliveDrab
#6B8E23
rgb(107, 142, 35)
Olive
#808000
rgb(128, 128, 0)
DarkOliveGreen
#556B2F
rgb(85, 107, 47)
MediumAquamarine
#66CDAA
rgb(102, 205, 170)
DarkSeaGreen
#8FBC8B
rgb(143, 188, 139)
LightSeaGreen
#20B2AA
rgb(32, 178, 170)
DarkCyan
#008B8B
rgb(0, 139, 139)
Teal
#008080
rgb(0, 128, 128)
Cyan
#00FFFF
rgb(0, 255, 255)
LightCyan
#E0FFFF
rgb(224, 255, 255)
PaleTurquoise
#AFEEEE
rgb(175, 238, 238)
Aquamarine
#7FFFD4
rgb(127, 255, 212)
Turquoise
#40E0D0
rgb(64, 224, 208)
MediumTurquoise
#48D1CC
rgb(72, 209, 204)
DarkTurquoise
#00CED1
rgb(0, 206, 209)
CadetBlue
#5F9EA0
rgb(95, 158, 160)
SteelBlue
#4682B4
rgb(70, 130, 180)
LightSteelBlue
#B0C4DE
rgb(176, 196, 222)
PowderBlue
#B0E0E6
rgb(176, 224, 230)
LightBlue
#ADD8E6
rgb(173, 216, 230)
SkyBlue
#87CEEB
rgb(135, 206, 235)
LightSkyBlue
#87CEFA
rgb(135, 206, 250)
DeepSkyBlue
#00BFFF
rgb(0, 191, 255)
DodgerBlue
#1E90FF
rgb(30, 144, 255)
CornflowerBlue
#6495ED
rgb(100, 149, 237)
MediumSlateBlue
#7B68EE
rgb(123, 104, 238)
RoyalBlue
#4169E1
rgb(65, 105, 225)
Blue
#0000FF
rgb(0, 0, 255)
MediumBlue
#0000CD
rgb(0, 0, 205)
DarkBlue
#00008B
rgb(0, 0, 139)
Navy
#000080
rgb(0, 0, 128)
MidnightBlue
#191970
rgb(25, 25, 112)
Cornsilk
#FFF8DC
rgb(255, 248, 220)
BlanchedAlmond
#FFEBCD
rgb(255, 235, 205)
Bisque
#FFE4C4
rgb(255, 228, 196)
NavajoWhite
#FFDEAD
rgb(255, 222, 173)
Wheat
#F5DEB3
rgb(245, 222, 179)
BurlyWood
#DEB887
rgb(222, 184, 135)
Tan
#D2B48C
rgb(210, 180, 140)
RosyBrown
#BC8F8F
rgb(188, 143, 143)
SandyBrown
#F4A460
rgb(244, 164, 96)
Goldenrod
#DAA520
rgb(218, 165, 32)
DarkGoldenrod
#B8860B
rgb(184, 134, 11)
Peru
#CD853F
rgb(205, 133, 63)
Chocolate
#D2691E
rgb(210, 105, 30)
SaddleBrown
#8B4513
rgb(139, 69, 19)
Sienna
#A0522D
rgb(160, 82, 45)
Brown
#A52A2A
rgb(165, 42, 42)
Maroon
#800000
rgb(128, 0, 0)
White
#FFFFFF
rgb(255, 255, 255)
Snow
#FFFAFA
rgb(255, 250, 250)
HoneyDew
#F0FFF0
rgb(240, 255, 240)
MintCream
#F5FFFA
rgb(245, 255, 250)
Azure
#F0FFFF
rgb(240, 255, 255)
AliceBlue
#F0F8FF
rgb(240, 248, 255)
GhostWhite
#F8F8FF
rgb(248, 248, 255)
WhiteSmoke
#F5F5F5
rgb(245, 245, 245)
SeaShell
#FFF5EE
rgb(255, 245, 238)
Beige
#F5F5DC
rgb(245, 245, 220)
OldLace
#FDF5E6
rgb(253, 245, 230)
FloralWhite
#FFFAF0
rgb(255, 250, 240)
Ivory
#FFFFF0
rgb(255, 255, 240)
AntiqueWhite
#FAEBD7
rgb(250, 235, 215)
Linen
#FAF0E6
rgb(250, 240, 230)
LavenderBlush
##FFF0F5
rgb(255, 240, 245)
MistyRose
#FFE4E1
rgb(255, 228, 225)
Gainsboro
#DCDCDC
rgb(220, 220, 220)
LightGray
#D3D3D3
rgb(211, 211, 211)
Silver
#C0C0C0
rgb(192, 192, 192)
DarkGray
#A9A9A9
rgb(169, 169, 169)
Gray
#808080
rgb(128, 128, 128)
DimGray
#696969
rgb(105, 105, 105)
LightSlateGray
#778899
rgb(119, 136, 153)
SlateGray
#708090
rgb(112, 128, 144)
DarkSlateGray
#2F4F4F
rgb(47, 79, 79)
Black
#000000
rgb(0, 0, 0)

2.7 Canvas の座標系

Canvas の描画における座標系は、標準的なプログラミングにおける座標系と同じで、 左上が原点 (0,0) となっており、右下が (width, height) となっています。 この座標系を変更したい場合、描画処理のタイミングで計算することもできますが、 translate()rotate()scale() で簡単に座標変換ができるようになっています。


2.7.1 座標の平行移動

座標系の原点を移動させたい場合は、translate() を用います。

translate(x, y);

x, y は原点座標の移動量を表します。


2.7.2 座標の回転

座標系を回転させたい場合は、rotate() を用います。

rotate(angle);

rotate() を使うと、原点を中心にして、時計回りに angle だけ座標系を回転させられます。 ここで、angle はラジアンであるため、度数 (degrees) を用いる場合は Math.PI / 180 を乗じて変換します。 回転の中心を変更するには、rotate() の前に translate() を使用し、原点を移動させる必要があります。


2.7.3 座標のスケーリング

座標系を拡大・縮小させたい場合は、scale() を用います。

scale(x, y);

Canvas の座標系を、x, y で指定した分だけスケーリングすることができます。 x, y の絶対値が 1 よりも大きければ拡大、1 よりも小さければ縮小となります。 また、負数を用いると、軸を反転させることができます。


2.7.4 状態の保存と復元

座標系やスタイルなど、Canvas の状態を保存したい場合は save() を用います。 保存した状態は、restore() で復元することができます。

save();
restore();

演習 7-2

演習 7-2

Canvas の中心が原点となるデカルト座標系を用意し、数学関数(n次関数/指数関数/三角関数等)を用いた絵を自由に描きなさい。