|
Server : Apache/2.4.62 System : FreeBSD fbsdweb2.web.rcn.net 14.1-RELEASE FreeBSD 14.1-RELEASE releng/14.1-n267679-10e31f0946d8 GENERIC amd64 User : www ( 80) PHP Version : 8.3.8 Disable Function : NONE Directory : /domains/drsuper/CalculusMechanics/ |
Upload File : |
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<title>Adventure 12 – The Cannonball and the Moment that Changed Motion</title>
<style>
body {
font-size: 18px;
font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
margin: 0;
padding: 0;
background: #ffffff; /* remove outer blue page */
color: #222;
}
.wrap{
padding: 12px 18px 18px;
max-width: none;
margin: 0;
}
.nav-row{
display:flex;
flex-wrap:wrap;
gap:12px;
margin-bottom:0.8rem;
align-items:center;
}
button {
background: #e9f0ff;
border: 2px solid #6b8cff;
border-radius: 0;
padding: 10px 18px;
font-size: 1rem;
cursor: pointer;
box-shadow: 0 3px 0 #4f6fe6;
transition: all 0.12s ease;
}
button:hover { background: #f3f7ff; }
button:active { background: #cddcff; box-shadow: 0 1px 0 #4f6fe6; transform: translateY(2px); }
button.checked {
background: #dff5e1;
border-color: #3a9b3a;
box-shadow: inset 0 2px 4px rgba(0,0,0,0.15);
}
button.sampled {
background: #fff3d9;
border-color: #d9a441;
box-shadow: inset 0 2px 4px rgba(0,0,0,0.15);
}
.card{
border:1px solid #dde3ff;
background:#f6f7ff;
border-radius:14px;
padding:1rem 1rem 0.95rem;
margin-top:12px;
}
.small{ font-size:0.95rem; color:#444; }
h1{ margin:0.2rem 0 0.25rem; font-size:2.1rem; }
h2{ margin-top:1.4rem; margin-bottom:0.4rem; font-size:1.55rem; }
p{ margin:0.35rem 0 0.7rem; line-height:1.55; }
.story-frame{
margin-top:1.4rem;
background:linear-gradient(180deg,#f9faff,#ffffff);
border:1px solid #dde3ff;
border-radius:18px;
padding:1.6rem 1.8rem 1.9rem;
box-shadow:0 10px 28px rgba(0,0,0,0.08);
}
.story-images{
display:grid;
grid-template-columns:repeat(3,1fr);
gap:100px;
margin:12px 0 14px;
align-items:stretch;
}
.story-images img{
width:100%;
height:220px;
object-fit: cover; /* fills box */
border-radius:14px;
border:1px solid #000;
display:block;
border: 5px solid #222;
.
}
@media (max-width:800px){
.story-images{ grid-template-columns:1fr; }
.story-images img{ height:240px; }
}
.topbar{
display:flex;
flex-wrap:wrap;
gap:10px;
align-items:center;
}
.topbar label{ margin-left:auto; }
.footer{
margin-top:2.2rem;
font-size:0.9rem;
color:#777;
text-align:left;
border-top:1px solid #eee;
padding-top:0.8rem;
}
.story-images figure {
margin: 0;
text-align: center;
}
.story-images figcaption {
margin-top: 0.6rem;
font-size: 0.95em;
color: #444;
}
</style>
</head>
<body>
<div class="wrap">
<div class="nav-row">
<a href="index.html"><button>🧭 Hub</button></a>
<a href="adventure_12_home.html"><button class="secondary">🏠 Home</button></a>
<a href="adventure_12_activity_student.html"><button class="secondary">✅ Activity</button></a>
</div>
<div class="card">
<h2 style="margin-top:0">🔊 Listen to the story</h2>
<p class="small" style="margin-top:6px">Click <b>Read</b> to hear the story aloud. You can pause or stop at any time.</p>
<div class="topbar" style="margin:10px 0 0">
<button class="btn" id="readBtn" type="button">Read</button>
<button class="btn secondary" id="pauseBtn" type="button">Pause</button>
<button class="btn secondary" id="stopBtn" type="button">Stop</button>
<label class="small" style="display:flex;align-items:center;gap:8px">
Voice:
<select id="voiceSelect" style="padding:8px 10px;border-radius:10px;border:1px solid #bbb;font-size:1rem;min-width:220px">
<option value="">Loading voices…</option>
</select>
</label>
</div>
<div class="small" id="ttsMsg" style="margin-top:10px"></div>
</div>
<div class="story-frame">
<div class="story-images">
<figure>
<img src="images/adventure_12_story_image_1.png"
alt="Child throwing a ball straight up into the sky">
<figcaption><b>Ball Toss: Straight Up and Straight Down</b></figcaption>
</figure>
<figure>
<img src="images/adventure_12_story_image_2.png"
alt="Graphs showing height vs time and vertical velocity vs time for vertical motion">
<figcaption><b>Vertical Motion Graphs: Height and Vertical Velocity</b></figcaption>
</figure>
<figure>
<img src="images/adventure_12_story_image_3.png"
alt="Cannon firing projectiles along different arcs with different angles">
<figcaption><b>Cannon Paths Look Different, but the Vertical Part Matches the ball going up and down</b></figcaption>
</figure>
</div>
<div id="storyText"><h1>The Cannonball and the Moment that Changed Motion</h1>
<p>
In the early 1600s, European battlefields thundered with cannons. Iron balls flew
through smoke-filled skies — powerful, dangerous, and wildly unpredictable.
Gunners aimed, fired, and hoped. No one could say where a cannonball would land
or why. Yet every shot revealed the same quiet mystery. The cannonball always rose,
slowed, paused for the briefest instant — and then fell. That pause changed science forever.
</p>
<h2>From Battlefields to Questions</h2>
<p>
In Italy, a young mathematician named <b>Galileo Galilei</b> watched cannonballs and
falling stones with a new kind of curiosity. Instead of asking where they landed,
he asked: <i>How does motion change from moment to moment?</i> Galileo realized that
guessing was useless. Motion had to be measured. He focused on one direction at a time —
especially up and down.
</p>
<h2>The Vertical Secret</h2>
<p>
The instant a cannonball leaves the cannon, gravity begins pulling it downward.
Every second: the upward velocity decreases by the same amount; the ball slows
smoothly; until, at one exact moment, the upward motion reaches zero.
At that instant, the cannonball is higher than it will ever be.
This moment is not luck. It is inevitable.
</p>
<p>
If a ball is thrown straight up with the same vertical speed that the cannonball
has when it leaves the cannon, then both objects follow exactly the same vertical motion.
They rise for the same amount of time, reach the same maximum height, pause,
and fall back to the ground in the same way.
The cannonball may travel forward across the sky, but vertically, it behaves no
differently than a ball tossed straight up by hand.
</p>
<h2>Newton Finds the Peak</h2>
<p>
A generation later, in England, <b>Isaac Newton</b> gave this moment a name and a language.
Height, Newton showed, is a function of time. Velocity is the slope of that height.
Acceleration is what changes the slope. When velocity becomes zero, the slope flattens.
That flat point is the maximum — the top of the curve — what we now call a <b>critical point</b>.
</p>
<h2>Why This Changed the World</h2>
<p>
Once this idea was understood, cannons stopped being guesses. Engineers could finally
predict how high a ball would rise; when it would stop climbing; how far it would travel.
The same mathematics now guides rockets, satellites, and space probes.
It governs basketball shots, golf swings, and planetary motion.
Every arc in the sky carries the same hidden structure.
</p>
<h2>The Big Idea</h2>
<p>
The most important moment in motion is not when something moves the fastest.
It is the instant when change pauses.
That pause is where calculus lives.
And that is why, on your DiVA charts, the highest point of the height curve
lines up exactly with the zero of the velocity curve.
</p>
div>
<div class="footer">Created by Dr. Super & Spark – Powered by ChatGPT</div>
</div>
<script>
(function(){
const readBtn = document.getElementById('readBtn');
const pauseBtn = document.getElementById('pauseBtn');
const stopBtn = document.getElementById('stopBtn');
const voiceSel = document.getElementById('voiceSelect');
const msgEl = document.getElementById('ttsMsg');
const storyEl = document.getElementById('storyText');
if(!('speechSynthesis' in window)){
msgEl.textContent = "Text-to-speech is not supported in this browser.";
readBtn.disabled = pauseBtn.disabled = stopBtn.disabled = true;
return;
}
let utter = null;
function pickThreeEnglish(voices){
const en = voices.filter(v => /^en(-|_)?/i.test(v.lang || "") || /english/i.test(v.name || ""));
en.sort((a,b) => (b.localService === true) - (a.localService === true));
const picked = [];
const seen = new Set();
for(const v of en){
const key = (v.name||"").toLowerCase();
if(seen.has(key)) continue;
picked.push(v); seen.add(key);
if(picked.length === 3) break;
}
return picked;
}
function loadVoices(){
const voices = window.speechSynthesis.getVoices();
const picked = pickThreeEnglish(voices);
voiceSel.innerHTML = "";
if(picked.length === 0){
voiceSel.innerHTML = "<option value=''>No English voices found</option>";
msgEl.textContent = "No English voices were found on this device. (Try Chrome or Edge.)";
return;
}
picked.forEach((v, idx) => {
const opt = document.createElement('option');
opt.value = v.name;
opt.textContent = `${v.name} (${v.lang})`;
voiceSel.appendChild(opt);
if(idx === 0) voiceSel.value = v.name;
});
msgEl.textContent = "";
}
loadVoices();
window.speechSynthesis.onvoiceschanged = loadVoices;
function buildUtterance(){
const text = (storyEl ? storyEl.innerText : '').trim();
if(!text){ msgEl.textContent = 'Could not find story text to read.'; return; }
utter = new SpeechSynthesisUtterance(text);
const voices = window.speechSynthesis.getVoices();
const chosenName = voiceSel.value;
const chosen = voices.find(v => v.name === chosenName);
if(chosen) utter.voice = chosen;
utter.rate = 1.0;
utter.pitch = 1.0;
utter.onend = () => {
readBtn.textContent = "Read";
};
utter.onerror = () => {
readBtn.textContent = "Read";
msgEl.textContent = "Could not play audio. Try another voice or refresh.";
};
}
function stop(){
window.speechSynthesis.cancel();
readBtn.textContent = "Read";
}
readBtn.addEventListener('click', () => {
msgEl.textContent = "";
stop();
buildUtterance();
window.speechSynthesis.speak(utter);
readBtn.textContent = "Reading…";
});
pauseBtn.addEventListener('click', () => {
if(window.speechSynthesis.speaking && !window.speechSynthesis.paused){
window.speechSynthesis.pause();
readBtn.textContent = "Read";
msgEl.textContent = "Paused. Click Pause again to resume.";
} else if(window.speechSynthesis.paused){
window.speechSynthesis.resume();
readBtn.textContent = "Reading…";
msgEl.textContent = "";
}
});
stopBtn.addEventListener('click', () => {
stop();
msgEl.textContent = "Stopped.";
});
voiceSel.addEventListener('change', () => {
if(window.speechSynthesis.speaking){
stop();
buildUtterance();
window.speechSynthesis.speak(utter);
readBtn.textContent = "Reading…";
msgEl.textContent = "";
}
});
})();
</script>
</body>
</html>