「JavaScript/Canvas」の版間の差分

削除された内容 追加された内容
Ef3 (トーク | 投稿記録)
Ef3 (トーク | 投稿記録)
M s/getElementById("/querySelector("#/
11 行
<canvas id="myCanvas" width="300" height="300">HTML5のCANVAS要素に対応したウェブブラウザで御覧ください。</canvas>
<script>
const canvas = document.getElementByIdquerySelector("#myCanvas"),
context = canvas.getContext("2d");
context.strokeRect(20, 30, 150, 200);
38 行
<canvas id="canvasTest" width="300" height="300">HTML5のCANVAS要素に対応したウェブブラウザで御覧ください。</canvas>
<script>
const canvas = document.getElementByIdquerySelector("#canvasTest"),
context = canvas.getContext("2d"),
text = "こんにちは Text";
63 行
<!DOCTYPE html>
<html lang='ja'>
<head>
<meta charset='utf-8'>
<title>JavaScriptでマンデルブロ集合を描画してみた</title>
<meta content='CANVAS要素のimageDataに直描するというやや野蛮な方法でマンデルブロ集合を描画してみました。' name='description'>
</head>
<body onload='init()'>
<h1>JavaScriptでマンデルブロ集合を描画してみた</h1>
<canvas height='800' id='canvas' width='800'>Canvas対応ブラウザを使用してください。</canvas>
<div style='text-align: right; width: 800px'>
<span id='laptime'></span>
<a href='#' id='link'>画像を保存</a>
</div>
<script>
function init() {
let t = Date.now();
draw();
document.getElementByIdquerySelector("#laptime").innerHTML = `描画処理時間: ${(Date.now() - t) / 1000}秒`;
function draw() {
const canvas = document.getElementByIdquerySelector("#canvas"),
context = canvas.getContext("2d"),
{clientWidth, clientHeight} = canvas,
rMin = -2, rMax = 2, rSpan = rMax - rMin,
iMin = -2, iMax = 2, iSpan = iMax - iMin,
nmax = 300, /* 収束判定の上限回数 */
zLimit = 4, /* 収束判定条件 */
n = 5;
let imageData = // Canvas要素から描画用ImageDataを取得
context.createImageData(clientWidth, clientHeight),
index = 0; // buffer のインデックス左上が0
for (let j = 0; j < clientHeight; j++) {
let ci = iMin + iSpan * j / (clientHeight - 1);
for (let i = 0; i < clientWidth; i++) {
const cr = rMin + rSpan * i / (clientWidth - 1);
let r = 0, im = 0;
let k = 0, z2 = 0;
for (k = 0; k < nmax; k++) {
const zr = r * r - im * im + cr,
zi = 2 * r * im + ci;
r = zr;
im = zi;
z2 = r * r + im * im;
if (z2 >= zLimit) {
break;
}
}
if (k == nmax) { /* 収束しなかった */
imageData.data[index++] = z2 * n * 4 // Red
imageData.data[index++] = z2 * n * 16 // Green
imageData.data[index++] = z2 * n * 64 // Bule
}
else { /* 収束した */
imageData.data[index++] = z2 * n * 2 // Red
imageData.data[index++] = z2 * n * 4 // Green
imageData.data[index++] = z2 * n * 8 // Bule
}
imageData.data[index++] = 255; // Alpha
}
}
context.putImageData(imageData, 0, 0);
document.getElementByIdquerySelector("#link").setAttribute("href", canvas.toDataURL());
}
}
</script>
</body>
</html>
</source>
174 行
<source lang="javascript" start=61 line>
context.putImageData(imageData, 0, 0);
document.getElementByIdquerySelector("#link").setAttribute("href", canvas.toDataURL());
</source>
imageDataに操作を行ったあと、putImageDataメソッドでCanvasで反映します。<br>
180 行
この事で「名前をつけて画像を保存」を実現しています。
 
<!-- '''HAMLで書いたソース'''
<source lang="text">
!!!
:ruby
CANVAS_DIM, RANGE = 512、800, 2
%html{lang:lang => "ja"}
%head
%meta{charset: "utf-8"}/
%title JavaScriptでマンデルブロ集合を描画してみた
%meta{name: "description", content: "'CANVAS要素のimageDataに直描するというやや野蛮な方法でマンデルブロ集合を描画してみました。"', name: 'description'}
%body{onload: "init()"}
%h1 JavaScriptでマンデルブロ集合を描画してみた
%canvas#canvas{height: CANVAS_DIM, width: CANVAS_DIM} Canvas対応ブラウザを使用してください。
%div{style:style => "text-align: right; width: #{CANVAS_DIM}px"}
%span#laptime
%a#link{href:href => "#"} 画像を保存
:javascript
function init() {
let t = Date.now();
draw();
document.getElementByIdquerySelector("#laptime").innerHTML = `描画処理時間: ${(Date.now() - t) / 1000}秒`;
function draw() {
const canvas = document.getElementByIdquerySelector("#canvas"),
context = canvas.getContext("2d"),
{clientWidth, clientHeight} = canvas,
rMin = -#{RANGE}, rMax = #{RANGE}, rSpan = rMax - rMin,
iMin = -#{RANGE}, iMax = #{RANGE}, iSpan = iMax - iMin,
nmax = 300, /* 収束判定の上限回数 */
zLimit = 4, /* 収束判定条件 */
n = 5;
let imageData = // Canvas要素から描画用ImageDataを取得
242 ⟶ 243行目:
}
context.putImageData(imageData, 0, 0);
document.getElementByIdquerySelector("#link").setAttribute("href", canvas.toDataURL());
}
}
</source>
-->
 
===マンデルブロ集合を描画するプログラム:実行例===
[[File:マンデルブロ集合.png]]