Environment() : ground(Transformation(Vector3(0,0,0))) { suns[0] = Sun(Vector3(-1.0, 1.0,-1.0)); suns[1] = Sun(Vector3( 1.0, 1.0,-1.0)); suns[2] = Sun(Vector3( 1.0, 0.2, 1.0)); for (int i = 0; i < 20; i++) { float x = rand() % 10000 * 0.008; if (x < 40) { x += 10; } else { x *= -1; x += 30; } float z = rand() % 10000 * 0.008; if (z < 40) { z += 10; } else { z *= -1; z += 30; } obstacles[i] = Obstacle(Transformation(Vector3(x, 0, z))); } }
void init (void) { glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glEnable(GL_DEPTH_TEST); glEnable(GL_NORMALIZE); glCullFace(GL_BACK); glEnable(GL_COLOR_MATERIAL); glEnable(GL_TEXTURE_2D); skybox = SpaceWall(); table = TableSurface(); sun = Sun(0.0f , 13.0f , 0.0f); centralPole = Cylinder(0,8.0f,0 ,0.54f , 12.0f , 30); baseBox = Box(0,1.01f,0 , 10,10,2); coverBox = Box(0,3.2f,3.8f , 10,1,0.5); coverBox2 = Box(0,3.2f,-3.8f , 10,1,0.5); coverBox3 = Box(4.4f,3.3f,0 , 9,1,0.5); coverBox3.setAngle(90 ,180 , 90); coverBox4 = Box(-4.4f,3.3f,0 , 9,1,0.5f); coverBox4.setAngle(90 ,180 , 90); mainGear = Gear(0 ,2.3f ,0 , 0.5f , 4.0f , 0.4f , 50 ,0.35f); bigPowerGear = Gear(-4.3f ,2.8f ,3.8f , 0.2f , 4.0f , 0.4f , 50 ,0.35f); powerGear = Gear(4.3f ,2.3f ,3.8f , 0.2f , 1.6f , 0.4f , 20 ,0.35f); smallMiddleGear = Gear(0 ,2.8f ,0 , 0.5f , 1.6f , 0.4f , 20 ,0.35f); sideGear = Gear(5.9f ,1.5f ,3.8f , 0.2f , 0.7f , 0.2f , 10 ,0.35f); sidePole = Cylinder(5.9f ,1.5f ,3.8f ,0.18f , 2.0f , 30); sidePole.setAngle(180 ,90 ,0); sideGear.setAngle(180 ,90 ,0); saturnRingPole = Cylinder(4.3f ,3.3f ,3.8f ,0.04f , 4.3f , 20); saturnRingPole.setAngle(0,0 ,0); powerPole = Cylinder(4.3f ,3.3f ,3.8f ,0.18f , 2.0f , 30); powerPole2 = Cylinder(-4.3f ,3.3f ,3.8f ,0.18f , 2.0f , 30); powerPole3 = Cylinder(-4.3f ,3.3f ,-3.8f ,0.18f , 2.0f , 30); powerPole4 = Cylinder(4.3f ,3.3f ,-3.8f ,0.18f , 2.0f , 30); moonCylinder = Cylinder(-4.3f ,3.3f ,2.0f ,0.3f, 1.0f , 30); neptunePole = Cylinder(0,4.62f,0 ,0.9f , 3.3f , 30); uranusPole = Cylinder(0,5.0f,0 ,0.8f , 3.5f , 30); saturnPole = Cylinder(0,5.4f,0 ,0.7f , 3.7f , 30); jupiterPole = Cylinder(0,5.8f,0 ,0.6f , 3.9f , 30); marsPole = Cylinder(0,6.2f,0 ,0.5f , 4.1f , 30); earthPole = Cylinder(0,6.58f,0 ,0.4f , 4.3f , 30); venusPole = Cylinder(0,6.96f,0 ,0.3f , 4.5f , 30); mercuryPole = Cylinder(0,8,0 ,0.2f , 5.0f , 30); saturnRing = SaturnRing(0 ,11.0f ,0 ,2.4f , 0.2f , 30); saturnRing.yAngle = -12; setUpPlanet(mercury , 5 ,4.1f ,9.5f , 0.4f , "Textures\\mercury.bmp"); setUpPlanet(venus , 10 ,1.62f ,9.0f , 1.0f , "Textures\\venus.bmp"); setUpPlanet(earth , 15 ,1 ,8.5f , 1.0 , "Textures\\earth.bmp"); setUpPlanet(mars , 20 ,0.53f ,8.0f , 0.53f , "Textures\\mars.bmp"); setUpPlanet(jupiter , 25 ,0.08f ,7.5 , 2.0f , "Textures\\jupiter.bmp"); setUpPlanet(saturn , 30 ,0.0339f ,7.0f , 1.5f , "Textures\\saturn.bmp"); setUpPlanet(uranus , 35 ,0.011f ,6.5f , 1.2f , "Textures\\uranus.bmp"); setUpPlanet(neptune , 40 ,0.006f ,6.0f , 1.2f, "Textures\\neptune.bmp"); setUpPlanet(moon , 2 ,13 ,8.8f , 0.3f , "Textures\\moon.bmp"); //Earths Tilt earth.planet.setAngle(-90,23.5,0); }
void CMainWnd::OnPaint() { Object Mercury{ 0.0, -4.60012e+10, 100000 * sqrtl(1.6000209905890134 / 4.6001251767), 0.0, 0.0, 0.0 }; Object Venus{ 0.0, 1.08939e+11, -10000 * sqrtl(13.18232666698794 / 1.089329936), 0.0, 0.0, 0.0 }; Object Earth{ -1.5209823194717103e+11, 0.0, 0.0, -10000 * sqrtl(13.049465190899799786 / 1.5209823194717103), 0.0, 0.0 }; Object Moon{ Earth.x - 4.05503e+8, Earth.y, 0.0, Earth.vy - 1000 * sqrtl(4.20483606054820 / 3.632954949), 0.0, 0.0 }; Object Mars{ 2.066689628835e+11, 0.0, 0.0, 10000 * sqrtl(14.509650135827967 / 2.066689628835), 0.0, 0.0 }; Object Jupiter{ 0.0, -7.405736e+11, 10000 * sqrtl(13.918548927987795 / 7.40573560320), 0.0, 0.0, 0.0 }; Object Saturn{ 0.0, 1.513325783e+12, -10000 * sqrtl(1.25317275658852622058 / 1.51332578316992203), 0.0, 0.0, 0.0 }; Object Uranus{ -2.748938461e+12, 0.0, 0.0, -10000 * sqrtl(1.38605613686489140548 / 2.748938461629847948), 0.0, 0.0 }; Object Neptune{ 4.553946490e+12, 0.0, 0.0, 10000 * sqrtl(1.31224167015991783158 / 4.553946489640798809), 0.0, 0.0 }; CPaintDC dc(this); RECT rect; GetClientRect(&rect); long double x = rect.right; //Ширина окна long double y = rect.bottom; //Высота окна dc.FillSolidRect(0,0,rd(x),rd(y),RGB(0,0,0)); CPen Line(PS_SOLID, 1, RGB(255, 255, 255)); CPen lMercury(PS_SOLID, 1, RGB(255, 102, 0)); CPen lVenus(PS_SOLID, 1, RGB(0, 204, 255)); CPen lEarth(PS_SOLID, 1, RGB(0, 0, 153)); CPen lMoon(PS_SOLID, 1, RGB(204, 204, 204)); CPen lMars(PS_SOLID, 1, RGB(255, 0, 0)); CPen lJupiter(PS_SOLID, 1, RGB(102, 0, 0)); CPen lSaturn(PS_SOLID, 1, RGB(204, 204, 255)); CPen lUranus(PS_SOLID, 1, RGB(255, 204, 255)); CPen lNeptune(PS_SOLID, 1, RGB(0, 0, 255)); //Сетка dc.SelectObject(Line); dc.MoveTo(0, rd(y / 2)); dc.LineTo(rd(x),rd(y/2)); dc.MoveTo(rd(x/2), 0); dc.LineTo(rd(x/2), rd(y)); //Подписи кнопок dc.SetTextColor(RGB(255,255,255)); dc.TextOutW(140, 8,"Видимый радиус (1 а.е. = 150 млн. км)"); dc.TextOutW(140, 38, "Растяжение траектории Луны"); dc.TextOutW(140, 68, "Время (1 день = 86400 с)"); dc.TextOutW(140, rd(y-30), "Шаг (1 мин. = 60 с)"); long double h = H; long double cosinus, sinus; long double max = MAX; // Нептун - 4.553946490e+12 м, норм - 2.5е+11. На вcякий случай, 1 а.е.= 1.495978707e+11 м //Солнечный диск CBrush Sun(RGB(255,204,51)); dc.SelectObject(Sun); dc.Ellipse(rd(x / 2 - 6.96342e+8 / max), rd(y / 2 - 6.96342e+8 / max), rd(x / 2 + 6.96342e+8 / max), rd(y / 2 + 6.96342e+8 / max)); dc.MoveTo(rd(Mercury.x), rd(Mercury.y)); for (long double t = 0; t < T; t += h){ cosinus = -Mercury.x / r(Mercury); sinus = -Mercury.y / r(Mercury); Mercury.ax = a(Mercury)*cosinus; Mercury.ay = a(Mercury)*sinus; Mercury.vx += h*Mercury.ax; Mercury.vy += h*Mercury.ay; Mercury.x += h*Mercury.vx; Mercury.y += h*Mercury.vy; dc.SelectObject(lMercury); dc.LineTo(rd(x / 2 + y / 2.0*Mercury.x / max), rd(y / 2.0*(1.0 - Mercury.y / max))); dc.MoveTo(rd(x / 2 + y / 2.0*Venus.x / max), rd(y / 2.0*(1.0 - Venus.y / max))); cosinus = -Venus.x / r(Venus); sinus = -Venus.y / r(Venus); Venus.ax = a(Venus)*cosinus; Venus.ay = a(Venus)*sinus; Venus.vx += h*Venus.ax; Venus.vy += h*Venus.ay; Venus.x += h*Venus.vx; Venus.y += h*Venus.vy; dc.SelectObject(lVenus); dc.LineTo(rd(x / 2 + y / 2.0*Venus.x / max), rd(y / 2.0*(1.0 - Venus.y / max))); dc.MoveTo(rd(x / 2 + y / 2.0*Earth.x / max), rd(y / 2.0*(1.0 - Earth.y / max))); cosinus = -Earth.x / r(Earth); sinus = -Earth.y/r(Earth); Earth.ax = a(Earth)*cosinus; Earth.ay = a(Earth)*sinus; Earth.vx += h*Earth.ax; Earth.vy += h*Earth.ay; Earth.x += h*Earth.vx; Earth.y += h*Earth.vy; dc.SelectObject(lEarth); dc.LineTo(rd(x/2+y/2.0*Earth.x/max),rd(y/2.0*(1.0-Earth.y/max))); //Отчаянная попытка логарифмического масштаба //if ((Earth.x != 0.0) && (Earth.y != 0.0)) //dc.LineTo(rd(x / 2 + y / 2.0*sign(Earth.x)*log(fabsl(Earth.x)) / log(max)), rd(y / 2.0*(1.0 - sign(Earth.y)*log(fabsl(Earth.y)) / log(max)))); dc.MoveTo(rd(x / 2 + y / 2.0*(Moon.x + MOON * (Moon.x - Earth.x)) / max), rd(y / 2.0*(1.0 - (Moon.y + MOON * (Moon.y - Earth.y)) / max))); //Экспериментальный блок - Луна cosinus = -Moon.x / r(Moon); sinus = -Moon.y / r(Moon); Moon.ax = a(Moon)*cosinus; Moon.ay = a(Moon)*sinus; long double R = sqrtl(powl(Moon.x - Earth.x, 2.0) + powl(Moon.y - Earth.y, 2.0)); cosinus = -(Moon.x-Earth.x) / R; sinus = -(Moon.y-Earth.y) / R; Moon.ax += (3.986004418e+14 / R / R)*cosinus; Moon.ay += (3.986004418e+14 / R / R)*sinus; Moon.vx += h*Moon.ax; Moon.vy += h*Moon.ay; Moon.x += h*Moon.vx; Moon.y += h*Moon.vy; dc.SelectObject(lMoon); dc.LineTo(rd(x / 2 + y / 2.0*(Moon.x + MOON * (Moon.x - Earth.x)) / max), rd(y / 2.0*(1.0 - (Moon.y + MOON * (Moon.y - Earth.y)) / max))); dc.MoveTo(rd(x / 2 + y / 2.0*Mars.x / max), rd(y / 2.0*(1.0 - Mars.y / max))); // cosinus = -Mars.x / r(Mars); sinus = -Mars.y / r(Mars); Mars.ax = a(Mars)*cosinus; Mars.ay = a(Mars)*sinus; Mars.vx += h*Mars.ax; Mars.vy += h*Mars.ay; Mars.x += h*Mars.vx; Mars.y += h*Mars.vy; dc.SelectObject(lMars); dc.LineTo(rd(x / 2 + y / 2.0*Mars.x / max), rd(y / 2.0*(1.0 - Mars.y / max))); dc.MoveTo(rd(x / 2 + y / 2.0*Jupiter.x / max), rd(y / 2.0*(1.0 - Jupiter.y / max))); cosinus = -Jupiter.x / r(Jupiter); sinus = -Jupiter.y / r(Jupiter); Jupiter.ax = a(Jupiter)*cosinus; Jupiter.ay = a(Jupiter)*sinus; Jupiter.vx += h*Jupiter.ax; Jupiter.vy += h*Jupiter.ay; Jupiter.x += h*Jupiter.vx; Jupiter.y += h*Jupiter.vy; dc.SelectObject(lJupiter); dc.LineTo(rd(x / 2 + y / 2.0*Jupiter.x / max), rd(y / 2.0*(1.0 - Jupiter.y / max))); dc.MoveTo(rd(x / 2 + y / 2.0*Saturn.x / max), rd(y / 2.0*(1.0 - Saturn.y / max))); cosinus = -Saturn.x / r(Saturn); sinus = -Saturn.y / r(Saturn); Saturn.ax = a(Saturn)*cosinus; Saturn.ay = a(Saturn)*sinus; Saturn.vx += h*Saturn.ax; Saturn.vy += h*Saturn.ay; Saturn.x += h*Saturn.vx; Saturn.y += h*Saturn.vy; dc.SelectObject(lSaturn); dc.LineTo(rd(x / 2 + y / 2.0*Saturn.x / max), rd(y / 2.0*(1.0 - Saturn.y / max))); dc.MoveTo(rd(x / 2 + y / 2.0*Uranus.x / max), rd(y / 2.0*(1.0 - Uranus.y / max))); cosinus = -Uranus.x / r(Uranus); sinus = -Uranus.y / r(Uranus); Uranus.ax = a(Uranus)*cosinus; Uranus.ay = a(Uranus)*sinus; Uranus.vx += h*Uranus.ax; Uranus.vy += h*Uranus.ay; Uranus.x += h*Uranus.vx; Uranus.y += h*Uranus.vy; dc.SelectObject(lUranus); dc.LineTo(rd(x / 2 + y / 2.0*Uranus.x / max), rd(y / 2.0*(1.0 - Uranus.y / max))); dc.MoveTo(rd(x / 2 + y / 2.0*Neptune.x / max), rd(y / 2.0*(1.0 - Neptune.y / max))); cosinus = -Neptune.x / r(Neptune); sinus = -Neptune.y / r(Neptune); Neptune.ax = a(Neptune)*cosinus; Neptune.ay = a(Neptune)*sinus; Neptune.vx += h*Neptune.ax; Neptune.vy += h*Neptune.ay; Neptune.x += h*Neptune.vx; Neptune.y += h*Neptune.vy; dc.SelectObject(lNeptune); dc.LineTo(rd(x / 2 + y / 2.0*Neptune.x / max), rd(y / 2.0*(1.0 - Neptune.y / max))); dc.MoveTo(rd(x / 2 + y / 2.0*Mercury.x / max), rd(y / 2.0*(1.0 - Mercury.y / max))); } }
double brightness(DBusMessage *msg) { double lat, lng; handleDD(msg, &lat, &lng); return Sun(lat, lng).brightness(); }
long sunset(DBusMessage *msg) { double lat, lng; handleDD(msg, &lat, &lng); return Sun(lat, lng).sunset(); }