├── 3dlines.html
├── mawaru.html
└── 3dlines.js
/3dlines.html:
--------------------------------------------------------------------------------
1 |
2 |
3 | ', category.name, ': '].join('');
280 | var funcs = category.funcs;
281 | for (var key in funcs) {
282 | checked = "";
283 | if (key == category.default_func) {
284 | checked = " checked";
285 | }
286 | html += ['
', key].join('');
289 | }
290 | }
291 |
292 | PARAMETERS = [
293 | 'NUM_HISTS',
294 | 'NUM_LINES',
295 | 'MAX_DIST',
296 | 'TIMEOUT_MSEC',
297 | 'WIDTH_FACTOR',
298 | 'Z_FACTOR',
299 | 'LINE_VEL',
300 | 'CAM_VEL_FACTOR',
301 | 'FILL_ALPHA'
302 | ];
303 | for (var i = 0; i < PARAMETERS.length; i++) {
304 | var param = PARAMETERS[i];
305 | html += ['
', param, ': ',
306 | ''].join("");
309 | }
310 |
311 | document.getElementById("ui").innerHTML = html;
312 | }
313 |
314 | function initColors() {
315 | MONOCHROME_COLORS = [];
316 | for (var i = 0; i < 256; i++) {
317 | var c = gencolor(i);
318 | MONOCHROME_COLORS.push(c);
319 | }
320 | }
321 |
322 | function initDemo() {
323 | FILL_ALPHA_STR = 'rgba(0, 0, 0, ' + FILL_ALPHA * 0.01 + ')';
324 |
325 | initColors();
326 |
327 | timer = new Timer();
328 |
329 | camera = new Camera();
330 | var cp = camera.p();
331 |
332 | lines = new Array(NUM_LINES);
333 | for (var i = 0; i < NUM_LINES; i++) {
334 | lines[i] = initLine(cp);
335 | }
336 |
337 | cont();
338 | }
339 |
340 | function init() {
341 | initUI();
342 | for (var i = 0; i < CATEGORIES.length; i++) {
343 | var category = CATEGORIES[i];
344 | window[category.id] = category.funcs[category.default_func];
345 | }
346 | initDemo();
347 | log("init done");
348 | }
349 |
350 | function cont() {
351 | timeoutId = setTimeout("run();", TIMEOUT_MSEC);
352 | }
353 |
354 | function reflect(d, n, v, c) {
355 | if (Math.abs(n[d] - c) > MAX_DIST) {
356 | v[d] = -v[d];
357 |
358 | for (var j = 0; Math.abs(n[d] - c) > MAX_DIST; j++) {
359 | if (j > 10) {
360 | return false;
361 | }
362 | n[d] += v[d];
363 | }
364 | }
365 | return true;
366 | }
367 |
368 | function move() {
369 | document.getElementById("fps").textContent = timer.move();
370 |
371 | camera.move();
372 | var cp = camera.p();
373 |
374 | for (var i = 0; i < lines.length; i++) {
375 | var line = lines[i];
376 | var p = line.cur();
377 | var n = line.next();
378 | n.assign(p);
379 | n.add(line.v);
380 |
381 | if (!reflect("x", n, line.v, cp.x) ||
382 | !reflect("y", n, line.v, cp.y) ||
383 | !reflect("z", n, line.v, cp.z)) {
384 | lines[i] = initLine(cp);
385 | }
386 | }
387 | }
388 |
389 | function draw() {
390 | var canvas = document.getElementById("canvas");
391 | var ctx = canvas.getContext("2d");
392 | ctx.fillStyle = FILL_ALPHA_STR;
393 | ctx.globalCompositeOperation = "source-over";
394 | ctx.fillRect(0, 0, SW, SH);
395 |
396 | ctx.strokeStyle = 'rgb(255, 255, 255)';
397 | ctx.fillStyle = 'rgb(255, 255, 255)';
398 | ctx.lineWidth = 1;
399 | var cp = camera.p();
400 | for (var i = 0; i < lines.length; i++) {
401 | var line = lines[i];
402 | var k = 0;
403 | for (var j = line.nextIndex(line.index); j != line.index; j = k) {
404 | var k = line.nextIndex(j);
405 | var p = line.hist[j];
406 | var n = line.hist[k];
407 |
408 | ctx.beginPath();
409 | make2d(p, cp);
410 | if (out.z <= 0) continue;
411 | if (out.z > 255) out.z = 255;
412 | zeffect(ctx, out.z);
413 | ctx.moveTo(out.x, out.y);
414 | make2d(n, cp);
415 | ctx.lineTo(out.x, out.y);
416 | ctx.closePath();
417 | ctx.stroke();
418 | }
419 | }
420 | }
421 |
422 | function run() {
423 | move();
424 | draw();
425 | cont();
426 | }
427 |
--------------------------------------------------------------------------------