Exemplo n.º 1
0
	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)));
		}
	}
Exemplo n.º 2
0
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)));
	}
}
Exemplo n.º 4
0
double brightness(DBusMessage *msg) {
  double lat, lng;
  handleDD(msg, &lat, &lng);
  return Sun(lat, lng).brightness();
}
Exemplo n.º 5
0
long sunset(DBusMessage *msg) {
  double lat, lng;
  handleDD(msg, &lat, &lng);
  return Sun(lat, lng).sunset();
}