محاكاة دوران الكواكب حول الشمس باستخدام ++C
في هذا المقال، سأشارك كودًا قمت بتطويره بلغة ++C لمحاكاة حركة الكواكب حول الشمس. هذا المشروع يهدف إلى توضيح كيفية دوران الكواكب في النظام الشمسي باستخدام مفاهيم البرمجة والفيزياء البسيطة. سأقوم بشرح الفكرة العامة للكود، وسأضعه كاملاً في نهاية المقال للاستفادة منه.
فكرة المشروع
الكود يقوم بمحاكاة حركة الكواكب حول الشمس باستخدام قوانين الحركة الدائرية البسيطة. كل كوكب يتم تمثيله ككائن له خصائص مثل السرعة، المسافة من الشمس، والموقع. يتم تحديث موقع الكواكب في كل إطار زمني بناءً على سرعتها وموقعها النسبي من الشمس.
الهيكل العام للكود
تمثيل الكواكب والشمس:
تم تعريف الكواكب والشمس ككائنات تحتوي على خصائص مثل الموقع والسرعة. الشمس
تكون في مركز النظام، بينما تدور الكواكب حولها.
حساب الحركة:
يتم تحديث مواقع الكواكب في كل خطوة زمنية باستخدام معادلات الحركة الدائرية.
السرعة الثابتة والمسافة من الشمس تحدد مسار كل كوكب.
عرض النتائج:
يتم عرض مواقع الكواكب في كل لحظة زمنية، مما يسمح للمستخدم برؤية حركتها حول
الشمس.
الكود الكامل
#include <graphics.h> #include <conio.h> #include <math.h> #include <dos.h> // تضمين مكتبة dos.h لاستخدام delay #define PI 3.14159265358979323846 void main() { int gd = DETECT, gm; initgraph(&gd, &gm, "C:\\Turboc3\\BGI"); int centerX = getmaxx() / 2; int centerY = getmaxy() / 2; int sunRadius = 50; int planetRadius = 15; int orbitRadius1 = 100; int orbitRadius2 = 150; int orbitRadius3 = 200; int orbitRadius4 = 250; int orbitRadius5 = 300; int orbitRadius6 = 350; int orbitRadius7 = 400; int orbitRadius8 = 450; float angle1 = 0, angle2 = 0, angle3 = 0, angle4 = 0, angle5 = 0, angle6 = 0, angle7 = 0, angle8 = 0; while (!kbhit()) { // مسح الشاشة بالكامل cleardevice(); // رسم الشمس (ثابتة) circle(centerX, centerY, sunRadius); setfillstyle(SOLID_FILL, YELLOW); floodfill(centerX, centerY, WHITE); outtextxy(centerX - 15, centerY + sunRadius + 10, "Sun"); // تحديث الزوايا angle1 += 0.02; angle2 += 0.018; angle3 += 0.016; angle4 += 0.014; angle5 += 0.012; angle6 += 0.01; angle7 += 0.008; angle8 += 0.006; // رسم الكواكب الجديدة setcolor(WHITE); circle(centerX + orbitRadius1 * cos(angle1), centerY + orbitRadius1 * sin(angle1), planetRadius); setfillstyle(SOLID_FILL, LIGHTGRAY); floodfill(centerX + orbitRadius1 * cos(angle1), centerY + orbitRadius1 * sin(angle1), WHITE); outtextxy(centerX + orbitRadius1 * cos(angle1) - 15, centerY + orbitRadius1 * sin(angle1) + planetRadius + 5, "Mercury"); circle(centerX + orbitRadius2 * cos(angle2), centerY + orbitRadius2 * sin(angle2), planetRadius); setfillstyle(SOLID_FILL, YELLOW); floodfill(centerX + orbitRadius2 * cos(angle2), centerY + orbitRadius2 * sin(angle2), WHITE); outtextxy(centerX + orbitRadius2 * cos(angle2) - 15, centerY + orbitRadius2 * sin(angle2) + planetRadius + 5, "Venus"); circle(centerX + orbitRadius3 * cos(angle3), centerY + orbitRadius3 * sin(angle3), planetRadius); setfillstyle(SOLID_FILL, BLUE); floodfill(centerX + orbitRadius3 * cos(angle3), centerY + orbitRadius3 * sin(angle3), WHITE); outtextxy(centerX + orbitRadius3 * cos(angle3) - 10, centerY + orbitRadius3 * sin(angle3) + planetRadius + 5, "Earth"); circle(centerX + orbitRadius4 * cos(angle4), centerY + orbitRadius4 * sin(angle4), planetRadius); setfillstyle(SOLID_FILL, RED); floodfill(centerX + orbitRadius4 * cos(angle4), centerY + orbitRadius4 * sin(angle4), WHITE); outtextxy(centerX + orbitRadius4 * cos(angle4) - 10, centerY + orbitRadius4 * sin(angle4) + planetRadius + 5, "Mars"); circle(centerX + orbitRadius5 * cos(angle5), centerY + orbitRadius5 * sin(angle5), planetRadius); setfillstyle(SOLID_FILL, BROWN); floodfill(centerX + orbitRadius5 * cos(angle5), centerY + orbitRadius5 * sin(angle5), WHITE); outtextxy(centerX + orbitRadius5 * cos(angle5) - 15, centerY + orbitRadius5 * sin(angle5) + planetRadius + 5, "Jupiter"); circle(centerX + orbitRadius6 * cos(angle6), centerY + orbitRadius6 * sin(angle6), planetRadius); setfillstyle(SOLID_FILL, LIGHTBLUE); floodfill(centerX + orbitRadius6 * cos(angle6), centerY + orbitRadius6 * sin(angle6), WHITE); outtextxy(centerX + orbitRadius6 * cos(angle6) - 15, centerY + orbitRadius6 * sin(angle6) + planetRadius + 5, "Saturn"); circle(centerX + orbitRadius7 * cos(angle7), centerY + orbitRadius7 * sin(angle7), planetRadius); setfillstyle(SOLID_FILL, CYAN); floodfill(centerX + orbitRadius7 * cos(angle7), centerY + orbitRadius7 * sin(angle7), WHITE); outtextxy(centerX + orbitRadius7 * cos(angle7) - 15, centerY + orbitRadius7 * sin(angle7) + planetRadius + 5, "Uranus"); circle(centerX + orbitRadius8 * cos(angle8), centerY + orbitRadius8 * sin(angle8), planetRadius); setfillstyle(SOLID_FILL, DARKGRAY); floodfill(centerX + orbitRadius8 * cos(angle8), centerY + orbitRadius8 * sin(angle8), WHITE); outtextxy(centerX + orbitRadius8 * cos(angle8) - 15, centerY + orbitRadius8 * sin(angle8) + planetRadius + 5, "Neptune"); delay(50); // تأخير لتحريك الكواكب بسلاسة } closegraph(); }
كيفية استخدام الكود
- قم بنسخ الكود ولصقه في ملف main.cpp.
- قم بتشغيل الكود باستخدام مترجم C++ مثل g++.
- ستلاحظ أن الكود يقوم بحساب زاوية الأرض بالنسبة للشمس مع مرور الوقت.
هذا الكود يعتبر نقطة بداية لمحاكاة أكثر تعقيدًا للنظام الشمسي. يمكنك تطويره بإضافة المزيد من الكواكب، أو تحسين الحركة باستخدام قوانين الجاذبية الأكثر دقة. إذا كان لديك أي أسئلة أو اقتراحات، فلا تتردد في مشاركتها في التعليقات!