Skip to content

Commit 87ed0b0

Browse files
committed
Improve rocket design with nose cone, body, fins, and window
1 parent cab6311 commit 87ed0b0

1 file changed

Lines changed: 44 additions & 13 deletions

File tree

docs/src/tutorial-continuation.md

Lines changed: 44 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -375,32 +375,63 @@ html_anim = """
375375
ctx.textAlign = 'center';
376376
ctx.fillText('Fuel', fuel_x, fuel_y - 8);
377377
378-
// Draw rocket body
378+
// Draw rocket: nose cone + body + fins + window
379+
const rocket_bottom = rocket_y + 18;
379380
ctx.fillStyle = color;
381+
382+
// Nose cone
380383
ctx.beginPath();
381-
ctx.moveTo(center_x, rocket_y - 30); // Top
382-
ctx.lineTo(center_x + 15, rocket_y + 15); // Right
383-
ctx.lineTo(center_x - 15, rocket_y + 15); // Left
384+
ctx.moveTo(center_x, rocket_y - 38);
385+
ctx.lineTo(center_x - 12, rocket_y - 10);
386+
ctx.lineTo(center_x + 12, rocket_y - 10);
384387
ctx.closePath();
385388
ctx.fill();
386-
389+
390+
// Body
391+
ctx.fillRect(center_x - 12, rocket_y - 10, 24, 28);
392+
393+
// Left fin
394+
ctx.beginPath();
395+
ctx.moveTo(center_x - 12, rocket_y + 6);
396+
ctx.lineTo(center_x - 24, rocket_y + 22);
397+
ctx.lineTo(center_x - 12, rocket_y + 18);
398+
ctx.closePath();
399+
ctx.fill();
400+
401+
// Right fin
402+
ctx.beginPath();
403+
ctx.moveTo(center_x + 12, rocket_y + 6);
404+
ctx.lineTo(center_x + 24, rocket_y + 22);
405+
ctx.lineTo(center_x + 12, rocket_y + 18);
406+
ctx.closePath();
407+
ctx.fill();
408+
409+
// Window
410+
ctx.beginPath();
411+
ctx.arc(center_x, rocket_y + 2, 5, 0, 2 * Math.PI);
412+
ctx.fillStyle = 'rgba(255,255,255,0.55)';
413+
ctx.fill();
414+
ctx.strokeStyle = 'rgba(255,255,255,0.85)';
415+
ctx.lineWidth = 1.5;
416+
ctx.stroke();
417+
387418
// Draw flame if thrust > 0.1
388419
if (u > 0.1) {
389420
const flame_size = 10 + 20 * u;
390421
ctx.fillStyle = '#e67e22';
391422
ctx.beginPath();
392-
ctx.moveTo(center_x - 10, rocket_y + 15);
393-
ctx.lineTo(center_x, rocket_y + 15 + flame_size);
394-
ctx.lineTo(center_x + 10, rocket_y + 15);
423+
ctx.moveTo(center_x - 10, rocket_bottom);
424+
ctx.lineTo(center_x, rocket_bottom + flame_size);
425+
ctx.lineTo(center_x + 10, rocket_bottom);
395426
ctx.closePath();
396427
ctx.fill();
397-
428+
398429
// Inner flame
399430
ctx.fillStyle = '#f1c40f';
400431
ctx.beginPath();
401-
ctx.moveTo(center_x - 5, rocket_y + 15);
402-
ctx.lineTo(center_x, rocket_y + 15 + flame_size * 0.6);
403-
ctx.lineTo(center_x + 5, rocket_y + 15);
432+
ctx.moveTo(center_x - 5, rocket_bottom);
433+
ctx.lineTo(center_x, rocket_bottom + flame_size * 0.6);
434+
ctx.lineTo(center_x + 5, rocket_bottom);
404435
ctx.closePath();
405436
ctx.fill();
406437
}
@@ -428,7 +459,7 @@ html_anim = """
428459
429460
// Velocity label
430461
ctx.fillStyle = '#7f8c8d';
431-
ctx.font = '10px Arial';
462+
ctx.font = '12px Arial';
432463
ctx.fillText('v', center_x, v_gauge_y + 20);
433464
434465
// Draw Tmax label at bottom

0 commit comments

Comments
 (0)