// © Головин Г.Г., Экспериментальная модель, 2023 'use strict'; let d5=300,tv5={x:150,y:150,z:125},show=false; let deg2={x:1,y:1,z:1}; let sortOrder=true,alpha=20,first=false; // обработчики событий в форме function changeAxis(val,caller) { deg2[val]=0+caller.target.checked; } function changeDistance(caller) { d5=caller.target.valueAsNumber; } function changeTv(val,caller) { tv5[val]=caller.target.valueAsNumber; } function showCenter(caller) { show=caller.target.checked; } function changeFigure(caller) { if (caller.target.value=="first") first=true; if (caller.target.value=="second") first=false; } function changeOrder(caller) { if (caller.target.value=="linear") sortOrder=true; if (caller.target.value=="reverse") sortOrder=false; } function changeAlpha(caller) { alpha=caller.target.valueAsNumber; } const canvas5 = document.getElementById('canvas5'); // перетаскивание центральной точки мышью let msBtnPressed = false; canvas5.onmouseup = ()=> msBtnPressed=false; canvas5.onmousedown = (caller)=> { msBtnPressed=true; canvas5.onmousemove(caller); } canvas5.onmousemove = (caller)=> { if (msBtnPressed && show) { tv5.x=caller.offsetX; tv5.y=caller.offsetY; document.getElementById('rangeX').value=caller.offsetX; document.getElementById('resultX').value=caller.offsetX; document.getElementById('rangeY').value=caller.offsetY; document.getElementById('resultY').value=caller.offsetY; } } // массивы для кубиков const cubes5a = [], cubes5b = []; // обходим матрицы, заполняем массивы кубиками for (let x=0; xb.dist-a.dist); // сортировка в обратном порядке if (!sortOrder) proj.reverse(); // рисуем перспективную проекцию drawFigure(canvas, proj, (100-alpha)/100); // центральная точка перспективной проекции if (show) centerPoint(canvas); } // центральная точка перспективной проекции function centerPoint(canvas) { const context = canvas.getContext('2d'); context.beginPath(); context.lineWidth = 3.2; context.strokeStyle = '#66bb6a'; context.arc(tv5.x, tv5.y, 6.5, 0, 2*Math.PI); context.stroke(); } // после загрузки страницы, задаём частоту обновления изображения 20 Гц document.addEventListener('DOMContentLoaded',()=>setInterval(repaint5,50));