# Density
## Microsim
### Live player
<div class="microsim-player">
<iframe src="https://editor.p5js.org/sciencenibber/full/voyPu863e" width="100%" height="620" frameborder="0" sandbox="allow-scripts allow-same-origin"></iframe>
</div>
<div class="microsim-fallback">
<img src="Microsims/thumbs/Density.png" alt="Density 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/voyPu863e">open sketch in the p5.js editor</a></em></p>
</div>
**Editor URL:** https://editor.p5js.org/sciencenibber/sketches/voyPu863e
**Description (100 words):**
A horizontal log-scale rho axis (10^-2 to 10^5 kg/m^3) anchors twelve reference materials, from hydrogen and helium through water and seawater to gold and osmium. Drag the yellow marker (or use arrow keys, or click a tick to snap) and watch two spatial panels respond live. The left panel renders a fixed 1 m^3 box, scattering particles whose count tracks log(rho) -- the box goes from nearly empty for gases to densely packed for solids. The right panel anchors a 2 m ruler and draws the 1 kg cube at true scale, side a = (1 / rho)^(1/3). Helium's 1.78 m cube next to osmium's 3.6 cm cube makes the seven-order-of-magnitude span of everyday density unmistakably visible.
```js
// =====================================================================
// Density.js -- Wikitube microsim
// Article: Density en.wikitube.io/wiki/Density
// Room: Helium Pattern: 8 (Crossover with Geometry,
// topological / spatial viz)
// ---------------------------------------------------------------------
// Idea: density (rho = m / V) is a scalar field over space, and the
// most direct way to *see* it is as a packing of mass into a volume.
// This microsim renders that intuition in two coupled spatial panels
// driven by a single horizontal log-rho selector:
//
// LEFT panel -- "one cubic metre"
// The box is fixed at 1 m^3. Particles are scattered
// inside with a count proportional to log10(rho).
// Hydrogen reads as a near-empty box (~5 dots);
// osmium reads as a packed grain field (~1500 dots).
// The user *sees* density as occupancy.
//
// RIGHT panel -- "one kilogram"
// A grey-ruled scale rect, 2 m wide. Inside it, the
// cube of side (1 / rho)^(1/3) m is drawn at scale.
// Helium's 1 kg cube is ~1.78 m on a side; osmium's
// 1 kg cube is ~3.6 cm. The same kilogram, the same
// ruler, vastly different cubes.
//
// The horizontal axis at the top is the controller -- a log-scale
// rho slider from 10^-2 to 10^5 kg/m^3 with named materials anchored
// at their real-world densities. Click on a marker to snap. Drag the
// yellow indicator. The two cubes update live.
//
// Canonical equation (bottom-right HUD, per Betterfire Standard):
//
// rho = m / V [SI: kg/m^3]
//
// For ideal gases this expands to rho = P M / (R T); the helium room's
// central observation is that the smallest molar mass (M = 4.003 g/mol
// for He) plus a high T = 293 K gives rho ~= 0.179 kg/m^3, the second
// lightest gas after hydrogen -- but unlike H2 it is non-flammable.
// That single fact is why lifting-gas / cryogenic-pressurant / leak-
// tracer applications all sit in the Helium room.
//
// Visual layout (720 x 520 canvas):
// * top-left: HUD title + en.wikitube.io/wiki/Density subtitle
// * top-right: control hints (drag, click marker, arrow keys)
// * y ~= 110: horizontal log-rho axis with material tick labels
// * y ~= 200-450 LEFT panel "1 m^3 at rho" (40..350 px)
// * y ~= 200-450 RIGHT panel "1 kg occupies V" (370..700 px)
// * bottom: live readout (material, rho, m=1 kg cube side)
// * bottom-right canonical equation rho = m / V
//
// Conventions (Wikitube Betterfire Standard v0):
// * single ARTICLE constant at the top, single quotes
// * p5.disableFriendlyErrors = true to keep the editor console clean
// * non-ASCII (Greek rho, dots, arrows, superscripts) lives in
// COMMENTS ONLY; every text() string literal is ASCII
// * Energy-room palette (P5_JS_EDITOR section 4): dark BG, HOT/COLD
// tones, STRUCT grey, TRAJ yellow accent for the marker
// * helium highlighted (TRAJ) because this is the Helium room
// All sliders elided -- the rho axis itself is the slider.
// =====================================================================
const ARTICLE = 'Density';
const TITLE = ARTICLE.replace(/_/g, ' ');
p5.disableFriendlyErrors = true;
// ----- Energy room palette (P5_JS_EDITOR section 4, line 165) --------
const BG = 18;
const FG = 240;
const DIM = [240, 240, 240, 140];
const HOT = [220, 110, 60]; // gases (warm)
const COLD = [60, 130, 220]; // liquids (cool)
const STRUCT = [120, 130, 150]; // solids (structural grey)
const TRAJ = [240, 220, 80]; // helium accent + marker
const SCRATCH = [120, 120, 120, 90]; // grid / axis scratch lines
const ACCENT = [200, 100, 220]; // emphasis tint (compact-object regime)
// ----- log-rho axis range (kg/m^3) -----------------------------------
const RHO_LOG_MIN = -2; // 10^-2 kg/m^3 (very rarefied gas)
const RHO_LOG_MAX = 5; // 10^5 kg/m^3 (osmium-class solid)
// ----- Reference materials at canonical densities (kg/m^3) -----------
// Each row: { rho, label, group: 'gas' | 'liquid' | 'solid' | 'extreme', highlight }
// 'highlight' is true for helium (the room's central material).
const MATERIALS = [
{ rho: 0.0899, label: 'H2', group: 'gas', highlight: false },
{ rho: 0.1786, label: 'He', group: 'gas', highlight: true },
{ rho: 1.225, label: 'air', group: 'gas', highlight: false },
{ rho: 1.977, label: 'CO2', group: 'gas', highlight: false },
{ rho: 124.9, label: 'l-He', group: 'liquid', highlight: false },
{ rho: 808, label: 'l-N2', group: 'liquid', highlight: false },
{ rho: 999.97, label: 'water', group: 'liquid', highlight: false },
{ rho: 2700, label: 'Al', group: 'solid', highlight: false },
{ rho: 7874, label: 'Fe', group: 'solid', highlight: false },
{ rho: 11343, label: 'Pb', group: 'solid', highlight: false },
{ rho: 19320, label: 'Au', group: 'solid', highlight: false },
{ rho: 22590, label: 'Os', group: 'solid', highlight: false }
];
// ----- Reader's draggable marker state -------------------------------
// Start at helium (the room's pin).
let markRho = 0.1786;
let dragging = false;
// ----- Axis layout (pixels; set in setup) ----------------------------
let axisX, axisY, axisW; // horizontal axis line geometry
let leftBoxX, leftBoxY, leftBoxW, leftBoxH;
let rightBoxX, rightBoxY, rightBoxW, rightBoxH;
// ----- Precomputed particle field for the LEFT panel ----------------
// We allocate the maximum count once at setup() and render only the
// first N each frame, where N scales with log10(rho). This keeps the
// dots in a stable spatial pattern as the user drags the marker --
// the box visually fills/empties rather than re-shuffling.
const MAX_PARTICLES = 1500;
const particles = []; // [{ x, y, r }, ...] in box-relative coords (0..1)
function setup() {
createCanvas(720, 520);
pixelDensity(2);
textFont('system-ui');
// Horizontal rho axis
axisX = 60;
axisY = 110;
axisW = width - 80;
// Left panel: 1 m^3 box
leftBoxX = 40;
leftBoxY = 200;
leftBoxW = 310;
leftBoxH = 250;
// Right panel: 1 kg cube + 2 m ruler
rightBoxX = 380;
rightBoxY = 200;
rightBoxW = 320;
rightBoxH = 250;
// Seed the particle field once -- deterministic positions so the
// visual is a stable cloud the reader can study, not a sparkle storm.
randomSeed(42);
for (let i = 0; i < MAX_PARTICLES; i++) {
particles.push({
x: random(0.02, 0.98),
y: random(0.02, 0.98),
r: random(1.0, 2.2)
});
}
}
function draw() {
background(BG);
// Order: axis (controller) -> two panels -> HUD on top.
drawRhoAxis();
drawLeftPanel();
drawRightPanel();
drawHUD();
}
// =====================================================================
// Coordinate transforms: rho [kg/m^3] <-> axis px
// =====================================================================
function rhoToPx(rho) {
const logRho = Math.log10(Math.max(rho, 1e-9));
return map(logRho, RHO_LOG_MIN, RHO_LOG_MAX, axisX, axisX + axisW);
}
function pxToRho(px) {
const logRho = map(px, axisX, axisX + axisW, RHO_LOG_MIN, RHO_LOG_MAX);
return Math.pow(10, logRho);
}
// =====================================================================
// Material classification (which palette colour applies)
// =====================================================================
// Group by density crossovers, not by the discrete materials table:
// rho < 100 kg/m^3 -> gas (HOT)
// 100 <= rho < 2000 -> liquid (COLD)
// rho >= 2000 -> solid (STRUCT)
// This makes the marker change colour as the user drags across regimes.
function groupOf(rho) {
if (rho < 100) return 'gas';
if (rho < 2000) return 'liquid';
return 'solid';
}
function colorOfGroup(g) {
if (g === 'gas') return HOT;
if (g === 'liquid') return COLD;
return STRUCT;
}
// Nearest named material -- used to label the marker in the HUD.
function nearestMaterial(rho) {
let best = MATERIALS[0];
let bestD = Math.abs(Math.log10(rho) - Math.log10(best.rho));
for (const m of MATERIALS) {
const d = Math.abs(Math.log10(rho) - Math.log10(m.rho));
if (d < bestD) { best = m; bestD = d; }
}
return best;
}
// =====================================================================
// Top axis: log-rho slider with material ticks
// =====================================================================
function drawRhoAxis() {
push();
// Axis bar
stroke(SCRATCH);
strokeWeight(1);
line(axisX, axisY, axisX + axisW, axisY);
// Decade ticks + labels (10^-2 ... 10^5)
noStroke();
fill(...DIM);
textSize(10);
textAlign(CENTER, TOP);
for (let logR = RHO_LOG_MIN; logR <= RHO_LOG_MAX; logR++) {
const x = rhoToPx(Math.pow(10, logR));
stroke(SCRATCH); line(x, axisY - 3, x, axisY + 3);
noStroke();
fill(...DIM);
text('10^' + logR, x, axisY + 6);
}
// Material tick markers above the axis
textSize(10);
for (const m of MATERIALS) {
const x = rhoToPx(m.rho);
const col = colorOfGroup(m.group);
// Tiny vertical bracket
stroke(...col, 200);
strokeWeight(1.5);
line(x, axisY - 12, x, axisY - 2);
// Label above
noStroke();
fill(...col, m.highlight ? 255 : 180);
if (m.highlight) {
// Helium gets a bigger, yellow-trimmed label
textSize(11);
fill(...TRAJ);
textAlign(CENTER, BOTTOM);
text(m.label, x, axisY - 16);
textSize(10);
} else {
textAlign(CENTER, BOTTOM);
text(m.label, x, axisY - 16);
}
}
// Axis title
noStroke();
fill(...DIM);
textSize(11);
textAlign(CENTER, TOP);
text('rho [kg/m^3, log scale]', axisX + axisW / 2, axisY + 20);
// Reader's marker -- yellow indicator with halo, big enough to grab
drawMarker();
pop();
}
function drawMarker() {
const mx = constrain(rhoToPx(markRho), axisX, axisX + axisW);
const my = axisY;
// Vertical guide down through both panels
push();
stroke(...TRAJ, 80);
strokeWeight(1);
drawingContext.setLineDash([4, 4]);
line(mx, my + 3, mx, height - 60);
drawingContext.setLineDash([]);
pop();
// Outer halo
push();
noFill();
stroke(...TRAJ);
strokeWeight(1);
circle(mx, my, 16);
// Filled centre
fill(...TRAJ);
noStroke();
circle(mx, my, 8);
pop();
}
// =====================================================================
// LEFT panel -- "1 m^3 at this rho" (particle occupancy)
// =====================================================================
function drawLeftPanel() {
push();
// Panel frame + caption
noFill();
stroke(SCRATCH);
strokeWeight(1);
rect(leftBoxX, leftBoxY, leftBoxW, leftBoxH);
noStroke();
fill(...DIM);
textSize(11);
textAlign(LEFT, BOTTOM);
text('one cubic metre @ rho', leftBoxX, leftBoxY - 6);
// Count = round(map(log10(rho), -2, 5, 5, MAX_PARTICLES))
// The mapping is intentionally generous on the low end so hydrogen
// and helium are visibly *almost* empty without going to literal 0.
const logRho = Math.log10(Math.max(markRho, 1e-6));
const n = Math.round(map(logRho, RHO_LOG_MIN, RHO_LOG_MAX,
5, MAX_PARTICLES));
const nClamped = constrain(n, 1, MAX_PARTICLES);
// Particle dots, in panel-local coords scaled by leftBoxW/H
const col = colorOfGroup(groupOf(markRho));
noStroke();
fill(...col, 180);
for (let i = 0; i < nClamped; i++) {
const p = particles[i];
const px = leftBoxX + p.x * leftBoxW;
const py = leftBoxY + p.y * leftBoxH;
circle(px, py, p.r);
}
// Panel readout: particle count and the rho it implies
noStroke();
fill(...DIM);
textSize(10);
textAlign(LEFT, TOP);
text('N = ' + nClamped + ' / ' + MAX_PARTICLES + ' (log-scaled)',
leftBoxX + 6, leftBoxY + 6);
text('1 m x 1 m x 1 m box',
leftBoxX + 6, leftBoxY + leftBoxH - 16);
pop();
}
// =====================================================================
// RIGHT panel -- "1 kg occupies V = 1 / rho" (size of a 1 kg cube)
// =====================================================================
function drawRightPanel() {
push();
// Panel frame + caption
noFill();
stroke(SCRATCH);
strokeWeight(1);
rect(rightBoxX, rightBoxY, rightBoxW, rightBoxH);
noStroke();
fill(...DIM);
textSize(11);
textAlign(LEFT, BOTTOM);
text('one kilogram, cube side = (1 / rho)^(1/3)',
rightBoxX, rightBoxY - 6);
// Layout: a horizontal 2 m ruler runs across the bottom of the
// panel. The 1 kg cube sits on the ruler, anchored at the left edge
// of the ruler. Side length is rendered in metres at 1 m = 120 px.
const rulerY = rightBoxY + rightBoxH - 36;
const rulerX0 = rightBoxX + 20;
const rulerLen = 2.0; // metres rendered
const pxPerM = 120;
const rulerXend = rulerX0 + rulerLen * pxPerM;
// Ruler bar with tick marks every 0.1 m, labels every 0.5 m
stroke(SCRATCH);
strokeWeight(1);
line(rulerX0, rulerY, rulerXend, rulerY);
noStroke();
fill(...DIM);
textSize(9);
textAlign(CENTER, TOP);
for (let m = 0; m <= rulerLen + 0.001; m += 0.1) {
const x = rulerX0 + m * pxPerM;
const major = (Math.round(m * 10) % 5 === 0);
stroke(SCRATCH);
line(x, rulerY, x, rulerY + (major ? 6 : 3));
if (major) {
noStroke();
fill(...DIM);
text(nf(m, 1, 1) + ' m', x, rulerY + 8);
}
}
// Cube of side a = (1 / rho)^(1/3) metres, clamped to ruler length
const a = Math.cbrt(1 / Math.max(markRho, 1e-6)); // m
const aClamped = Math.min(a, rulerLen);
const aPx = aClamped * pxPerM;
// Draw the cube as a square sitting on the ruler at rulerX0
const cubeX = rulerX0;
const cubeY = rulerY - aPx;
const col = colorOfGroup(groupOf(markRho));
push();
noStroke();
fill(...col, 90);
rect(cubeX, cubeY, aPx, aPx);
noFill();
stroke(...col);
strokeWeight(1.5);
rect(cubeX, cubeY, aPx, aPx);
// Side-length annotation
noStroke();
fill(...col);
textSize(11);
textAlign(LEFT, CENTER);
if (aPx > 18) {
text('a = ' + formatLength(a),
cubeX + aPx + 8, cubeY + aPx / 2);
} else {
// Very tiny cube -- annotate above instead
textAlign(LEFT, BOTTOM);
text('a = ' + formatLength(a),
cubeX + aPx + 8, cubeY + aPx);
}
pop();
// Off-scale warning -- triggers for rho < ~0.125 (gives a > 2 m)
if (a > rulerLen) {
noStroke();
fill(...HOT);
textSize(10);
textAlign(RIGHT, BOTTOM);
text('cube extends off ruler (a = ' + formatLength(a) + ')',
rightBoxX + rightBoxW - 8, rulerY - 4);
}
pop();
}
function formatLength(a) {
// a is in metres. Render in m if >= 0.1 m, otherwise in cm.
if (a >= 0.1) return nf(a, 1, 2) + ' m';
if (a >= 0.001) return nf(a * 100, 1, 1) + ' cm';
return nf(a * 1000, 1, 1) + ' mm';
}
// =====================================================================
// Input handling -- axis is the slider
// =====================================================================
function mousePressed() {
// Inside the axis hit-strip: snap and start dragging.
const hitY0 = axisY - 24;
const hitY1 = axisY + 24;
if (mouseY >= hitY0 && mouseY <= hitY1 &&
mouseX >= axisX && mouseX <= axisX + axisW) {
markRho = pxToRho(mouseX);
dragging = true;
return;
}
// Inside the marker's vertical guide: also start dragging.
const mx = rhoToPx(markRho);
if (Math.abs(mouseX - mx) <= 8 && mouseY < height - 50) {
dragging = true;
}
}
function mouseDragged() {
if (dragging) {
markRho = pxToRho(constrain(mouseX, axisX, axisX + axisW));
}
}
function mouseReleased() { dragging = false; }
function keyPressed() {
// Arrow keys nudge the marker in log-rho space; up/down jump between
// the named materials in order of density.
const dLog = 0.05;
if (keyCode === LEFT_ARROW) {
markRho = Math.pow(10,
Math.max(RHO_LOG_MIN, Math.log10(markRho) - dLog));
}
if (keyCode === RIGHT_ARROW) {
markRho = Math.pow(10,
Math.min(RHO_LOG_MAX, Math.log10(markRho) + dLog));
}
if (keyCode === UP_ARROW) markRho = nextMaterial(markRho, +1);
if (keyCode === DOWN_ARROW) markRho = nextMaterial(markRho, -1);
}
function nextMaterial(rho, dir) {
// Find the named material strictly above (dir = +1) or below
// (dir = -1) the current rho. If none exists in that direction,
// return the current value unchanged.
const sorted = MATERIALS.slice().sort((a, b) => a.rho - b.rho);
if (dir > 0) {
for (const m of sorted) if (m.rho > rho * 1.001) return m.rho;
} else {
for (let i = sorted.length - 1; i >= 0; i--) {
if (sorted[i].rho < rho * 0.999) return sorted[i].rho;
}
}
return rho;
}
// =====================================================================
// HUD -- title, subtitle, hints, live readout, canonical equation
// =====================================================================
function drawHUD() {
// Top-left: title + Wikitube URL (Betterfire Standard rule 2)
noStroke();
fill(FG);
textAlign(LEFT, TOP);
textSize(22);
text(TITLE, 14, 12);
fill(...DIM);
textSize(12);
text('Wikitube microsim . en.wikitube.io/wiki/Density', 14, 42);
// Top-right: control hints (Betterfire Standard rule 3)
textAlign(RIGHT, TOP);
textSize(10);
fill(...DIM);
text('drag along the rho axis', width - 14, 12);
text('left / right: nudge log-rho', width - 14, 24);
text('up / down: jump to next material', width - 14, 36);
text('click a tick to snap', width - 14, 48);
// Bottom-left: live readout
const grp = groupOf(markRho);
const near = nearestMaterial(markRho);
const a = Math.cbrt(1 / Math.max(markRho, 1e-6));
fill(...DIM);
textAlign(LEFT, BOTTOM);
textSize(11);
text('group: ' + grp + ' nearest reference: ' + near.label +
' (' + formatRho(near.rho) + ')',
14, height - 26);
fill(FG);
textSize(13);
text('rho = ' + formatRho(markRho) + ' kg/m^3 ' +
'1 kg cube side a = ' + formatLength(a),
14, height - 8);
// Bottom-right: canonical equation (Betterfire Standard rule 4)
textAlign(RIGHT, BOTTOM);
fill(FG);
textSize(12);
text('rho = m / V (ideal gas: rho = P M / (R T))',
width - 14, height - 8);
}
function formatRho(rho) {
if (rho >= 1000) return nf(rho, 1, 0);
if (rho >= 1) return nf(rho, 1, 2);
if (rho >= 0.01) return nf(rho, 1, 3);
return rho.toExponential(2);
}
// =====================================================================
// End of Density.js -- Wikitube microsim, Helium room, Pattern 8.
// =====================================================================
```
## MicroSim spec
- **Recommended sim type:** particle [[System|system]]
- **Microsimmability score:** 70/100
- **Layout:** drawing region (canvas) on top; control region (sliders/buttons) below.
### Parameters (tunable controls)
- `Particle density rho_p - 500 to 5000 kg/m^3`
- `Fluid density rho_f - 800 to 1200 kg/m^3`
- `Particle size`
### What animates
Particles rise, suspend, or settle in a fluid column as the density difference and size change, sorting visibly by their buoyancy and terminal [[Velocity|velocity]].
### Learning objective
Relate settling and buoyant separation to density difference and particle size.
## Links (Wikipedia order)
<!-- injected from _registry/childlinks/Density.json (2026-07-30T02:09:12Z) -->
`Aerogel` · `Aerographite` · [[Alloy]] · [[Aluminium]] · `Amount_of_substance` · [[Antimony]] · `Apocrypha` · `Archimedes` · `Area_density` · `Aristotle` · [[Atomic_mass]] · `Avogadro's_law` · `Avogadro_constant` · `Bar_(unit)` · `Basalt` · [[Beryllium]] · [[Bismuth]] · `Boltzmann_constant` · `Boyle's_law` · `Brass` · `Bulk_density` · `Buoyancy` · `Bushel` · [[Cadmium]] · `Celsius` · `Charge_density` · `Charles's_law` · [[Chromium]] · `Close-packing_of_equal_spheres` · [[Cobalt]] · `Committee_on_Data_of_the_International_Science_Council` · `Compressibility` · `Concrete` · `Conserved_quantity` · `Convection` · `Cooking_oil` · [[Copper]] · `Cork_(material)` · `Cubic_centimetre` · `Cubic_foot` · `Cubic_inch` · `Cubic_metre` · `Cubic_yard` · `Dalton_(unit)` · `Dasymeter` · `De_architectura` · `Densities_of_the_elements_(data_page)` · `Density_(disambiguation)` · `Density_gradient` · `Density_of_air` · `Diamond` · `Diiodomethane` · `Dimensional_analysis` · `Displacement_(fluid)` · `Dord` · [[Earth]] · `Earth's_inner_core` · `Electric_charge` · `Energy_density` · `Eureka_(word)` · `Faraday_constant` · `Fluid_ounce` · `Force_density` · `Galileo_Galilei` · `Gas_constant` · `Gay-Lussac's_law` · [[Germanium]] · `Girolami_method` · `Glass` · `Glenn_Research_Center` · `Glycerol` · `Gneiss` · [[Gold]] · `Goldsmith` · `Grain_(unit)` · `Gram` · `Gram_per_cubic_centimetre` · `Granite` · `Greek_language` · [[Helium]] · `Hiero_II_of_Syracuse` · [[Hydrogen]] · `Hydrometer` · `Hydrostatic_weighing` · `Ice` · `Ideal_gas` · `Ideal_gas_law` · `Imperial_units` · `Intensive_and_extensive_properties` · `International_Organization_for_Standardization` · `International_System_of_Quantities` · `International_System_of_Units` · `Interstellar_medium` · [[Iridium]] · [[Iron]] · `Kelvin` · `Kilogram` · `Kilogram_per_cubic_metre` · [[Lead]] · `Limestone` · `Linear_density` · `Liquid` · `Liquid_hydrogen` · `Liquid_oxygen` · `List_of_chemical_elements` · `Literal_translation` · [[Lithium]] · `Litre` · `Local_Interstellar_Cloud` · [[Magnesium]] · [[Manganese]] · `Mass` · `Mass_concentration_(chemistry)` · `Mass_fraction_(chemistry)` · [[Mercury_(element)]] · `Metallic_microlattice` · `Miscibility` · `Molality` · `Molar_concentration` · `Molar_mass` · `Molar_mass_constant` · `Molar_volume` · `Mole_(unit)` · `Mole_fraction` · [[Molybdenum]] · `Multiplicative_inverse` · `Neutron_star` · [[Nickel]] · [[Niobium]] · `Number_density` · `Nylon` · `Oak` · `Ohio_State_University` · `Orthobaric_density` · `Oscillating_U-tube` · [[Osmium]] · `Packaging` · `Paper_density` · `Particle_mass_density` · `Particle_number` · `Physical_quantity` · `Pine` · [[Platinum]] · [[Plutonium]] · `Polypropylene` · [[Potassium]] · `Pound_(mass)` · `Power_density` · `Precious_metal` · `Pressure` · `Quartzite` · `Relative_density` · [[Rhenium]] · `Rho` · [[Rhodium]] · `Salinity` · `Sand` · [[Selenium]] · [[Silicon]] · [[Silver]] · `Slug_(unit)` · [[Sodium]] · `Solid` · `Solution_(chemistry)` · `Specific_volume` · `Specific_weight` · `Spice_(oceanography)` · `Standard_temperature_and_pressure` · `Styrofoam` · [[Sun]] · `Supercooling` · [[Tantalum]] · `Temperature` · `Test_tube` · `Thermodynamic_temperature` · [[Thermodynamics]] · [[Thorium]] · [[Tin]] · [[Titanium]] · `Tonne` · `Troy_weight` · [[Tungsten]] · `Tungsten_hexafluoride` · `Unit_cell` · [[Uranium]] · [[Vanadium]] · `Vitruvius` · `Volume` · `Volume_(thermodynamics)` · `Water` · [[Wayback_Machine]] · `Weighing_scale` · `Weight` · `White_dwarf` · `Wood` · `Wreath` · [[Zinc]]
## From the Real GENERATIVE library (beauty pass)

*Density — image hotlinked from Wikimedia Commons (via the Real G.E.N.E.R.A.T.I.V.E. course library, Audio room). [Details & license](https://commons.wikimedia.org/wiki/File:Air_density_vs_temperature.svg).*
> Density (volumetric mass density or specific mass) is a substance's mass per unit of volume. The symbol most often used for density is ρ (the lower case Greek letter rho), although the Latin letter D can also be used. ([Wikipedia](https://en.wikipedia.org/wiki/Density))
<!-- BEAUTY-PASS-MEDIA:END -->
> **Room:** [[Helium]] · **Status:** ✅ shipped
## Overview
Density (rho) is the mass per unit volume of a substance, expressed by the relation rho = m/V. Its SI unit is the kilogram per cubic metre (kg/m^3), though g/cm^3 remains common in [[Materials_science|materials science]] and [[Chemistry|chemistry]]. The concept underpins Archimedes' principle from antiquity, which links buoyant [[Force|force]] to the weight of displaced fluid, and from there to centuries of pycnometry, hydrometry, and gas-displacement metrology.
For ideal gases, rho = PM/(RT), so density rises with pressure and molar mass and falls with temperature. This is why hot air ascends, and why helium — molar mass 4.003 g/mol, rho = 0.1786 kg/m^3 at STP — is roughly seven times less dense than air at 1.225 kg/m^3, giving it lifting capacity of about 1.05 kg/m^3 in atmosphere. Liquids cluster near 1,000 kg/m^3 (water 999.97 kg/m^3 at 4 C is the reference for specific gravity), while solids span four orders of magnitude, from cork near 240 to osmium at 22,590, the densest stable element.
Density organizes macroscopic phenomena across disciplines: [[Earth]]'s mantle-core layering, ocean thermohaline circulation, astrophysical compact objects ([[Neutron|neutron]]-star matter near 10^17 kg/m^3), and aerospace lift calculations. [[Engineering]] codes such as ASME BPVC and the ASTM consensus standards propagate density through every stress, flow, and heat-transfer computation. As a scalar field over three-dimensional space, density is intrinsically a spatial-visualization problem: contour maps, isosurfaces, and packing diagrams render its variation across materials and conditions.
## See also
- Room hub: [[Helium]]
- p5.js Editor conventions: P5 JS EDITOR
- Wiki root: MAIN
---
*Scaffolded by `generative-microsim` from row 130 of the Helium sheet on 2026-05-14T12:30:28Z.*
<!-- BEAUTY-PASS-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/Density) : [Wikitube](https://en.wikitube.io/wiki/Density)
## Previous hub tags
Tree parents: [[Helium]] · [[Hydrogen]] · [[Oxygen]].
Legacy hubs: none.
---
*Sources: 2 legacy notes. Minted wave 1, 2026-07-30 (v1.6 order).*