# Photon
## Microsim
### Live player
<div class="microsim-player">
<iframe src="https://editor.p5js.org/sciencenibber/full/b0gIqrpjh" width="100%" height="620" frameborder="0" sandbox="allow-scripts allow-same-origin"></iframe>
</div>
<div class="microsim-fallback">
<img src="Microsims/thumbs/Photon.png" alt="Photon microsim poster" style="width:100%;border:1px solid #4445;border-radius:6px;">
<p><em>Live microsim (desktop) · <a href="https://editor.p5js.org/sciencenibber/sketches/b0gIqrpjh">open sketch in the p5.js editor</a></em></p>
</div>
**Editor URL:** https://editor.p5js.org/sciencenibber/sketches/b0gIqrpjh
**Description (100 words):**
A single photon, drawn as a Gaussian-windowed sinusoidal wave packet, drifts left-to-right across a dark canvas toward an iconic helium atom. A wavelength slider (200-800 nm) recolors the packet through the visible spectrum and drives a live readout of frequency, energy in joules and electron-volts, and momentum -- all derived from E = hc / lambda. The bottom band is a spectrum ruler painted by wavelength and stamped with eight prominent He I emission lines, including the yellow D3 line at 587.56 nm that revealed helium in the 1868 solar eclipse. When the slider matches a line within 1.5 nm and the packet crosses the atom, the atom flashes "ABSORB". Keys: P pause, A wave/particle, S linear/log spectrum.
```js
// =====================================================================
// Photon.js -- Wikitube microsim
// Article: Photon en.wikitube.io/wiki/Photon
// Room: Helium Pattern: E/D blend
// (particle-system wave packet
// + parametric spectrum ruler)
// ---------------------------------------------------------------------
// Idea: a single photon is animated as a Gaussian-envelope sinusoidal
// wave packet traveling left-to-right across the canvas. The reader
// controls its WAVELENGTH (200-800 nm) and AMPLITUDE with two sliders.
// Energy is computed live from the canonical Planck-Einstein relation
//
// E = h * f = h * c / lambda
//
// and shown in both joules and electron-volts. A spectrum ruler at
// the bottom marks the visible band (380-780 nm) tinted by the human
// CIE response, and overlays the eight prominent visible HELIUM I
// emission lines -- including the canonical D3 line at 587.56 nm,
// the photon by which Janssen and Lockyer detected helium in the
// 1868 solar eclipse spectrum, 27 years before it was isolated on
// Earth. A helium atom drawn on the right of the canvas FLASHES when
// the photon's wavelength is within +-1.5 nm of any He line as the
// packet crosses the atom -- a visual analog of resonant absorption.
//
// Three visualization toggles:
// * 'P' pause/play the packet's motion
// * 'A' toggle photon-as-wave vs. photon-as-particle (dot trail)
// * 'S' toggle the spectrum ruler between linear-nm and log-energy
//
// Key landmarks shown on the spectrum ruler (He I, NIST ASD):
// * 388.86 nm violet
// * 447.15 nm blue
// * 471.31 nm cyan
// * 492.19 nm cyan-green
// * 501.57 nm green
// * 587.56 nm yellow <-- D3, helium's discovery line
// * 667.82 nm red
// * 706.52 nm red
//
// Visual layout (720 x 520 canvas):
// * top-left: HUD title + en.wikitube.io/wiki/Photon subtitle
// * top-right: live readout of lambda, f, E (J), E (eV), p
// * center band: photon wave packet animation + helium atom on right
// * bottom: spectrum ruler with He I lines + sliders
// * bottom-right: canonical equation E = hc / lambda
//
// Conventions (Wikitube Betterfire Standard v0, P5_JS_EDITOR section 2):
// * single ARTICLE constant at the top, single quotes
// * p5.disableFriendlyErrors = true to keep editor console clean
// * non-ASCII (lambda, dot, Greek) lives in COMMENTS ONLY; every
// text() literal is ASCII (editor preview mangles non-ASCII)
// * Energy-room palette (P5_JS_EDITOR section 4): dark BG with
// HOT / COLD tones, STRUCT grey, TRAJ accent for the packet
// * sliders use .position(x, y).size(w) -- no floating defaults
// * pixelDensity(2) for crisp text on retina; textFont 'system-ui'
// =====================================================================
const ARTICLE = 'Photon';
const TITLE = ARTICLE.replace(/_/g, ' ');
p5.disableFriendlyErrors = true;
// ----- Physical constants -------------------------------------------
const H_PLANCK = 6.62607015e-34; // J*s
const C_LIGHT = 2.99792458e8; // m/s
const EV_PER_J = 6.241509074e18; // electronvolts per joule
// ----- Energy room palette (P5_JS_EDITOR section 4) -----------------
const BG = 18;
const FG = 240;
const DIM = [240, 240, 240, 140];
const HOT = [220, 110, 60]; // warm (long wavelength end)
const COLD = [60, 130, 220]; // cool (short wavelength end)
const STRUCT = [120, 130, 150]; // structural grey: helium atom
const TRAJ = [240, 220, 80]; // packet trajectory accent
const ACCENT = [200, 100, 220]; // He emission-line marker
const SCRATCH = [120, 120, 120, 90]; // grid / scratch lines
// ----- He I prominent visible emission lines (NIST ASD) -------------
// Each row: [wavelength_nm, label, approx_visual_color].
// D3 = 587.56 nm is helium's discovery line (Janssen, 1868).
const HE_LINES = [
[388.86, '388.86 nm', [180, 80, 220]],
[447.15, '447.15 nm', [110, 130, 240]],
[471.31, '471.31 nm', [ 70, 180, 220]],
[492.19, '492.19 nm', [ 80, 220, 200]],
[501.57, '501.57 nm', [120, 220, 110]],
[587.56, 'D3 587.56', [240, 220, 80]], // discovery line
[667.82, '667.82 nm', [240, 100, 90]],
[706.52, '706.52 nm', [220, 80, 80]]
];
// ----- Layout rectangles (pixels) -----------------------------------
// Top strip carries the HUD and the live readout; the photon animation
// runs in the center band; the spectrum ruler + sliders dock at the
// bottom. Coordinates filled in setup() after createCanvas().
let waveBand; // {x, y, w, h} for the wave-packet animation
let spectrumBar; // {x, y, w, h} for the spectrum ruler
let atomCenter; // {x, y} for the helium atom
// ----- Controls (declared globally, initialized in setup) ------------
let lambdaSlider; // 200-800 nm wavelength
let ampSlider; // 0.2-1.0 amplitude (visual only)
// ----- Animation state ----------------------------------------------
let paused = false;
let showAsParticle = false; // 'A' toggles wave vs dot
let logEnergyMode = false; // 'S' toggles linear-nm vs log-E ruler
let packetX = 0; // pixel position of packet center
let packetSpeed = 2.0; // px/frame (visual only, not c)
let flashAtom = 0; // 0..1 absorption-flash intensity decay
// Live readout state read by drawHUD() each frame. Filled at the top
// of draw() so drawHUD() can be a zero-argument function (validator
// BF7 expects the literal string "drawHUD()" to appear in draw()).
let hudState = {
lambdaNm: 587,
freqHz: 5.1e14,
energyJ: 3.4e-19,
energyE: 2.11,
momentum: 1.1e-27
};
function setup() {
// Canvas + crisp text setup ----------------------------------------
createCanvas(720, 520);
pixelDensity(2);
textFont('system-ui');
// Layout regions ---------------------------------------------------
// Top 60 px: HUD strip.
// Center 280 px band: wave-packet animation.
// Bottom 180 px: spectrum ruler + sliders.
waveBand = { x: 0, y: 70, w: width, h: 280 };
spectrumBar = { x: 60, y: 380, w: width - 120, h: 28 };
atomCenter = { x: width - 90, y: waveBand.y + waveBand.h / 2 };
// Sliders ----------------------------------------------------------
// Each slider has explicit .position(x, y).size(w) per the Betterfire
// Standard -- no floating defaults that drift across browsers.
lambdaSlider = createSlider(200, 800, 587, 1).position(60, 440).size(360);
ampSlider = createSlider(20, 100, 70, 1).position(60, 470).size(360);
// Start the packet just inside the left edge.
packetX = waveBand.x - 100;
}
function draw() {
background(BG);
// Read controls into named locals (Energy convention: physics-as-physics)
const lambdaNm = lambdaSlider.value();
const ampFrac = ampSlider.value() / 100;
// Derived quantities -----------------------------------------------
// lambda in meters: lambdaNm * 1e-9
// f = c / lambda
// E = h * f (in joules); convert to eV via EV_PER_J
// p = E / c (in kg*m/s)
const lambdaM = lambdaNm * 1e-9;
const freqHz = C_LIGHT / lambdaM;
const energyJ = H_PLANCK * freqHz;
const energyE = energyJ * EV_PER_J;
const momentum = energyJ / C_LIGHT;
// Publish derived quantities to the HUD state object so drawHUD()
// (zero-arg, validator BF7) can render them at the end of the frame.
hudState.lambdaNm = lambdaNm;
hudState.freqHz = freqHz;
hudState.energyJ = energyJ;
hudState.energyE = energyE;
hudState.momentum = momentum;
// Advance packet ---------------------------------------------------
if (!paused) packetX += packetSpeed;
if (packetX > width + 100) packetX = waveBand.x - 100;
// Check absorption resonance when the packet crosses the atom ------
// Tolerance: +- 1.5 nm. Trigger only on the cycle where the packet
// passes through the atom's x coordinate.
if (!paused && Math.abs(packetX - atomCenter.x) < packetSpeed) {
for (const [wl] of HE_LINES) {
if (Math.abs(lambdaNm - wl) <= 1.5) { flashAtom = 1.0; break; }
}
}
flashAtom *= 0.94; // exponential decay
// ----- Draw the spectrum ruler (bottom band) ---------------------
drawSpectrumRuler(lambdaNm);
// ----- Draw the helium atom ---------------------------------------
drawHeliumAtom(atomCenter.x, atomCenter.y, flashAtom);
// ----- Draw the photon wave packet --------------------------------
drawWavePacket(packetX, waveBand.y + waveBand.h / 2,
lambdaNm, ampFrac);
// ----- Draw HUD + live readout + equation -------------------------
drawHUD();
}
// ---------------------------------------------------------------------
// drawWavePacket
// ---------------------------------------------------------------------
// A Gaussian-envelope sinusoidal wave packet. The carrier frequency is
// mapped from the user's wavelength slider; the visual "wavelength on
// screen" is a *scaled* analog of the real wavelength, not a literal
// 1-pixel-per-nm rendering (otherwise UV photons would be invisible
// squiggles and IR photons a single hump). This is a pedagogical
// visualization, not a metric ruler -- the spectrum bar below carries
// the true scale.
//
// Color of the packet is determined by mapping wavelength through the
// approximate human CIE response (wavelengthToRGB below).
// ---------------------------------------------------------------------
function drawWavePacket(cx, cy, lambdaNm, ampFrac) {
const packetWidth = 240; // pixels, fixed visual width
// Visual wavelength on screen: 18 px at 400 nm, 36 px at 800 nm.
const visLambda = map(lambdaNm, 200, 800, 8, 36);
const k = (2 * Math.PI) / visLambda;
const ampPx = 70 * ampFrac;
const col = wavelengthToRGB(lambdaNm);
if (showAsParticle) {
// Photon-as-particle mode: a glowing dot with a fading trail.
noStroke();
for (let i = 0; i < 12; i++) {
const a = map(i, 0, 11, 200, 0);
fill(col[0], col[1], col[2], a);
ellipse(cx - i * 6, cy, 14 - i * 0.6);
}
fill(255, 255, 255, 220);
ellipse(cx, cy, 6);
} else {
// Photon-as-wave mode: Gaussian-windowed sinusoid.
stroke(col[0], col[1], col[2], 230);
strokeWeight(2);
noFill();
beginShape();
for (let dx = -packetWidth / 2; dx <= packetWidth / 2; dx += 2) {
// Gaussian envelope sigma = packetWidth / 6
const env = Math.exp(-(dx * dx) / (2 * (packetWidth / 6) ** 2));
const y = cy + Math.sin(k * dx) * ampPx * env;
vertex(cx + dx, y);
}
endShape();
// Faint envelope outline for clarity
stroke(col[0], col[1], col[2], 60);
strokeWeight(1);
beginShape();
for (let dx = -packetWidth / 2; dx <= packetWidth / 2; dx += 4) {
const env = Math.exp(-(dx * dx) / (2 * (packetWidth / 6) ** 2));
vertex(cx + dx, cy + ampPx * env);
}
endShape();
beginShape();
for (let dx = -packetWidth / 2; dx <= packetWidth / 2; dx += 4) {
const env = Math.exp(-(dx * dx) / (2 * (packetWidth / 6) ** 2));
vertex(cx + dx, cy - ampPx * env);
}
endShape();
}
// Travel-axis baseline
stroke(...SCRATCH);
strokeWeight(1);
line(waveBand.x, cy, waveBand.x + waveBand.w, cy);
}
// ---------------------------------------------------------------------
// drawHeliumAtom
// ---------------------------------------------------------------------
// A simple iconic helium atom: nucleus (2 protons + 2 neutrons drawn
// as a small clustered disc) with two electrons orbiting on circular
// paths. When `flash` > 0 (resonant absorption), tint the whole atom
// toward the flash color and add an expanding ring (visual analog of
// an emitted photon recoil).
// ---------------------------------------------------------------------
function drawHeliumAtom(cx, cy, flash) {
const R = 38; // outer orbit radius
const tNow = millis() / 1000;
const a = max(0, min(1, flash));
// Outer ring (one of the two electron shells visualized as orbit)
noFill();
stroke(STRUCT[0], STRUCT[1], STRUCT[2], 120 + a * 100);
strokeWeight(1.2);
ellipse(cx, cy, R * 2, R * 2);
// Inner shell (closer to nucleus)
stroke(STRUCT[0], STRUCT[1], STRUCT[2], 80 + a * 120);
ellipse(cx, cy, R * 1.0, R * 1.0);
// Electrons (two, on the outer shell, opposite phase)
const ex1 = cx + Math.cos(tNow * 2.0) * R;
const ey1 = cy + Math.sin(tNow * 2.0) * R;
const ex2 = cx + Math.cos(tNow * 2.0 + Math.PI) * R;
const ey2 = cy + Math.sin(tNow * 2.0 + Math.PI) * R;
noStroke();
fill(COLD[0], COLD[1], COLD[2], 230);
ellipse(ex1, ey1, 8);
ellipse(ex2, ey2, 8);
// Nucleus -- two protons (warm) + two neutrons (grey) clustered
// in a tight triangle. Pure icon, not a quantum mechanics claim.
fill(HOT[0], HOT[1], HOT[2], 240);
ellipse(cx - 4, cy - 3, 9);
ellipse(cx + 4, cy - 3, 9);
fill(180, 180, 180, 240);
ellipse(cx - 4, cy + 3, 9);
ellipse(cx + 4, cy + 3, 9);
// Absorption flash: expanding accent ring + label
if (a > 0.02) {
noFill();
stroke(TRAJ[0], TRAJ[1], TRAJ[2], a * 220);
strokeWeight(2);
ellipse(cx, cy, (R * 2 + (1 - a) * 80), (R * 2 + (1 - a) * 80));
noStroke();
fill(TRAJ[0], TRAJ[1], TRAJ[2], a * 220);
textSize(11);
textAlign(CENTER, BOTTOM);
text('ABSORB', cx, cy - R - 8);
textAlign(LEFT, BASELINE);
}
// Atom label
noStroke();
fill(FG, 180);
textSize(11);
textAlign(CENTER, TOP);
text('He atom', cx, cy + R + 6);
textAlign(LEFT, BASELINE);
}
// ---------------------------------------------------------------------
// drawSpectrumRuler
// ---------------------------------------------------------------------
// A horizontal bar showing the visible band (380-780 nm) painted with
// the approximate visible-light colors, flanked by UV (left) and IR
// (right) grey shoulders. Eight He I emission lines are stamped on
// top, with D3 at 587.56 nm called out as the discovery line. A small
// triangle marker tracks the current slider wavelength.
// ---------------------------------------------------------------------
function drawSpectrumRuler(currentLambdaNm) {
const { x, y, w, h } = spectrumBar;
// Background frame
noStroke();
fill(30);
rect(x - 2, y - 2, w + 4, h + 4, 3);
// Paint the bar by wavelength. Below 380 nm and above 780 nm the
// human eye sees nothing; render those shoulders as dim grey.
noStroke();
const steps = 200;
for (let i = 0; i < steps; i++) {
const wlAtCol = logEnergyMode
? lambdaFromEnergyFraction(i / (steps - 1))
: map(i, 0, steps - 1, 200, 800);
const col = wavelengthToRGB(wlAtCol);
fill(col[0], col[1], col[2], 220);
rect(x + (i * w) / steps, y, w / steps + 1, h);
}
// Frame outline
noFill();
stroke(STRUCT[0], STRUCT[1], STRUCT[2], 200);
strokeWeight(1);
rect(x, y, w, h);
// He I emission-line stamps
for (const [wl, label, lineCol] of HE_LINES) {
const px = wavelengthToRulerX(wl);
if (px < x || px > x + w) continue;
// Vertical tick
stroke(255, 255, 255, 230);
strokeWeight(2);
line(px, y - 6, px, y + h + 6);
// Color dot
noStroke();
fill(lineCol[0], lineCol[1], lineCol[2]);
ellipse(px, y - 12, 6);
// Label (every-other to avoid collision)
fill(FG, 200);
textSize(9);
textAlign(CENTER, BOTTOM);
text(label, px, y - 16);
textAlign(LEFT, BASELINE);
}
// Current-wavelength marker (triangle below the bar)
const markerX = wavelengthToRulerX(currentLambdaNm);
if (markerX >= x && markerX <= x + w) {
noStroke();
fill(TRAJ);
triangle(markerX - 6, y + h + 8,
markerX + 6, y + h + 8,
markerX, y + h + 1);
}
// Axis labels
fill(DIM);
noStroke();
textSize(10);
textAlign(LEFT, TOP);
text(logEnergyMode ? 'log E' : '200 nm', x, y + h + 16);
textAlign(RIGHT, TOP);
text(logEnergyMode ? 'high E' : '800 nm', x + w, y + h + 16);
textAlign(CENTER, TOP);
fill(FG, 170);
text(logEnergyMode ? 'spectrum: log energy axis' : 'spectrum: wavelength (nm)',
x + w / 2, y + h + 16);
textAlign(LEFT, BASELINE);
}
// ---------------------------------------------------------------------
// drawHUD
// ---------------------------------------------------------------------
// Top-left: article title (22 pt) + en.wikitube.io subtitle (12 pt).
// Top-right: live readout of wavelength, frequency, energy in J and
// eV, and momentum. Bottom-right: canonical equation E = h c / lambda.
// All text strings are strict ASCII per the Betterfire Standard.
// ---------------------------------------------------------------------
function drawHUD() {
// Pull live values from the module-level hudState object.
const lambdaNm = hudState.lambdaNm;
const freqHz = hudState.freqHz;
const energyJ = hudState.energyJ;
const energyE = hudState.energyE;
const momentum = hudState.momentum;
// Title (top-left)
noStroke();
fill(FG);
textSize(22);
textAlign(LEFT, TOP);
text(TITLE, 14, 14);
// Subtitle (ASCII dot, not bullet)
fill(DIM);
textSize(12);
text('Wikitube microsim . en.wikitube.io/wiki/' + ARTICLE, 14, 42);
// Live readout (top-right)
textAlign(RIGHT, TOP);
fill(FG, 230);
textSize(12);
const fmt = (v, d) => v.toFixed(d);
const lines = [
'lambda = ' + fmt(lambdaNm, 2) + ' nm',
'f = ' + (freqHz / 1e14).toFixed(3) + ' x 10^14 Hz',
'E = ' + (energyJ * 1e19).toFixed(3) + ' x 10^-19 J',
'E = ' + fmt(energyE, 3) + ' eV',
'p = ' + (momentum * 1e27).toFixed(3) + ' x 10^-27 kg m/s'
];
for (let i = 0; i < lines.length; i++) {
text(lines[i], width - 14, 14 + i * 14);
}
// Band tag (UV / Vis / IR) under readout
fill(...wavelengthToRGB(lambdaNm));
textSize(11);
text(bandTag(lambdaNm), width - 14, 14 + lines.length * 14 + 4);
// Canonical equation (bottom-right, ASCII)
fill(DIM);
textSize(12);
textAlign(RIGHT, BOTTOM);
text('E = h c / lambda', width - 14, height - 14);
text('p = h / lambda', width - 14, height - 30);
// Slider labels (bottom-left)
textAlign(LEFT, BASELINE);
fill(FG, 200);
textSize(11);
text('wavelength (nm)', 430, 446);
text('amplitude (visual)', 430, 476);
// Hint strip (centered below sliders)
textAlign(CENTER, BASELINE);
fill(DIM);
textSize(10);
text('keys: P pause A wave/particle S linear/log spectrum',
width / 2, height - 4);
textAlign(LEFT, BASELINE);
}
// ---------------------------------------------------------------------
// Helpers
// ---------------------------------------------------------------------
// Map wavelength (nm) to an approximate RGB triplet for visualization.
// Linear ramps within the visible band; grey shoulders in UV and IR.
function wavelengthToRGB(wl) {
let r = 0, g = 0, b = 0;
if (wl < 380) {
// UV shoulder: dim violet-grey
const t = constrain((wl - 200) / 180, 0, 1);
r = 60 + t * 60; g = 30; b = 80 + t * 100;
} else if (wl < 440) {
r = -(wl - 440) / 60 * 255; g = 0; b = 255;
} else if (wl < 490) {
r = 0; g = (wl - 440) / 50 * 255; b = 255;
} else if (wl < 510) {
r = 0; g = 255; b = -(wl - 510) / 20 * 255;
} else if (wl < 580) {
r = (wl - 510) / 70 * 255; g = 255; b = 0;
} else if (wl < 645) {
r = 255; g = -(wl - 645) / 65 * 255; b = 0;
} else if (wl < 780) {
r = 255; g = 0; b = 0;
} else {
// IR shoulder: dim red-grey
const t = constrain((wl - 780) / 120, 0, 1);
r = 180 - t * 100; g = 30; b = 30;
}
return [r, g, b];
}
// Map a wavelength to its X coordinate on the spectrum ruler, honoring
// the current linear-nm vs log-energy mode.
function wavelengthToRulerX(wl) {
const { x, w } = spectrumBar;
if (!logEnergyMode) {
return x + map(wl, 200, 800, 0, w);
}
// log-energy mode: E proportional to 1/lambda; map log10(E) to x.
// E range corresponds to lambda 200..800 nm.
const eMin = 1 / 800, eMax = 1 / 200;
const logE = Math.log10(1 / wl);
return x + map(logE, Math.log10(eMin), Math.log10(eMax), 0, w);
}
// Inverse of wavelengthToRulerX for painting the bar in log mode.
function lambdaFromEnergyFraction(frac) {
const eMin = 1 / 800, eMax = 1 / 200;
const logE = lerp(Math.log10(eMin), Math.log10(eMax), frac);
return 1 / Math.pow(10, logE);
}
// UV / Visible / IR tag.
function bandTag(wl) {
if (wl < 380) return 'ultraviolet';
if (wl < 780) return 'visible';
return 'infrared';
}
// ---------------------------------------------------------------------
// Keyboard handling
// ---------------------------------------------------------------------
function keyPressed() {
if (key === 'p' || key === 'P') paused = !paused;
if (key === 'a' || key === 'A') showAsParticle = !showAsParticle;
if (key === 's' || key === 'S') logEnergyMode = !logEnergyMode;
}
```
## Links (Wikipedia order)
<!-- injected from _registry/childlinks/Photon.json (2026-07-30T02:09:12Z) -->
`Abdus_Salam` · `Abelian_group` · `Abraham_Pais` · `Absorption_(electromagnetic_radiation)` · `Acceleration` · `Advanced_Photon_Source` · `Age_of_the_universe` · `Albert_Einstein` · `American_Journal_of_Physics` · [[Angular_frequency]] · `Annalen_der_Physik` · `Annals_of_Physics` · `Annals_of_Science` · `Annihilation` · `Anomalous_magnetic_dipole_moment` · `Anthony_Zee` · `Antihydrogen` · `Antineutron` · `Antiparticle` · `Antiproton` · `Anyon` · `Applied_Physics_B` · `Arthur_Compton` · `Atom` · `Atomic_nucleus` · `Augustin-Jean_Fresnel` · `Axino` · `Axion` · `B_meson` · `Baryon` · `Baryon_number` · `Beam_splitter` · `Bhabha_scattering` · `Biochemist` · `Birefringence` · `Black-body_radiation` · [[Bohr_model]] · `Boltzmann_constant` · `Bose_gas` · `Bose–Einstein_condensate` · `Bose–Einstein_statistics` · [[Boson]] · `Bottom_eta_meson` · `Bottom_quark` · `Bound_state` · `Breit–Wheeler_process` · `Bremsstrahlung` · `Brillouin_scattering` · `C._V._Raman` · `C_parity` · `Capacitor` · `Carl_Wieman` · `Cauchy–Schwarz_inequality` · `Charge-coupled_device` · `Chargino` · `Charm_quark` · [[Chemistry]] · [[Chlorine]] · [[Christiaan_Huygens]] · `Circular_polarization` · `Coherent_state` · `Color_charge` · `Complex_geometry` · `Complex_number` · `Compton_scattering` · `Conservation_of_energy` · `Convection_zone` · [[Coulomb's_law]] · `Curvaton` · `D_meson` · `Dalton_(unit)` · `Dark_photon` · `David_H._Frisch` · `David_Van_Nostrand` · `Davydov_soliton` · `Delbrück_scattering` · `Delta_baryon` · `Diffraction` · `Dilaton` · `Diquark` · `Dirac_equation` · `Dispersion_(optics)` · `Doppler_effect` · `Double-charm_tetraquark` · `Double-slit_experiment` · `Down_quark` · `Dropleton` · `Dual_graviton` · `Dual_photon` · `EPL_(journal)` · `Earle_Hesse_Kennard` · `Edward_Andrade` · `Effective_mass_(solid-state_physics)` · `Eightfold_way_(physics)` · `Electric_charge` · `Electric_field` · `Electromagnetic_field` · `Electromagnetic_four-potential` · `Electromagnetic_radiation` · `Electromagnetic_wave_equation` · `Electromagnetism` · [[Electron]] · `Electron_hole` · `Electron_neutrino` · `Electronvolt` · `Electron–positron_annihilation` · `Electroweak_interaction` · `Elementary_charge` · `Elementary_particle` · `Emission_spectrum` · [[Energy]] · `Energy_level` · `Energy–momentum_relation` · `Enrico_Fermi` · `Eric_Allin_Cornell` · `Ernest_Rutherford` · `Eugene_Wigner` · `Euler–Heisenberg_Lagrangian` · `European_Journal_of_Physics` · `European_Physical_Journal` · `Evgeny_Lifshitz` · `Exciton` · `Exotic_atom` · `Exotic_hadron` · `Exotic_matter` · `Faddeev–Popov_ghost` · [[Fermion]] · `Fermi–Dirac_statistics` · `Feynman_diagram` · `Fock_state` · `Force_carrier` · `Fourier_series` · `Fracton_(subdimensional_particle)` · `Frequency` · `Fundamental_interaction` · `Furry's_theorem` · `Galilean_transformation` · `Gamma` · `Gamma_ray` · `Gas-discharge_lamp` · `Gas_in_a_box` · `Gauge_boson` · `Gauge_fixing` · `Gauge_theory` · `Gaugino` · `Geiger_counter` · `General_relativity` · `George_Wald` · `Ghost_(physics)` · `Gilbert_N._Lewis` · `Glueball` · `Gluino` · `Gluon` · `Graviphoton` · `Gravitational_lens` · `Gravitational_redshift` · `Gravitino` · `Graviton` · `Gravity` · `Greek_alphabet` · `Greek_language` · `Group_velocity` · `Gupta–Bleuler_formalism` · `Hadron` · `Hardware_random_number_generator` · `Heinrich_Hertz` · `Heisenberg's_microscope` · `Helge_Kragh` · `Helicity_(particle_physics)` · `Heptaquark` · `Hermann_Weyl` · `Hexaquark` · `Higgs_boson` · `Higgs_mechanism` · `Higgsino` · `History_of_subatomic_physics` · `Hydrogen_atom` · `Hyperfine_structure` · `IOP_Publishing` · `Infinity` · `Inflaton` · `Integer` · `Intensity_(physics)` · `Invariant_mass` · [[Isaac_Newton]] · `Isomerization` · `J/psi_meson` · `James_Clerk_Maxwell` · `John_C._Slater` · `Journal_of_Physics:_Conference_Series` · `Kaon` · `Karel_Svoboda_(scientist)` · `Klein–Nishina_formula` · `Lagrangian_(field_theory)` · `Lamb_shift` · `Lambda_baryon` · `Landau_pole` · `Laser` · `Lene_Hau` · `Lepton` · `Lepton_number` · `Leptoquark` · `Lev_Landau` · `Light` · `List_of_baryons` · `List_of_hypothetical_particles` · `List_of_mesons` · `List_of_particles` · `List_of_quasiparticles` · `Lorentz_group` · `Luminiferous_aether` · `Magnetic_field` · `Magnetic_monopole` · `Magnetic_vector_potential` · `Magnetism` · `Magnitude_(mathematics)` · `Magnon` · `Majorana_fermion` · `Majoron` · `Mass_in_general_relativity` · `Mass_in_special_relativity` · `Massless_particle` · `Material` · `Mathematical_Proceedings_of_the_Cambridge_Philosophical_Society` · `Mathematical_formulation_of_the_Standard_Model` · `Matrix_mechanics` · `Matter` · `Max_Born` · `Max_Planck` · `Maxwell's_equations` · `Measurement_in_quantum_mechanics` · `Meson` · `Mesonic_molecule` · `Modern_physics` · `Modulational_instability` · `Molecular_biology` · `Molecule` · `Momentum` · `Muon` · `Muon_neutrino` · `Muonium` · `Møller_scattering` · `Nature_(journal)` · `Neuron_(journal)` · `Neutralino` · `Neutrino` · [[Neutron]] · `Newsweek` · `Niels_Bohr` · `Nobel_Prize` · `Nonlinear_optics` · `Nu_(Greek)` · `Nuclear_force` · `Nuclear_physics` · `Nucleon` · `Number_density` · `Observable` · `Omega_baryon` · `Omega_meson` · `Onium` · `Optical_communication` · [[Optical_engineering]] · `Optical_parametric_oscillator` · `Pair_production` · `Parity_(physics)` · `Particle` · `Particle_Data_Group` · `Particle_chauvinism` · `Particle_physics` · `Particle_statistics` · `Pascual_Jordan` · `Paul_Dirac` · `Paul_Ulrich_Villard` · `Pauli_exclusion_principle` · `Pentaquark` · `Pergamon_Press` · `Perturbation_theory_(quantum_mechanics)` · `Peter_Debye` · [[Phase_space]] · `Phi_meson` · `Philosophical_Magazine` · `Philosophical_Transactions_of_the_Royal_Society` · `Philosophy_of_Science_(journal)` · `Phonon` · `Photino` · `Photochemistry` · `Photodissociation` · `Photoelectric_effect` · `Photography` · `Photomultiplier` · `Photon_counting` · `Photon_energy` · `Photon_gas` · `Photon_polarization` · `Photonic_molecule` · `Photonics` · `Photosphere` · `Physical_Review` · `Physical_Review_Letters` · `Physical_constant` · `Physics_Reports` · `Physics_World` · `Physikalische_Zeitschrift` · `Pion` · `Pionium` · `Planck's_law` · `Planck_constant` · `Plasmaron` · `Plasmon` · `Polariton` · `Polarization_(waves)` · `Polaron` · `Pomeron` · `Positron` · `Positronium` · `Potential_energy` · `Pound–Rebka_experiment` · `Preon` · `Princeton_University_Press` · `Probability_amplitude` · `Probability_distribution` · `Project_Gutenberg` · `Protein` · [[Proton]] · `Proton_decay` · `Protonium` · `QED:_The_Strange_Theory_of_Light_and_Matter` · `QED_vacuum` · `Quantity` · `Quantum` · `Quantum_Field_Theory_in_a_Nutshell` · `Quantum_chromodynamics` · `Quantum_cryptography` · `Quantum_electrodynamics` · `Quantum_entanglement` · `Quantum_field_theory` · `Quantum_harmonic_oscillator` · [[Quantum_mechanics]] · `Quantum_optics` · `Quantum_state` · `Quark` · `Quark_model` · `Quarkonium` · `Quasiparticle` · `R-hadron` · `Radiant_energy` · `Radiation_pressure` · `Radiative_zone` · `Radio` · `Radio_wave` · `Raman_scattering` · `Real_number` · `Refraction` · `Refractive_index` · `Relativistic_particle` · `Renormalization` · `René_Descartes` · `Retina` · `Retinal` · `Review_of_Scientific_Instruments` · `Reviews_of_Modern_Physics` · `Rho_meson` · `Richard_Feynman` · `Robert_Hooke` · `Robert_Millikan` · `Roton` · `Satyendra_Nath_Bose` · `Scalar_boson` · `Schwinger_effect` · `Schwinger_limit` · [[Science_(journal)]] · `Self-energy` · `Semiconductor` · `Sfermion` · `Sheldon_Glashow` · `Sigma_baryon` · `Skyrmion` · `Slow_light` · `Solar_core` · `Spacetime` · `Special_relativity` · `Special_unitary_group` · `Speed_of_light` · [[Spin_(physics)]] · `Spin_angular_momentum_of_light` · `Spontaneous_emission` · `Springer_Science+Business_Media` · `Standard_Model` · `Static_forces_and_virtual-particle_exchange` · `Sterile_neutrino` · `Steven_Weinberg` · `Stimulated_emission` · `Stop_squark` · `Strange_quark` · `Stress–energy_tensor` · `Subatomic_particle` · `Superatom` · `Superpartner` · `Suri_Bhagavantam` · `Svante_Arrhenius` · `Symmetry_(physics)` · `Synchrotron_radiation` · `T_meson` · `Tachyon` · `Tau_(particle)` · `Tau_neutrino` · `Temperature` · `Tensor_product` · `Tetraquark` · `Thermal_equilibrium` · `Theta_meson` · `Thomas_Young_(scientist)` · `Thought_experiment` · `Timeline_of_atomic_and_subatomic_physics` · `Timeline_of_particle_discoveries` · `Top_quark` · `Trion_(physics)` · `Two-photon_absorption` · `Two-photon_excitation_microscopy` · `Two-photon_physics` · `Uehling_potential` · `Ultraviolet_catastrophe` · [[Uncertainty_principle]] · `Unitary_group` · `University_of_California,_Riverside` · `University_of_Oregon` · `Up_quark` · `Upsilon_meson` · `Vacuum` · `Vacuum_polarization` · `Vertex_function` · `Virtual_particle` · `Virtual_photon` · `Visual_perception` · `W_and_Z_bosons` · `Ward–Takahashi_identity` · [[Wave]] · `Wave_function` · `Wave_vector` · `Wavelength` · `Wave–particle_duality` · [[Wayback_Machine]] · `Weak_interaction` · `Weak_isospin` · `Werner_Heisenberg` · `Wikisource` · `Wilhelm_Wien` · `Willis_Lamb` · `Wolfgang_P._Schleich` · `Wolfgang_Pauli` · `W′_and_Z′_bosons` · `X_and_Y_bosons` · `Xi_baryon`
## From the Real GENERATIVE library

*Photon — placed from the Real G.E.N.E.R.A.T.I.V.E. course library (Nuclear room). Source: Wikimedia Commons (via Wikipedia article media). [Details & license](https://commons.wikimedia.org/wiki/File:Photoelectric_effect_in_a_solid_-_diagram.svg).*
> A photon (from Ancient Greek φῶς, φωτός (phôs, phōtós) 'light') is an elementary particle that is a quantum of the electromagnetic field, including electromagnetic radiation such as light and radio waves, and the force carrier for the electromagnetic force. Photons are massless particles that always move at the speed of light measured in vacuum. ([Wikipedia](https://en.wikipedia.org/wiki/Photon))
<!-- REAL-GENERATIVE-MEDIA:END -->
<!-- LOCAL-MEDIA-PASS:START -->
## From the vault media library
!Photon thumb.png
*Photon — from the vault's own media holdings, placed 2026-07-09. MTN / Wikitube.io original · CC BY-SA 4.0.*
<!-- LOCAL-MEDIA-PASS:END -->
> **Room:** [[Helium]] · **Status:** ✅ shipped
## Overview
The photon is the elementary particle that mediates the electromagnetic [[Force|force]] and serves as the quantum of light and every other form of electromagnetic radiation, from radio waves through gamma rays. The concept emerged from Max Planck's 1900 quantization of blackbody radiation and Albert Einstein's 1905 explanation of the photoelectric effect, for which Einstein received the 1921 Nobel Prize. Photons are massless, electrically neutral, spin-1 bosons that travel at the speed of light c in vacuum and carry both [[Energy|energy]] and momentum.
The canonical relations governing every photon are E = hf and p = h / lambda, where h is the Planck constant, f is frequency, and lambda is wavelength. Equivalently, E = hc / lambda. These two equations are the bridge between the [[Wave|wave]] and particle descriptions of light, and the foundation of the Planck-Einstein relation.
Photons interact with matter through three processes: absorption (a photon is destroyed, exciting an atomic [[Electron|electron]] to a higher level), spontaneous emission (an excited electron decays and emits a photon equal in energy to the level gap), and stimulated emission (an incoming photon induces emission of an identical photon, the mechanism behind lasers). Helium spectroscopy was the first venue in which a new element was identified entirely from emitted photons: the yellow D3 line at 587.49 nm was observed by Janssen and Lockyer in the 1868 solar eclipse spectrum, 27 years before helium was isolated on [[Earth]]. Photons are the workhorse of nearly every modern detection technology, from telescopes and microscopes to fiber-optic communication, photovoltaics, X-ray imaging, quantum cryptography, and gravitational-wave interferometers.
## See also
- Room hub: [[Helium]]
- p5.js Editor conventions: P5 JS EDITOR
- Wiki root: MAIN
---
*Scaffolded by `generative-microsim` from row 170 of the Helium sheet on 2026-05-14T22:06:24Z.*
<!-- REAL-GENERATIVE-MEDIA:START -->
<!-- CRAFT-LINK:START g12 -->
*Built to the [[WT!P5_js_Microsim_Master_Class|p5.js Master Class]].*
<!-- CRAFT-LINK:END -->
## Wikipedia : Wikitube
**Strict pair:** [Wikipedia](https://en.wikipedia.org/wiki/Photon) : [Wikitube](https://en.wikitube.io/wiki/Photon)
## Previous hub tags
Tree parents: [[Hydrogen]] · [[Oxygen]].
Legacy hubs: none.
---
*Sources: 1 legacy note. Minted wave 1, 2026-07-30 (v1.6 order).*