Ниже приведено подробное решение на примерном коде, адаптированном под среднюю школу. Задача состоит в том, чтобы:
- нарисовать 5-конечную звезду с буквой Q внутри,
- добавить окно редактора, которое можно скрывать/показывать,
- реализовать команду управления 3D-принтером: workshop.movePrinterNozzle(x, y, z) с имитацией перемещения сопла.
Как устроено решение:
- HTML-страница содержит панель управления, окно редактора и холст (canvas) для графики.
- Функция рисования 5-конечной звезды строит звезду через чередование точек внешнего и внутреннего радиусов.
- В центре звезды выводится буква Q.
- Окно редактора можно скрыть/показать кнопкой.
- Реализована имитация управления соплом принтера через объект workshop с методом movePrinterNozzle(x, y, z, onDone). Сопло плавно перемещается к целевой точке, при этом холст перерисовывается.
Готовый рабочий пример кода (HTML-файл). Просто скопируйте и сохраните как index.html и откройте в браузере.
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="utf-8" />
<title>Звезда Q, редактор и управление принтером</title>
<style>
body { font-family: Arial, sans-serif; }
#toolbar { margin-bottom: 8px; }
#editorPane { margin: 8px 0; }
#editorPane.hidden { display: none; }
#canvas { border: 1px solid #ccc; background: #f9f9f9; display: block; margin: 0 auto; }
</style>
</head>
<body>
<div id="toolbar">
<button id="toggleEditorBtn" onclick="toggleEditor()">Скрыть редактор</button>
<button onclick="drawStarQ()">Показать звезду Q</button>
<button onclick="printStarPath()">Печатать звезду по траектории</button>
</div>
<div id="editorPane">
<textarea id="codeEditor" spellcheck="false" rows="12" cols="80">
/*
Пример кода управления 3D-принтером:
workshop.movePrinterNozzle(x, y, z, onDone)
Цель: продемонстрировать будущий стиль кода и как он взаимодействует со звездой Q.
*/
</textarea>
</div>
<canvas id="canvas" width="700" height="420"></canvas>
<script>
// Имитация команды управления 3D-принтером
// В реальной системе это будет вызов к устройству, здесь – анимация сопла.
const workshop = {
movePrinterNozzle: function(x, y, z, onDone) {
const steps = 22;
const fromX = nozzle.x;
const fromY = nozzle.y;
const fromZ = nozzle.z;
let i = 0;
function step() {
i++;
nozzle.x = fromX + (x - fromX) * (i / steps);
nozzle.y = fromY + (y - fromY) * (i / steps);
nozzle.z = fromZ + (z - fromZ) * (i / steps);
render(); // перерисовать сцену с новым положением сопла
if (i < steps) {
requestAnimationFrame(step);
} else {
if (typeof onDone === 'function') onDone();
}
}
step();
}
};
let canvas, ctx;
let nozzle = { x: 100, y: 320, z: 0 };
let editorVisible = true;
function init() {
canvas = document.getElementById('canvas');
ctx = canvas.getContext('2d');
render();
}
// Переключатель отображения редактора
function toggleEditor() {
editorVisible = !editorVisible;
const pane = document.getElementById('editorPane');
pane.style.display = editorVisible ? 'block' : 'none';
document.getElementById('toggleEditorBtn').textContent = editorVisible ? 'Скрыть редактор' : 'Показать редактор';
}
// Рисование пятиконечной звезды
// cx, cy - центр; outerR - внешний радиус; innerR - внутренний радиус;
// points - число лучей (5); rotation - начальный угол
function drawStar(cx, cy, outerR, innerR, points, rotation) {
ctx.beginPath();
for (let i = 0; i < points * 2; i++) {
const r = (i % 2 === 0) ? outerR : innerR;
const a = rotation + i * Math.PI / points;
const x = cx + Math.cos(a) * r;
const y = cy + Math.sin(a) * r;
if (i === 0) ctx.moveTo(x, y);
else ctx.lineTo(x, y);
}
ctx.closePath();
ctx.fillStyle = '#FFD700';
ctx.fill();
ctx.lineWidth = 2;
ctx.strokeStyle = '#DAA520';
ctx.stroke();
}
// Рисуем сопло как красную точку
function drawNozzle() {
ctx.fillStyle = '#FF0000';
ctx.beginPath();
ctx.arc(nozzle.x, nozzle.y, 6, 0, Math.PI * 2);
ctx.fill();
}
// Общий рендер: звезда с буквой Q внутри и сопло
function render() {
// Очистка
ctx.clearRect(0, 0, canvas.width, canvas.height);
// Фон
ctx.fillStyle = '#f9f9f9';
ctx.fillRect(0, 0, canvas.width, canvas.height);
// Звезда Q
drawStar(350, 210, 110, 60, 5, -Math.PI / 2);
// Буква Q внутри звезды
ctx.fillStyle = '#333';
ctx.font = 'bold 60px Arial';
ctx.textAlign = 'center';
ctx.textBaseline = 'middle';
ctx.fillText('Q', 350, 210);
// Сопло принтера
drawNozzle();
}
// Поставить сопло в новую точку (через мастер-метод)
function movePrinterNozzle(x, y, z, onDone) {
workshop.movePrinterNozzle(x, y, z, onDone);
}
// Простой путь по вершинам звезды для демонстрации печати
function getStarPath(cx, cy, outerR, innerR, points, rotation) {
const path = [];
for (let i = 0; i < points * 2; i++) {
const r = (i % 2 === 0) ? outerR : innerR;
const a = rotation + i * Math.PI / points;
const x = cx + Math.cos(a) * r;
const y = cy + Math.sin(a) * r;
path.push({ x, y });
}
return path;
}
// Печать звезды по траектории (последовательные перемещения сопла)
function printStarPath() {
const path = getStarPath(350, 210, 110, 60, 5, -Math.PI / 2);
let idx = 0;
function next() {
if (idx >= path.length) return;
const p = path[idx];
workshop.movePrinterNozzle(p.x, p.y, 0, () => {
idx++;
// небольшая задержка между точками
setTimeout(next, 40);
});
}
next();
}
// Вспомогательная функция, чтобы просто нарисовать звезду и букву Q заново
function drawStarQ() {
render();
}
function drawStarQWithDirectCall() {
// Не используется, оставлено для примера
render();
}
// Инициализация
window.addEventListener('load', init);
// Экстра: экспортируем функции в глобальные имена, чтобы кнопки могли вызывать их напрямую
window.toggleEditor = toggleEditor;
window.drawStarQ = drawStarQ;
window.printStarPath = printStarPath;
</script>
</body>
</html>
Как это работает:
- Рисуется звезда с буквой Q внутри на холсте. Сопло представлено красной точкой.
- Кнопка «Скрыть редактор» скрывает/показывает окно редактора (textarea).
- Кнопка «Печатать звезду по траектории» вызывает последовательное перемещение сопла по вершинам звезды через метод workshop.movePrinterNozzle(x, y, z, onDone). Это демонстрирует принципы управления 3D-принтером в коде будущего.
- В коде можно заменить визуализацию сопла на реальные команды к устройству, если будет доступна соответствующая интеграция.
Если хочешь, могу адаптировать код под конкретный язык программирования или под другой стиль редактора (например, CodeMirror или Monaco) или изменить параметры звезды (число лучей, размеры).