المهمة:
انتشار الموجات، الحيود، التداخل
مختبر الموجات التفاعلي
أهلاً بك في مختبر الموجات التفاعلي! هنا يمكنك استكشاف ثلاث ظواهر موجية رئيسية: الانتشار، والحيود، والتداخل.
اختر تجربة:
📡 الانتشار
🌊 الحيود
⚡ التداخل
📊 ملف الموجة
انتشار الموجات
تنتشر الموجات في جميع الاتجاهات من المصدر بسرعة ثابتة.
🌐 انتشار الموجات
تنقل الموجات الطاقة دون نقل المادة. وتنتشر من المصدر في دوائر متحدة المركز.
تعتمد سرعة الانتشار على الوسط
تحدد السعة شدة الموجة
يبقى التردد ثابتاً أثناء الانتشار
🌊 حيود الموجات
الحيود هو قدرة الموجات على الالتفاف حول العوائق والمرور عبر الفتحات الضيقة.
يكون أكثر وضوحاً عندما يكون حجم العائق مقارباً لطول الموجة
تنتشر الموجة على شكل مروحة بعد الفتحة
يفسر انتشار الصوت حول الزوايا
⚡ تداخل الموجات
التداخل هو تراكب الموجات من مصدرين مترابطين (تجربة شق يونج المزدوج).
الأهداب المضيئة - تداخل بناء
الأهداب المظلمة - تداخل هدام
تعتمد المسافة بين الأهداب على طول الموجة
📊 ملف الموجة
يوضح المنظر الجانبي شكل الموجة - جيبية تتحرك في الفضاء.
السعة - أقصى إزاحة عن موضع الاتزان
يعتمد طول الموجة على التردد والسرعة
كلما زاد التردد، قصر طول الموجة
🎯 تطبيقات عملية
🎵 الصوتيات
يراعي تصميم قاعات الحفلات تداخل الموجات الصوتية
📡 الاتصالات اللاسلكية
يسمح الحيود لموجات الراديو بالالتفاف حول الجبال والمباني
🔬 البصريات
يستخدم تداخل الضوء في الليزر والهولوغرام
🌊 علوم المحيطات
تساعد دراسة أمواج البحر في التنبؤ بالطقس
0.5) {
ctx.globalAlpha = intensity * (amplitude / 40);
ctx.beginPath();
ctx.moveTo(x, 0);
ctx.lineTo(x, canvas.height);
ctx.stroke();
}
}
ctx.globalAlpha = 1;
// Дифрагированные волны справа от щели
const slitSource = { x: barrierX, y: slitY };
for (let angle = -Math.PI/2; angle <= Math.PI/2; angle += Math.PI/20) {
const maxDist = canvas.width - barrierX;
for (let dist = 0; dist < maxDist; dist += 3) {
const x = slitSource.x + dist * Math.cos(angle);
const y = slitSource.y + dist * Math.sin(angle);
if (x >= barrierX && x < canvas.width && y >= 0 && y < canvas.height) {
const wavePhase = (dist / waveLength - time * frequency) * 2 * Math.PI;
const waveValue = Math.sin(wavePhase);
const distanceFactor = Math.max(0, 1 - dist / maxDist);
const angleFactor = Math.cos(angle) * Math.cos(angle);
if (waveValue > 0.3) {
const intensity = waveValue * distanceFactor * angleFactor * (amplitude / 40);
if (intensity > 0.1) {
ctx.fillStyle = 'rgba(255, 152, 0, ' + intensity + ')';
ctx.fillRect(x-1, y-1, 2, 2);
}
}
}
}
}
// Подписи (отодвинули от краев)
ctx.fillStyle = '#fff';
ctx.font = '12px Arial';
ctx.textAlign = 'center';
ctx.fillText("\u0627\u0644\u0634\u0642", barrierX, Math.max(30, 20));
ctx.fillText("\u0627\u0644\u062d\u064a\u0648\u062f", Math.min(barrierX + 80, canvas.width - 50), Math.max(slitY - 40, 30));
}
// Рисование интерференции от двух щелей с экраном
function drawInterference() {
ctx.clearRect(0, 0, canvas.width, canvas.height);
const barrierX = canvas.width * 0.25;
const screenX = canvas.width * 0.6; // Экран ближе к щелям
const slitDistance = 50;
const centerY = canvas.height / 2;
const slit1Y = centerY - slitDistance/2;
const slit2Y = centerY + slitDistance/2;
const slitWidth = 6;
const waveSpeed = 50;
const waveLength = waveSpeed / frequency;
// Рисуем барьер с двумя щелями
ctx.fillStyle = '#444';
ctx.fillRect(barrierX - 3, 0, 6, slit1Y - slitWidth/2);
ctx.fillRect(barrierX - 3, slit1Y + slitWidth/2, 6, slit2Y - slitWidth/2 - (slit1Y + slitWidth/2));
ctx.fillRect(barrierX - 3, slit2Y + slitWidth/2, 6, canvas.height - (slit2Y + slitWidth/2));
// Падающие волны слева
ctx.strokeStyle = 'rgba(33, 150, 243, 0.6)';
ctx.lineWidth = 1;
for (let x = 0; x < barrierX; x += waveLength/3) {
const wavePhase = (x / waveLength - time * frequency) * 2 * Math.PI;
const intensity = Math.sin(wavePhase);
if (intensity > 0.5) {
ctx.globalAlpha = intensity * 0.5;
ctx.beginPath();
ctx.moveTo(x, 0);
ctx.lineTo(x, canvas.height);
ctx.stroke();
}
}
ctx.globalAlpha = 1;
// Источники в щелях
ctx.fillStyle = '#ff4444';
ctx.beginPath();
ctx.arc(barrierX, slit1Y, 3, 0, 2 * Math.PI);
ctx.fill();
ctx.beginPath();
ctx.arc(barrierX, slit2Y, 3, 0, 2 * Math.PI);
ctx.fill();
// Анимированные волны от источников
ctx.strokeStyle = 'rgba(76, 175, 80, 0.3)';
ctx.lineWidth = 1;
for (let i = 0; i < 5; i++) {
const radius = (time * 30 + i * 25) % 120; // Уменьшили радиус
if (radius > 5) {
const alpha = Math.max(0, 0.3 - radius / 400);
ctx.globalAlpha = alpha;
// От первой щели
ctx.beginPath();
ctx.arc(barrierX, slit1Y, radius, 0, 2 * Math.PI);
ctx.stroke();
// От второй щели
ctx.beginPath();
ctx.arc(barrierX, slit2Y, radius, 0, 2 * Math.PI);
ctx.stroke();
}
}
ctx.globalAlpha = 1;
// Экран справа
ctx.fillStyle = '#222';
ctx.fillRect(screenX - 2, 0, 4, canvas.height);
// Статичная интерференционная картина на экране
const pattern = createInterferencePattern();
pattern.forEach(stripe => {
const { y, color, alpha, width } = stripe;
ctx.fillStyle = 'rgba(' + color[0] + ', ' + color[1] + ', ' + color[2] + ', ' + alpha + ')';
ctx.fillRect(screenX + 2, y, width, 1);
});
// Подписи (размещены подальше от краев)
ctx.fillStyle = '#fff';
ctx.font = '12px Arial';
ctx.textAlign = 'center';
// Подписи щелей
const labelX = Math.max(barrierX - 25, 40);
ctx.fillText("\u0627\u0644\u0634\u0642 1", labelX, Math.max(slit1Y - 10, 20));
ctx.fillText("\u0627\u0644\u0634\u0642 2", labelX, Math.min(slit2Y + 20, canvas.height - 10));
// Подпись экрана
ctx.fillText("\u0627\u0644\u0634\u0627\u0634\u0629", screenX, Math.max(canvas.height - 15, canvas.height - 10));
// Подпись интерференции (размещена безопасно)
const interferenceX = Math.min(screenX + 30, canvas.width - 60);
const interferenceY = Math.max(35, 25);
ctx.font = '11px Arial';
ctx.fillText("\u0627\u0644\u062a\u062f\u0627\u062e\u0644", interferenceX, interferenceY);
}
// Рисование бокового вида волны
function drawSideView() {
ctx.clearRect(0, 0, canvas.width, canvas.height);
const centerY = canvas.height / 2;
const waveLength = 100 / frequency;
const maxAmplitude = Math.min(amplitude, canvas.height / 3);
// Ось X
ctx.strokeStyle = '#666';
ctx.lineWidth = 1;
ctx.beginPath();
ctx.moveTo(0, centerY);
ctx.lineTo(canvas.width, centerY);
ctx.stroke();
// Разметка оси
ctx.fillStyle = '#888';
ctx.font = '10px Arial';
ctx.textAlign = 'center';
for (let x = 0; x < canvas.width; x += waveLength) {
if (x > 20 && x < canvas.width - 20) { // Отступ от краев
ctx.beginPath();
ctx.moveTo(x, centerY - 5);
ctx.lineTo(x, centerY + 5);
ctx.stroke();
ctx.fillText('λ', x, centerY + 15);
}
}
// Волна
ctx.strokeStyle = '#4CAF50';
ctx.lineWidth = 3;
ctx.beginPath();
for (let x = 0; x < canvas.width; x += 2) {
const phase = (x / waveLength + time * frequency * 2) * 2 * Math.PI;
const y = centerY - maxAmplitude * Math.sin(phase);
if (x === 0) {
ctx.moveTo(x, y);
} else {
ctx.lineTo(x, y);
}
}
ctx.stroke();
// Стрелки амплитуды
ctx.strokeStyle = '#ff4444';
ctx.lineWidth = 2;
const arrowX = canvas.width * 0.25;
// Стрелка вверх
ctx.beginPath();
ctx.moveTo(arrowX, centerY);
ctx.lineTo(arrowX, centerY - maxAmplitude);
ctx.stroke();
// Стрелка вниз
ctx.beginPath();
ctx.moveTo(arrowX, centerY);
ctx.lineTo(arrowX, centerY + maxAmplitude);
ctx.stroke();
// Подписи (размещены с отступом от краев)
ctx.fillStyle = '#fff';
ctx.font = '14px Arial';
ctx.textAlign = 'left';
const labelY = Math.max(centerY - maxAmplitude - 10, 25);
ctx.fillText("\u0627\u0644\u0633\u0639\u0629", Math.max(arrowX - 20, 20), labelY);
ctx.fillText('A = ' + amplitude, Math.max(arrowX - 20, 20), Math.max(labelY - 15, 15));
ctx.textAlign = 'center';
ctx.fillText("\u0627\u062a\u062c\u0627\u0647 \u0627\u0644\u0627\u0646\u062a\u0634\u0627\u0631 \u2192", canvas.width/2, Math.max(40, 30));
ctx.fillText("\u0627\u0644\u062a\u0631\u062f\u062f = " + frequency + " \u0647\u0631\u062a\u0632", canvas.width/2, Math.min(canvas.height - 10, canvas.height - 20));
}
// Анимация
function animate() {
if (!isAnimating) return;
switch(currentExperiment) {
case 'propagation':
drawPropagation();
break;
case 'diffraction':
drawDiffraction();
break;
case 'interference':
drawInterference();
break;
case 'sideview':
drawSideView();
break;
}
time += 0.02;
animationFrame = requestAnimationFrame(animate);
}
// Управление экспериментами
window.switchExperiment = function(experiment) {
const buttons = document.querySelectorAll('.experiment-btn');
const cards = document.querySelectorAll('.theory-card');
const info = document.getElementById('experimentInfo');
buttons.forEach(btn => btn.classList.remove('active'));
cards.forEach(card => card.style.display = 'none');
currentExperiment = experiment;
time = 0;
const btnIds = {
'propagation': 'wavePropBtn',
'diffraction': 'diffractionBtn',
'interference': 'interferenceBtn',
'sideview': 'sideViewBtn'
};
const activeBtn = document.getElementById(btnIds[experiment]);
const activeCard = document.getElementById(experiment + 'Card');
if (activeBtn) activeBtn.classList.add('active');
if (activeCard) activeCard.style.display = 'block';
if (info) {
const titles = {
'propagation': "\u0627\u0646\u062a\u0634\u0627\u0631 \u0627\u0644\u0645\u0648\u062c\u0627\u062a",
'diffraction': "\u062d\u064a\u0648\u062f \u0627\u0644\u0645\u0648\u062c\u0627\u062a",
'interference': "\u062a\u062f\u0627\u062e\u0644 \u0627\u0644\u0645\u0648\u062c\u0627\u062a",
'sideview': "\u0645\u0644\u0641 \u0627\u0644\u0645\u0648\u062c\u0629"
};
const descriptions = {
'propagation': "\u062a\u0646\u062a\u0634\u0631 \u0627\u0644\u0645\u0648\u062c\u0627\u062a \u0645\u0646 \u0627\u0644\u0645\u0635\u062f\u0631 \u0641\u064a \u062f\u0648\u0627\u0626\u0631 \u0645\u062a\u062d\u062f\u0629 \u0627\u0644\u0645\u0631\u0643\u0632.",
'diffraction': "\u062a\u0645\u0631 \u0627\u0644\u0645\u0648\u062c\u0629 \u0639\u0628\u0631 \u0627\u0644\u0634\u0642 \u0648\u062a\u0646\u062a\u0634\u0631 \u0643\u0627\u0644\u0645\u0631\u0648\u062d\u0629.",
'interference': "\u064a\u062e\u0644\u0642 \u0627\u0644\u0634\u0642\u0627\u0646 \u0646\u0645\u0637 \u062a\u062f\u0627\u062e\u0644 \u062b\u0627\u0628\u062a\u0627\u064b \u0639\u0644\u0649 \u0627\u0644\u0634\u0627\u0634\u0629.",
'sideview': "\u062a\u062a\u062d\u0631\u0643 \u0627\u0644\u0645\u0648\u062c\u0629 \u0627\u0644\u062c\u064a\u0628\u064a\u0629 \u0641\u064a \u0627\u0644\u0641\u0636\u0627\u0621."
};
info.innerHTML = '
' + titles[experiment] + ' ' + descriptions[experiment] + '
';
}
};
// Обновление параметров волн
window.updateWaveParams = function() {
const freqSlider = document.getElementById('frequencySlider');
const ampSlider = document.getElementById('amplitudeSlider');
const freqValue = document.getElementById('frequencyValue');
const ampValue = document.getElementById('amplitudeValue');
if (freqSlider && freqValue) {
frequency = parseFloat(freqSlider.value);
freqValue.textContent = frequency + " \u0647\u0631\u062a\u0632";
}
if (ampSlider && ampValue) {
amplitude = parseFloat(ampSlider.value);
ampValue.textContent = amplitude;
}
// Пересчитать интерференционную картину при изменении параметров
interferencePattern = null;
};
// Управление анимацией
window.toggleWaveAnimation = function() {
const btn = document.getElementById('playPauseWaveBtn');
if (!btn) return;
if (isAnimating) {
isAnimating = false;
cancelAnimationFrame(animationFrame);
btn.textContent = "\u25b6\ufe0f \u062a\u0634\u063a\u064a\u0644";
} else {
isAnimating = true;
animate();
btn.textContent = "\u23f8\ufe0f \u0625\u064a\u0642\u0627\u0641 \u0645\u0624\u0642\u062a";
}
};
window.resetWaveAnimation = function() {
time = 0;
if (!isAnimating) {
switch(currentExperiment) {
case 'propagation':
drawPropagation();
break;
case 'diffraction':
drawDiffraction();
break;
case 'interference':
drawInterference();
break;
case 'sideview':
drawSideView();
break;
}
}
};
// Запуск анимации
animate();
})()"
style="display: none;">