|
|
@@ -440,6 +440,134 @@ const coilCx = coilX + coilMotion;
|
|
|
по каждой линии бежит стрелка, показывающая направление от N к S.
|
|
|
|
|
|
|
|
|
+---
|
|
|
+
|
|
|
+## Запись 14. Возврат сцены «Звук» и движение диффузора
|
|
|
+
|
|
|
+**Задача.** Вернуть первую сцену к исходному виду — без мембраны.
|
|
|
+Показать ход диффузора динамика, чтобы была видна механическая
|
|
|
+передача толчка в воздух. Молекулы окрасить в один цвет, чтобы
|
|
|
+не менялся, и было видно колебание каждой отдельной молекулы.
|
|
|
+Добавить нулевое значение громкости, при котором молекулы
|
|
|
+замирают на месте.
|
|
|
+
|
|
|
+**Решение.** Сцена 01 переработана:
|
|
|
+- убрана мембрана, остались только динамик и молекулы;
|
|
|
+- у динамика появился колеблющийся диффузор — конус, который
|
|
|
+ выдвигается вправо-влево в такт волне и толкает молекулы;
|
|
|
+- все молекулы окрашены в один цвет khaki без градиента по фазе;
|
|
|
+- амплитуда волны вычисляется как amp = vol × 42 — при нуле
|
|
|
+ амплитуда равна нулю, молекулы стоят, диффузор замирает;
|
|
|
+- ползунок громкости получил min="0";
|
|
|
+- при нулевой громкости внизу появляется надпись «тишина».
|
|
|
+
|
|
|
+```javascript
|
|
|
+const speakerVal = waveValue(speakerX, speakerX, endX, freq, t, waveSpeed);
|
|
|
+const diaphragmOffset = speakerVal * vol * 12;
|
|
|
+
|
|
|
+// Конус диффузора — колеблется вправо-влево
|
|
|
+ctx.fillStyle = 'rgba(212,168,96,.18)';
|
|
|
+ctx.beginPath();
|
|
|
+ctx.moveTo(65, cy - 50);
|
|
|
+ctx.lineTo(speakerX + diaphragmOffset, cy - 78);
|
|
|
+ctx.lineTo(speakerX + diaphragmOffset, cy + 78);
|
|
|
+ctx.lineTo(65, cy + 50);
|
|
|
+ctx.closePath();
|
|
|
+ctx.fill();
|
|
|
+ctx.stroke();
|
|
|
+```
|
|
|
+
|
|
|
+Молекулы — одного цвета без градиента:
|
|
|
+
|
|
|
+```javascript
|
|
|
+ctx.fillStyle = C.khaki;
|
|
|
+ctx.shadowColor = C.khaki;
|
|
|
+ctx.shadowBlur = 6;
|
|
|
+ctx.beginPath();
|
|
|
+ctx.arc(x, y, 3.2, 0, Math.PI*2);
|
|
|
+ctx.fill();
|
|
|
+```
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## Запись 15. Отдельная глава про мембрану
|
|
|
+
|
|
|
+**Задача.** Добавить страницу про мембрану, на которой была бы
|
|
|
+видна вся цепочка: динамик с движущимся диффузором, передача
|
|
|
+толчка через молекулы и реакция мембраны. Требуется сохранить
|
|
|
+единый стиль: молекулы одного цвета, замирание при нулевой
|
|
|
+громкости.
|
|
|
+
|
|
|
+**Решение.** Добавлена глава 02 «Мембрана ловит волну».
|
|
|
+Структура проекта расширена до семи содержательных сцен:
|
|
|
+Звук → Мембрана → Катушка → Фарадей → Сигнал → Сборка →
|
|
|
+Лаборатория.
|
|
|
+
|
|
|
+В главе 02:
|
|
|
+- слева динамик с колеблющимся диффузором;
|
|
|
+- в центре — молекулы воздуха одного цвета;
|
|
|
+- справа — мембрана, отклоняющаяся ровно на ту волну,
|
|
|
+ которая до неё дошла;
|
|
|
+- ползунки частоты и громкости аналогичны сцене 01;
|
|
|
+- при нулевой громкости молекулы стоят, диффузор замер,
|
|
|
+ мембрана плоская, внизу надпись «тишина».
|
|
|
+
|
|
|
+```javascript
|
|
|
+const memVal = waveValue(membraneX, speakerX, membraneX, freq, t, waveSpeed);
|
|
|
+const bow = memVal * vol * 42;
|
|
|
+
|
|
|
+ctx.beginPath();
|
|
|
+const SEG = 44;
|
|
|
+for(let i = 0; i <= SEG; i++){
|
|
|
+ const p = i / SEG;
|
|
|
+ const y = memTop + (memBot - memTop) * p;
|
|
|
+ const shape = Math.sin(Math.PI * p);
|
|
|
+ const x = membraneX + bow * shape;
|
|
|
+ if(i === 0) ctx.moveTo(x, y); else ctx.lineTo(x, y);
|
|
|
+}
|
|
|
+ctx.stroke();
|
|
|
+```
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## Запись 16. Унификация поведения молекул во всех сценах
|
|
|
+
|
|
|
+**Задача.** Привести поведение молекул во всём проекте к единому
|
|
|
+виду: один цвет без градиента по фазе, замирание при нулевой
|
|
|
+громкости. Обеспечить те же требования в главе полной сборки
|
|
|
+и в лаборатории.
|
|
|
+
|
|
|
+**Решение.** В сценах 06 «Полная сборка» и 07 «Лаборатория»
|
|
|
+молекулы перекрашены в единый цвет khaki, убрана зависимость
|
|
|
+яркости от текущей фазы волны. Формулы амплитуды приведены
|
|
|
+к виду amp = vol × N без базового смещения — при нулевой
|
|
|
+громкости движение полностью прекращается.
|
|
|
+
|
|
|
+В сцену сборки также добавлен колеблющийся диффузор динамика
|
|
|
+и затухание графиков при нуле:
|
|
|
+
|
|
|
+```javascript
|
|
|
+// График слабого ЭДС — амплитуда зависит от громкости
|
|
|
+const y = botCy - Math.cos((t*2.2 + u*3.6*Math.PI)) * (vol * 12);
|
|
|
+```
|
|
|
+
|
|
|
+Ползунок «Амплитуда» в генераторе лаборатории получил min="0".
|
|
|
+При нуле волна, молекулы и графики замирают.
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## Запись 17. Обновление структуры и итогов
|
|
|
+
|
|
|
+**Задача.** Привести документацию и навигацию в соответствие
|
|
|
+с новой структурой проекта.
|
|
|
+
|
|
|
+**Решение.** В вводном экране список глав обновлён до семи
|
|
|
+позиций: Звук, Мембрана, Катушка, ЭДС, Сигнал, Сборка,
|
|
|
+Лаборатория. В блоке итогов уточнена формулировка про мембрану:
|
|
|
+
|
|
|
+> Мембрана микрофона механически повторяет эти колебания
|
|
|
+> без искажений.
|
|
|
+
|
|
|
---
|
|
|
|
|
|
## Как запустить
|