Демо JavaScript:
<canvas id="canv" width="500" height="500" style="border: 1px solid black"></canvas> <script> let ctx = document.getElementById('canv').getContext('2d'); let tn = Math.tan(Math.PI / 3), // тангенс и косинус угла в 60 градусов cs = Math.cos(Math.PI / 3); let x = [], y = [], tmpx = [], tmpy = []; // массивы, в которых хранятся координаты точек пересечения внутренних линий со сторонами треугольника // трегольник let left_x = 75, down_y = 325, side_len = 300; // координаты левой нижней вершины и длина стороны равностороннего треугольника ctx.beginPath(); // отрисовка сторон треугольника ctx.moveTo (left_x, down_y); ctx.lineTo (left_x + side_len, down_y); ctx.lineTo (left_x + (side_len / 2), down_y - (side_len / 2) * tn); ctx.lineTo (left_x, down_y); ctx.stroke(); let imgData = ctx.getImageData (left_x, down_y - tn * (side_len / 2), side_len + 1, side_len + 1); // копируем часть канваса с треугольником // линии x[0] = left_x + side_len; y[0] = down_y; let p = 0; let step = 5; // задаем координаты пересечений for (let a = step; a <= side_len; a += step) { x[p + 1] = left_x + side_len - a; y[p + 1] = down_y; tmpx [side_len / step + p] = left_x + (side_len - a) * cs; tmpy [side_len / step + p] = down_y - (side_len - a) * cs * tn; tmpx [p] = left_x + (side_len / 2) + (side_len - a) * cs; tmpy [p] = down_y - a * cs * tn; p ++; } tmpx.reverse(); // переворачиваем массивы, чтобы порядок обхода точек пересечения по всем сторонам был против часовой стрелки tmpy.reverse(); for (let i = p; i < p + tmpx.length; i ++) { x[i] = tmpx[i - p]; y[i] = tmpy[i - p]; } // вносим полученные координаты х, у в соответствующие массивы for (let i = 0; i < x.length; i ++) { console.log (i, x[i], y[i]); } let ind = 0; // указатель на координаты начала внутренней линии let tmp; // указатель на координаты конца внутренней линии let quantity = 63; // количество внутренних линий, которые одновременно отрисовываются function draw () { ctx.putImageData (imgData, left_x, down_y - tn * (side_len / 2)); tmp = (ind + side_len / step) % x.length; for (let i = 0; i < quantity; i ++) { // отрисовка линий ctx.beginPath (); ctx.moveTo (x[(ind + i) % x.length], y[(ind + i) % x.length]); ctx.lineTo (x[(tmp + i) % x.length], y[(tmp + i) % x.length ]); ctx.stroke(); } ind ++; ind %= x.length; } setInterval (draw, 50); </script>
Прикрепленный файл | Размер |
---|---|
kozenko_demo(scaled).zip | 996 байтов |