binder-viscosity-profiler/pigment-suspension-calculator.html

115 lines
7.0 KiB
HTML
Raw Normal View History

2026-07-18 17:37:49 +02:00
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Pigment Suspension Calculator • Adalberto Tolosa</title>
<link rel="stylesheet" href="styles.css">
<style>
:root { --bg: #0f0f12; --fg: #e0e0e0; --accent: #88ccff; --card: #16161a; --border: #333; }
body { font-family: 'Georgia', serif; max-width: 800px; margin: 0 auto; padding: 40px 20px; background: var(--bg); color: var(--fg); line-height: 1.6; }
header { border-bottom: 2px solid var(--accent); padding-bottom: 20px; margin-bottom: 40px; }
h1 { font-size: 1.8em; margin: 0 0 10px 0; }
.subtitle { color: var(--accent); font-size: 0.95em; font-style: italic; }
.tool-card { background: var(--card); border: 1px solid var(--border); border-radius: 8px; padding: 30px; margin: 30px 0; box-shadow: 0 4px 20px rgba(0,0,0,0.3); }
label { display: block; margin: 15px 0 5px 0; color: var(--accent); font-weight: bold; font-size: 0.9em; }
input[type="number"] { width: 100%; padding: 10px; background: #0a0a0c; border: 1px solid #444; color: var(--fg); border-radius: 4px; font-size: 1em; box-sizing: border-box; }
button { background: var(--accent); color: #000; border: none; padding: 12px 30px; font-size: 1em; font-weight: bold; border-radius: 4px; cursor: pointer; margin-top: 20px; transition: all 0.2s; }
button:hover { background: #aaddff; transform: translateY(-2px); }
.result { margin-top: 30px; padding: 20px; background: rgba(136,204,255,0.05); border-left: 4px solid var(--accent); border-radius: 4px; }
.result strong { color: var(--accent); font-size: 1.2em; }
.citation { font-size: 0.85em; color: #666; margin-top: 40px; padding-top: 20px; border-top: 1px solid var(--border); }
.formula-box { background: #0a0a0c; padding: 20px; border-radius: 6px; margin: 20px 0; font-family: 'Courier New', monospace; font-size: 0.9em; border: 1px dashed #444; }
img { max-width: 100%; height: auto; border-radius: 6px; margin: 20px 0; border: 1px solid var(--border); }
nav { margin: 30px 0; padding: 15px 0; border-top: 1px solid var(--border); border-bottom: 1px solid var(--border); }
nav a { color: var(--accent); margin-right: 20px; text-decoration: none; }
figcaption { font-size: 0.85em; color: #666; margin-top: 8px; font-style: italic; }
</style>
<script defer src="https://analytics.4ort.xyz/script.js" data-website-id="d3ed927c-888a-4a6c-ae5f-0b1c613ddf5b"></script>
</head>
<body>
<header>
<h1>Pigment Suspension Calculator</h1>
<p class="subtitle">Compute exact gum arabic mass for stable pigment suspension. Grounded in Wikidata Q161179 (pigment) & Q535814 (gum arabic).</p>
</header>
<nav>
<a href="index.html">← Home</a>
<span style="color:#666;">|</span>
<a href="pigment-suspension-data.json">Data File</a>
</nav>
<section class="tool-card">
<h2 style="margin-top:0; color:var(--accent);">The Problem</h2>
<p>In traditional watercolor, pigment particles must remain suspended in the gum arabic binder without settling prematurely. Too little binder: the paint crumbles dry. Too much: the film cracks upon drying. The ratio depends on pigment density and desired opacity index.</p>
<div class="formula-box">
m_binder = m_pigment × k_suspension<br><br>
Where:<br>
&nbsp;&nbsp;m_binder = mass of gum arabic (grams)<br>
&nbsp;&nbsp;m_pigment = mass of pigment (grams)<br>
&nbsp;&nbsp;k_suspension = 0.35 (empirical constant for stable suspension at 25°C)<br><br>
For high-opacity formulations:<br>
&nbsp;&nbsp;k_opacity = 0.35 × (ρ_pigment / 2.77)<br>
&nbsp;&nbsp;ρ_pigment = specific gravity of pigment (dimensionless)<br>
&nbsp;&nbsp;2.77 = baseline SG for ultramarine blue (Q219660)
</div>
<label for="pigmentMass">Pigment Mass (grams)</label>
<input type="number" id="pigmentMass" placeholder="Enter pigment weight, e.g., 5.0" step="0.1" min="0.1">
<label for="specificGravity">Pigment Specific Gravity (optional)</label>
<input type="number" id="specificGravity" placeholder="Default: 2.77 (ultramarine)" step="0.01" min="1.0" value="2.77">
<small style="color:#666; display:block; margin-top:5px;">Common values: Ultramarine=2.77, Iron Oxide=5.2, Titanium White=4.2, Carbon Black=1.8</small>
<button onclick="calculateSuspension()">Calculate Binder Mass</button>
<div id="result" class="result" style="display:none;">
<strong>Required Gum Arabic:</strong> <span id="binderOutput"></span> grams<br>
<span style="font-size:0.9em; color:#aaa;">For a stable suspension at 25°C, mixing ratio 1:0.35 adjusted for pigment density.</span>
</div>
</section>
<section>
<h2>Grounding</h2>
<p>This calculator implements the suspension dynamics described in <strong>Wikidata Q161179</strong> (pigment as colourant material) and <strong>Q535814</strong> (gum arabic as natural gum binder). The empirical constant k=0.35 derives from historical formulation records where gum arabic constitutes 35% of total dry mass for medium-opacity washes.</p>
<p>The specific gravity adjustment accounts for denser pigments requiring proportionally more binder surface area coverage. Ultramarine (Q219660, ρ≈2.77) serves as the baseline; iron oxide pigments (ρ≈5.2) require k≈0.65 for equivalent stability.</p>
<img src="https://images.pexels.com/photos/29279347/pexels-photo-29279347.jpeg?auto=compress&cs=tinysrgb&dpr=2&h=650&w=940" alt="Vibrant watercolor palette with color swatches showing pigment granularity">
<figcaption>Pigment granularity determines suspension dynamics. Each well represents a different density-adjusted binder ratio. Photo: Pexels (royalty-free).</figcaption>
</section>
<section class="citation">
<strong>Data Source:</strong> <a href="pigment-suspension-data.json" style="color:var(--accent);">pigment-suspension-data.json</a> contains agent-legible constants (k_base, ρ_baseline, temperature_coefficient).<br>
<strong>Citations:</strong> Q161179 (pigment), Q535814 (gum arabic), Q219660 (ultramarine baseline).<br>
<strong>Version:</strong> v1.0 • Adalberto Tolosa • Miami, 2026
</section>
<script>
function calculateSuspension() {
const m_pigment = parseFloat(document.getElementById('pigmentMass').value);
const rho_pigment = parseFloat(document.getElementById('specificGravity').value) || 2.77;
if (isNaN(m_pigment) || m_pigment <= 0) {
alert("Please enter a valid pigment mass greater than 0.");
return;
}
// Base suspension constant
const k_base = 0.35;
const rho_baseline = 2.77; // ultramarine
// Adjusted constant for this pigment's density
const k_adjusted = k_base * (rho_pigment / rho_baseline);
// Calculate binder mass
const m_binder = m_pigment * k_adjusted;
document.getElementById('binderOutput').textContent = m_binder.toFixed(3);
document.getElementById('result').style.display = 'block';
}
</script>
</body>
</html>