-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsimple.js
More file actions
65 lines (54 loc) · 2 KB
/
simple.js
File metadata and controls
65 lines (54 loc) · 2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
// Controller class
const Controller = function() {
window.addEventListener("load", this._initialize.bind(this));
}
// Controller prototype
Controller.prototype = {
// initialize the private fields
"_initialize": function(e) {
// DOM elements
this._patternText = document.getElementById("pattern");
this._boardCanvas = document.getElementById("board");
const drawButton = document.getElementById("draw");
// events
drawButton.addEventListener("click", this._draw.bind(this));
},
// "Draw" button process
"_draw": function(e) {
// get the pattern
const letters = this._patternText.value.toLowerCase().split("");
const numbers = letters.map(elem => parseInt(elem, 36)).filter(elem => !isNaN(elem));
const points = this._createPoints(numbers);
// get drawing context
const context = this._boardCanvas.getContext("2d");
context.clearRect(0, 0, this._boardCanvas.width, this._boardCanvas.height);
context.beginPath();
// draw line segments
const cx = this._boardCanvas.width / 2;
const cy = this._boardCanvas.height / 2;
context.moveTo(cx, cy);
points.forEach(elem => context.lineTo(cx + elem.x, cy - elem.y));
context.stroke();
},
// create points
"_createPoints": function(numbers) {
const count = 200;
const delta = Math.PI * 2 / 36;
let index = 0;
let radius = 0;
let theta = 0;
// polar coordinate transformation
const points = [];
for (let i = 0; i < count; i++) {
radius++;
theta += numbers[index] * delta;
const px = radius * Math.cos(theta);
const py = radius * Math.sin(theta);
points.push({ "x": px, "y": py });
index = (index + 1) % numbers.length;
}
return points;
},
}
// start the controller
new Controller();