forked from ollikkom/gr_lab3
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathjs.js
126 lines (96 loc) · 3.85 KB
/
js.js
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
document.addEventListener("DOMContentLoaded", function() {
var canvas = document.getElementById('my-canvas');
var ctx = canvas.getContext("2d");
var fragmentSize = 5;
var firstClickCoords = { x: 0, y: 0 };
var secondClickCoords = { x: 0, y: 0 };
var clickCounter = 0;
var shiftButtonPressed = false;
function onWindowResize() {
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
}
onWindowResize();
window.addEventListener('resize', onWindowResize);
canvas.addEventListener('click', onClickDraw);
function onClickDraw(e) {
ctx.fillStyle = "#F972FF";
clickCounter++;
if (clickCounter % 2) {
firstClickCoords = { x: e.clientX, y: e.clientY };
secondClickCoords = firstClickCoords;
} else {
secondClickCoords = { x: e.clientX, y: e.clientY };
if (shiftButtonPressed) {
drawLine(firstClickCoords, secondClickCoords);
} else {
drawCircle(firstClickCoords, secondClickCoords);
}
}
}
function drawLine(start, end) {
var deltaX = end.x - start.x;
var deltaY = end.y - start.y;
var absDeltaX = Math.abs(deltaX);
var absDeltaY = Math.abs(deltaY);
var deltas = { x: deltaX, y: deltaY };
var absDeltas = { x: absDeltaX, y: absDeltaY };
var mainDir = absDeltaX > absDeltaY ? 'x' : 'y';
var secondaryDir = absDeltaX > absDeltaY ? 'y' : 'x';
var secondaryVar = start[secondaryDir];
var secondaryEnd = deltas[secondaryDir] > 0 ? end[secondaryDir] : start[secondaryDir];
var directionOfSecondary = (secondaryEnd - secondaryVar > 0) ? 1 : -1;
var err = 0;
var deltaErr = absDeltas[secondaryDir];
var calcAndDraw = function (loopVar, mainDelta) {
var fillX = mainDir === 'x' ? loopVar : secondaryVar;
var fillY = mainDir === 'x' ? secondaryVar : loopVar;
ctx.fillRect(fillX, fillY, fragmentSize, fragmentSize);
err = err + deltaErr;
if (2 * err >= mainDelta) {
secondaryVar = secondaryVar + directionOfSecondary;
err = err - mainDelta;
}
};
if (deltas[mainDir] > 0) {
for (var loopVar = start[mainDir]; loopVar <= end[mainDir]; loopVar++) { // proverit yslovie
calcAndDraw(loopVar, deltas[mainDir]);
}
} else {
for (var loopVar = start[mainDir]; loopVar >= end[mainDir]; loopVar--) { // proverit yslovie
calcAndDraw(loopVar, absDeltas[mainDir]);
}
}
}
document.addEventListener('keydown', keyDownShift);
function keyDownShift(e) {
if (e.keyCode === 16) shiftButtonPressed = true;
}
document.addEventListener('keyup', keyUpShift);
function keyUpShift(e) {
if (e.keyCode === 16) shiftButtonPressed = false;
}
function drawCircle(start, end) {
var R = Math.sqrt(Math.pow(end.x - start.x, 2) + Math.pow(end.y - start.y, 2));
var x = 0;
var y = R;
var delta = 1 - 2 * R;
var error = 0;
while (y >= 0) {
ctx.fillRect(start.x + x, start.y + y, fragmentSize, fragmentSize);
ctx.fillRect(start.x + x, start.y - y, fragmentSize, fragmentSize);
ctx.fillRect(start.x - x, start.y + y, fragmentSize, fragmentSize);
ctx.fillRect(start.x - x, start.y - y, fragmentSize, fragmentSize);
error = 2 * (delta + y) - 1;
if ((delta < 0) && (error <= 0)) {
delta += 2 * ++x + 1;
continue;
}
if ((delta > 0) && (error > 0)) {
delta -= 2 * --y + 1;
continue;
}
delta += 2 * (++x - y--);
}
}
});