@@ -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