2023-12-17 07:55:25 +03:00
|
|
|
|
// © Головин Г.Г., Код с комментариями, 2023
|
|
|
|
|
'use strict';
|
|
|
|
|
let canvas = document.getElementById('canvas');
|
|
|
|
|
// исходный массив точек-вершин квадрата
|
|
|
|
|
let square = [{x:50,y:50},{x:50,y:250},{x:250,y:250},{x:250,y:50}];
|
|
|
|
|
// центр фигуры, вокруг него будем выполнять поворот
|
|
|
|
|
let t0 = {x:150, y:150};
|
|
|
|
|
// угол поворота в градусах
|
|
|
|
|
let deg = 1;
|
|
|
|
|
|
|
|
|
|
// поворот фигуры и обновление изображения
|
|
|
|
|
function repaint() {
|
|
|
|
|
// поворачиваем исходный массив точек на угол
|
|
|
|
|
for (let i = 0; i < square.length; i++)
|
|
|
|
|
square[i] = rotateOnDegree(t0, square[i], deg);
|
|
|
|
|
// рисуем текущий массив точек
|
|
|
|
|
drawFigure(canvas, square);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// поворачиваем точку (t) на угол (deg) относительно точки (t0)
|
|
|
|
|
function rotateOnDegree(t0, t, deg) {
|
|
|
|
|
let t_new = {};
|
|
|
|
|
// переводим угол поворота из градусов в радианы
|
|
|
|
|
let rad = (Math.PI / 180) * deg;
|
|
|
|
|
// рассчитываем координаты новой точки по формуле
|
|
|
|
|
t_new.x = t0.x+(t.x-t0.x)*Math.cos(rad)-(t.y-t0.y)*Math.sin(rad);
|
|
|
|
|
t_new.y = t0.y+(t.x-t0.x)*Math.sin(rad)+(t.y-t0.y)*Math.cos(rad);
|
|
|
|
|
// возвращаем новую точку
|
|
|
|
|
return t_new;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// рисуем фигуру по точкам из массива
|
|
|
|
|
function drawFigure(canvas, arr) {
|
|
|
|
|
let context = canvas.getContext('2d');
|
|
|
|
|
// очищаем весь холст целиком
|
|
|
|
|
context.clearRect(0, 0, canvas.width, canvas.height);
|
|
|
|
|
// обходим массив точек и соединяем их линиями
|
|
|
|
|
context.beginPath();
|
|
|
|
|
for (let i = 0; i < arr.length; i++)
|
|
|
|
|
if (i == 0)
|
|
|
|
|
context.moveTo(arr[i].x, arr[i].y);
|
|
|
|
|
else
|
|
|
|
|
context.lineTo(arr[i].x, arr[i].y);
|
|
|
|
|
context.closePath();
|
|
|
|
|
// рисуем линии на холсте
|
|
|
|
|
context.lineWidth = 2.2;
|
|
|
|
|
context.strokeStyle = '#222';
|
|
|
|
|
context.stroke();
|
|
|
|
|
}
|
|
|
|
|
|
2023-12-17 08:08:38 +03:00
|
|
|
|
// после загрузки страницы, задаём частоту обновления изображения 20 Гц
|
2023-12-17 07:55:25 +03:00
|
|
|
|
document.addEventListener('DOMContentLoaded',()=>setInterval(repaint,50));
|