کام:
لہروں کا پھیلاؤ، انحراف، مداخلت
لہروں کی انٹرایکٹو لیبارٹری
انٹرایکٹو ویوز لیب میں خوش آمدید! یہاں آپ لہروں کے تین اہم مظاہر کا مطالعہ کر سکتے ہیں: پھیلاؤ، انحراف (diffraction) اور مداخلت (interference)۔
تجربہ منتخب کریں:
📡 پھیلاؤ
🌊 انحراف
⚡ مداخلت
📊 لہر کا پروفائل
لہروں کا پھیلاؤ
لہریں منبع سے تمام سمتوں میں مستقل رفتار سے پھیلتی ہیں۔
🌐 لہروں کا پھیلاؤ
لہریں مادہ منتقل کیے بغیر توانائی منتقل کرتی ہیں۔ یہ منبع سے ہم مرکز دائروں کی صورت میں پھیلتی ہیں۔
پھیلاؤ کی رفتار واسطے (میڈیم) پر منحصر ہے
ایمپلیٹیوڈ لہر کی شدت کا تعین کرتا ہے
پھیلاؤ کے دوران فریکوئنسی مستقل رہتی ہے
🌊 لہروں کا انحراف
انحراف لہروں کی رکاوٹوں کے گرد مڑنے اور تنگ سوراخوں سے گزرنے کی صلاحیت ہے۔
یہ تب زیادہ واضح ہوتا ہے جب رکاوٹ کا سائز لہر کی لمبائی کے برابر ہو
سوراخ سے گزرنے کے بعد لہر پنکھے کی طرح پھیل جاتی ہے
یہ کونے کے پیچھے آواز پہنچنے کی وضاحت کرتا ہے
⚡ لہروں کی مداخلت
مداخلت دو مربوط ذرائع سے آنے والی لہروں کا ایک دوسرے پر چڑھنا ہے (ینگ کا ڈبل سلٹ تجربہ)۔
روشن پٹیاں - تعمیری مداخلت
تاریک پٹیاں - تخریبی مداخلت
پٹیوں کے درمیان فاصلہ لہر کی لمبائی پر منحصر ہے
📊 لہر کا پروفائل
سائیڈ ویو لہر کی شکل دکھاتا ہے - ایک سائن ویو جو خلا میں حرکت کرتی ہے۔
ایمپلیٹیوڈ - توازن سے زیادہ سے زیادہ ہٹاؤ
لہر کی لمبائی فریکوئنسی اور رفتار پر منحصر ہے
فریکوئنسی جتنی زیادہ ہوگی، لہر کی لمبائی اتنی ہی کم ہوگی
🎯 عملی اطلاقات
🎵 صوتیات (Acoustics)
کنسرٹ ہالز کا ڈیزائن آواز کی لہروں کی مداخلت کو مدنظر رکھتا ہے
📡 ریڈیو مواصلات
انحراف ریڈیو لہروں کو پہاڑوں اور عمارتوں کے گرد مڑنے میں مدد دیتا ہے
🔬 بصریات (Optics)
روشنی کی مداخلت لیزر اور ہولوگرافی میں استعمال ہوتی ہے
🌊 سمندری علوم
سمندری لہروں کا مطالعہ موسم کی پیش گوئی میں مدد کرتا ہے
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("\u0633\u0648\u0631\u0627\u062e (\u0633\u0644\u0679)", barrierX, Math.max(30, 20));
ctx.fillText("\u0627\u0646\u062d\u0631\u0627\u0641", 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("\u0633\u0648\u0631\u0627\u062e 1", labelX, Math.max(slit1Y - 10, 20));
ctx.fillText("\u0633\u0648\u0631\u0627\u062e 2", labelX, Math.min(slit2Y + 20, canvas.height - 10));
// Подпись экрана
ctx.fillText("\u0627\u0633\u06a9\u0631\u06cc\u0646", 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("\u0645\u062f\u0627\u062e\u0644\u062a", 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\u06cc\u0645\u067e\u0644\u06cc\u0679\u06cc\u0648\u0688", 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("\u067e\u06be\u06cc\u0644\u0627\u0624 \u06a9\u06cc \u0633\u0645\u062a \u2192", canvas.width/2, Math.max(40, 30));
ctx.fillText("\u0641\u0631\u06cc\u06a9\u0648\u0626\u0646\u0633\u06cc = " + frequency + " \u06c1\u0631\u0679\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': "\u0644\u06c1\u0631\u0648\u06ba \u06a9\u0627 \u067e\u06be\u06cc\u0644\u0627\u0624",
'diffraction': "\u0644\u06c1\u0631\u0648\u06ba \u06a9\u0627 \u0627\u0646\u062d\u0631\u0627\u0641",
'interference': "\u0644\u06c1\u0631\u0648\u06ba \u06a9\u06cc \u0645\u062f\u0627\u062e\u0644\u062a",
'sideview': "\u0644\u06c1\u0631 \u06a9\u0627 \u067e\u0631\u0648\u0641\u0627\u0626\u0644"
};
const descriptions = {
'propagation': "\u0644\u06c1\u0631\u06cc\u06ba \u0645\u0646\u0628\u0639 \u0633\u06d2 \u06c1\u0645 \u0645\u0631\u06a9\u0632 \u062f\u0627\u0626\u0631\u0648\u06ba \u0645\u06cc\u06ba \u067e\u06be\u06cc\u0644\u062a\u06cc \u06c1\u06cc\u06ba\u06d4",
'diffraction': "\u0644\u06c1\u0631 \u0633\u0648\u0631\u0627\u062e \u0633\u06d2 \u06af\u0632\u0631\u062a\u06cc \u06c1\u06d2 \u0627\u0648\u0631 \u067e\u0646\u06a9\u06be\u06d2 \u06a9\u06cc \u0637\u0631\u062d \u067e\u06be\u06cc\u0644\u062a\u06cc \u06c1\u06d2\u06d4",
'interference': "\u062f\u0648 \u0633\u0648\u0631\u0627\u062e \u0627\u0633\u06a9\u0631\u06cc\u0646 \u067e\u0631 \u0627\u06cc\u06a9 \u0633\u0627\u06a9\u0646 \u0645\u062f\u0627\u062e\u0644\u062a\u06cc \u067e\u06cc\u0679\u0631\u0646 \u0628\u0646\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4",
'sideview': "\u0627\u06cc\u06a9 \u0633\u0627\u0626\u0646 \u0644\u06c1\u0631 \u062e\u0644\u0627 \u0645\u06cc\u06ba \u062d\u0631\u06a9\u062a \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4"
};
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 + " \u06c1\u0631\u0679\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 \u0686\u0644\u0627\u0626\u06cc\u06ba";
} else {
isAnimating = true;
animate();
btn.textContent = "\u23f8\ufe0f \u0648\u0642\u0641\u06c1";
}
};
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;">