2023-12-17 07:55:25 +03:00
|
|
|
|
// © Головин Г.Г., Код с комментариями, 2023
|
|
|
|
|
'use strict';
|
|
|
|
|
// рисовать будем сразу две картинки,
|
|
|
|
|
// объект будет один, а проекций будет много
|
|
|
|
|
const canvas1 = document.getElementById('canvas1');
|
|
|
|
|
const canvas2 = document.getElementById('canvas2');
|
|
|
|
|
// создаём объект
|
|
|
|
|
const cube = new Cube(50,50,50,200);
|
|
|
|
|
// центр фигуры, вокруг него будем выполнять поворот
|
|
|
|
|
const t0 = new Point(150,150,150);
|
|
|
|
|
// удалённость центра проекции
|
|
|
|
|
const d = 300;
|
|
|
|
|
// положение экрана наблюдателя
|
|
|
|
|
const tv = new Point(150,150,80);
|
|
|
|
|
// угол поворота в градусах
|
|
|
|
|
const deg = {x:0,y:1,z:0};
|
|
|
|
|
|
|
|
|
|
// поворот фигуры и обновление изображения
|
|
|
|
|
function repaint() {
|
|
|
|
|
cube.rotate(deg, t0);
|
|
|
|
|
// рисуем параллельную проекцию
|
|
|
|
|
drawFigure(canvas1, cube.projection('parallel', tv));
|
|
|
|
|
// рисуем перспективную проекцию
|
|
|
|
|
drawFigure(canvas2, cube.projection('perspective', tv, d));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// рисуем фигуру по точкам из массива
|
|
|
|
|
function drawFigure(canvas, proj) {
|
|
|
|
|
let context = canvas.getContext('2d');
|
|
|
|
|
// сортируем грани по их наклону
|
|
|
|
|
proj.sort((a,b) => b.clock-a.clock);
|
|
|
|
|
// очищаем весь холст целиком
|
|
|
|
|
context.clearRect(0, 0, canvas.width, canvas.height);
|
|
|
|
|
// обходим массив граней куба
|
|
|
|
|
for (let i = 0; i < proj.length; i++) {
|
|
|
|
|
// обходим массив точек и соединяем их линиями
|
|
|
|
|
context.beginPath();
|
|
|
|
|
for (let j = 0; j < proj[i].length; j++) {
|
|
|
|
|
if (j == 0) {
|
|
|
|
|
context.moveTo(proj[i][j].x, proj[i][j].y);
|
|
|
|
|
} else {
|
|
|
|
|
context.lineTo(proj[i][j].x, proj[i][j].y);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
context.closePath();
|
|
|
|
|
// рисуем грань куба вместе с рёбрами
|
|
|
|
|
context.lineWidth = 2.2;
|
|
|
|
|
context.lineJoin = 'round';
|
|
|
|
|
context.fillStyle = '#fff9';
|
|
|
|
|
context.strokeStyle = '#222';
|
|
|
|
|
context.fill();
|
|
|
|
|
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));
|