// název: BP.exe
// popis: Aplikace pro výpočet doby oslunění ze známého azimutu
// autor: Michal Nováček
// datum: 18.05.2017
// změna: 23.5.2017
// verze: 2.9


using System;
using System.Drawing;
using System.Windows.Forms;
using System.Collections.Generic;
using System.Linq;

namespace VUT
{
	class Okno : Form								
	{
		static void Main()
		{
			Application.Run(new Okno());
		}

		public NumericUpDown nden = new NumericUpDown();
		public NumericUpDown nmesic = new NumericUpDown();
		public NumericUpDown nzemsirka = new NumericUpDown();
		public NumericUpDown nazimut = new NumericUpDown();
		public NumericUpDown nazimut2 = new NumericUpDown();

		public List<Label> labels = new List<Label>();
		public List<double> azimuty = new List<double>();
		
		public Label sumLabel = new Label();
		public Label lblcas = new Label();
		public Label lbldeklinace = new Label();

		
		int count = 0;

		public Okno()
		{

		//OKNO

			this.Text = "Výpočet doby oslunění";
			this.Size = new Size(600,400);
			this.FormBorderStyle = FormBorderStyle.FixedSingle;
			this.BackColor = Color.Beige;
			this.StartPosition = FormStartPosition.CenterScreen;


		//LABEL

			Label lblnadpis = new Label();			
			lblnadpis.Text = "Výpočet doby oslunění";
			lblnadpis.Dock = DockStyle.Top;
			lblnadpis.TextAlign = ContentAlignment.MiddleCenter;
			lblnadpis.Font = new Font("Arial",14);
			this.Controls.Add(lblnadpis);

			Label lblden = new Label();
			lblden.Text = "Den";
			lblden.Left = 10;
			lblden.Top = 80;
			lblden.Height = 20;
			lblden.Width = 80;
			this.Controls.Add(lblden);

			Label lblmesic = new Label();
			lblmesic.Text = "Měsíc";
			lblmesic.Left = 10;
			lblmesic.Top = 100;
			lblmesic.Height = 20;
			lblmesic.Width = 80;
			this.Controls.Add(lblmesic);

			Label lblzemsirka = new Label();
			lblzemsirka.Text = "Zeměpisná šířka [°]";
			lblzemsirka.Left = 10;
			lblzemsirka.Top = 120;
			lblzemsirka.Height = 25;
			lblzemsirka.Width = 80;
			this.Controls.Add(lblzemsirka); 

			Label lblazim = new Label();
			lblazim.Text = "Azimut [°] od-do";
			lblazim.Left = 10;
			lblazim.Top = 150;
			lblazim.Height = 40;
			lblazim.Width = 60;
			this.Controls.Add(lblazim);

			Label lbldekl = new Label();
			lbldekl.Text = "Deklinace";
			lbldekl.Left = 10;
			lbldekl.Top = 210;
			lbldekl.Height = 20;
			lbldekl.Width = 80;
			this.Controls.Add(lbldekl);

			Label lbltime = new Label();
			lbltime.Text = "Čas [hod]";
			lbltime.Left = 10;
			lbltime.Top = 240;
			lbltime.Height = 20;
			lbltime.Width = 80;
			this.Controls.Add(lbltime);

			Label lblpopis = new Label();
			lblpopis.Text = "Tato aplikace slouží k výpočtu doby oslunění. Aplikací lze počítat rychle časovou polohu Slunce na obloze tlačítkem START a nebo vložit (až 5 údajů) intervaly oslunění tlačítkem PŘIDAT, které aplikace sečte.";
			lblpopis.Left = 180;
			lblpopis.Top = 290;
			lblpopis.Width = 250;
			lblpopis.Height = 100;
			this.Controls.Add(lblpopis);

		//NUMERICUPDOWN

			nden.Top = 75;
			nden.Left = 110;
			nden.Width = 70;
			nden.Minimum = 1;
			nden.Maximum = 31;
			nden.Value = 1;
			nden.Increment = 1M;
			this.Controls.Add(nden);

			nmesic.Top = 95;
			nmesic.Left = 110;
			nmesic.Width = 70;
			nmesic.Minimum = 1;
			nmesic.Maximum = 12;
			nmesic.Value = 3;
			nmesic.Increment = 1M;
			this.Controls.Add(nmesic);			

			nzemsirka.Top = 120;
			nzemsirka.Left = 110;
			nzemsirka.Width = 70;
			nzemsirka.Minimum = -90;
			nzemsirka.Maximum = 90;
			nzemsirka.Value = 50;
			nzemsirka.Increment = 1M;
			this.Controls.Add(nzemsirka);

			nazimut.Top = 150;
			nazimut.Left = 110;
			nazimut.Width = 70;
			nazimut.Minimum = -180;
			nazimut.Maximum = 180;
			nazimut.Value = 0;
			nazimut.Increment = 0.1M;
			nazimut.DecimalPlaces = 2;
			this.Controls.Add(nazimut);

			nazimut2.Top = 150;
			nazimut2.Left = 200;
			nazimut2.Width = 70;
			nazimut2.Minimum = -180;
			nazimut2.Maximum = 180;
			nazimut2.Value = 0;
			nazimut2.Increment = 0.1M;
			nazimut2.DecimalPlaces = 2;
			this.Controls.Add(nazimut2);


		//VÝPOČET LABEL

			lbldeklinace.Text = "0°";
			lbldeklinace.Left = 110;
			lbldeklinace.Top = 210;
			lbldeklinace.Width = 50;
			this.Controls.Add(lbldeklinace);

			lblcas.Text = "0";
			lblcas.Left = 110;
			lblcas.Top = 240;
			lblcas.Width = 50;
			this.Controls.Add(lblcas);

			sumLabel.Text = "";
			sumLabel.Left = 420;
			sumLabel.Top = 250;
			sumLabel.Width = 150;
			this.Controls.Add(sumLabel);

		//BUTTON

			Button add = new Button();
			add.Text = "PŘIDAT";
			add.Top = 200;
			add.Left = 200;
			add.Width = 100;
			add.Height = 30;
			add.BackColor = Color.Navy;
			add.ForeColor = Color.White;
			add.Font = new Font("Arial",8);
			add.Click += new EventHandler(OnClickAdd);
			this.Controls.Add(add);

			Button start = new Button();
			start.Text = "START";
			start.Top = 300;
			start.Left = 20;
			start.Width = 130;
			start.Height = 50;
			start.BackColor = Color.Navy;
			start.ForeColor = Color.White;
			start.Font = new Font("Arial",10);
			start.Click += new EventHandler(OnClickStart);
			this.Controls.Add(start);

			Button konec = new Button();
			konec.Text = "KONEC";
			konec.Top = 300;
			konec.Left = 450;
			konec.Width = 130;
			konec.Height = 50;
			konec.BackColor = Color.Navy;
			konec.ForeColor = Color.White;
			konec.Font = new Font("Arial",10);
			konec.Click += new EventHandler(OnClickKonec);
			this.Controls.Add(konec);
		}


		public void OnClickAdd(object sender,EventArgs e)
		{
			
			count++;											//počet kliknutí


		//STATIC
	
			double den = Convert.ToDouble(nden.Value);
			double mesic = Convert.ToDouble(nmesic.Value);
			double zemsirka = Convert.ToDouble(nzemsirka.Value);
			double azimut = Convert.ToDouble(nazimut.Value);

		//RADIAN

			double rad = Math.PI / 180;	

		//DEKLINACE						

			double deklinace = (23.45*rad*Math.Sin(0.98*rad*den + 29.7*rad*mesic - 109*rad))/rad;
			lbldeklinace.Text = deklinace.ToString("F4") + "°";

		//ČAS

			//Číselná přípravná část
	
			double cosa = Math.Cos(azimut*rad);
			double cosa2 = Math.Pow(cosa, 2);
			double cos2a = Math.Cos(2*azimut*rad);

			double cosd = Math.Cos(deklinace*rad);
			double cosd2 = Math.Pow(cosd, 2);
			double cos2d = Math.Cos(2*deklinace*rad);

			double cosf = Math.Cos(zemsirka*rad);
			double cosf2 = Math.Pow(cosf, 2);
			double cos2f = Math.Cos(2*zemsirka*rad);
			
			double cos2a_2f = Math.Cos(2*azimut*rad-2*zemsirka*rad);
			double cos2a_2d = Math.Cos(2*azimut*rad-2*deklinace*rad);
			double cos2aplus2f = Math.Cos(2*azimut*rad+2*zemsirka*rad);
			double cos2aplus2d = Math.Cos(2*azimut*rad+2*deklinace*rad);
			double cos2f_2d = Math.Cos(2*zemsirka*rad-2*deklinace*rad);
			double cos2fplus2d = Math.Cos(2*zemsirka*rad+2*deklinace*rad);

			double cos2aplus2fplus2d = Math.Cos(2*azimut*rad+2*zemsirka*rad+2*deklinace*rad);
			double cos2a_2fplus2d = Math.Cos(2*azimut*rad-2*zemsirka*rad+2*deklinace*rad);
			double cos2aplus2f_2d = Math.Cos(2*azimut*rad+2*zemsirka*rad-2*deklinace*rad);
			double cos2a_2f_2d = Math.Cos(2*azimut*rad-2*zemsirka*rad-2*deklinace*rad);
			

			//Výpočtová část

				double cast1 = -8*Math.Sqrt(2);
				double cast2 = Math.Sqrt(cosa2*cosd2*cos2a_2f - 2*cosa2*cos2f*cosd2 + cosa2*cosd2*cos2aplus2f + 2*cosa2*cosd2 + 2*cosa2*cos2a*cosd2 + 4*cosa2*cos2d*cosd2);
				double cast3 = cos2a_2f_2d - cos2aplus2f_2d - cos2a_2fplus2d + cos2aplus2fplus2d + 2*cos2f_2d - 2*cos2fplus2d;
				double cast4 = cos2a_2f_2d + cos2aplus2f_2d + cos2a_2fplus2d + cos2aplus2fplus2d + 2*cos2a_2f + 2*cos2aplus2f + 2*cos2a_2d + 2*cos2aplus2d + 4*cos2a - 2*cos2f_2d - 2*cos2fplus2d - 4*cos2f + 12*cos2d + 12;

				//-90 až 0

				double cast1_1 = cast1*cast2;
				double cast2_1 = cast1_1 - cast3;
				double cast3_1 = cast2_1/cast4;

				double arccos1 = Math.Acos(cast3_1);
				double vysledek1_1 = arccos1/rad;
				double vysledek2_1 = vysledek1_1/15;


				//0 až 90

				double arccos2 = -Math.Acos(cast3_1);
				double vysledek1_2 = arccos2/rad;
				double vysledek2_2 = vysledek1_2/15;
				double vysledek3_2 = vysledek2_2+24;

				//90 až 180

				double cast1_2 = cast1*cast2;
				double cast2_2 = cast1_2 + cast3;
				double cast3_2 = cast2_2/cast4;

				double arccos3 = Math.Acos(cast3_2);
				double vysledek1_3 = arccos3/rad;
				double vysledek2_3 = vysledek1_3/15;
				double vysledek3_3 = vysledek2_3+12;

				//-180 až -90

				double arccos4 = -Math.Acos(cast3_2);
				double vysledek1_4 = arccos4/rad;
				double vysledek2_4 = vysledek1_4/15;
				double vysledek3_4 = vysledek2_4+12;

			
			//Logická část

			double mezivysledek = 0;

			if (azimut == 0)
			{
				mezivysledek = 	12;
			}
			else
			{
				if (azimut == 180)
				{
					mezivysledek = 0;
				}		
				else
				{
					if (azimut == -180)
					{
						mezivysledek = 0;
					}
					else
					{
						if (azimut > 90)
						{
							mezivysledek = vysledek3_3;

						}
						else
						{
							if (azimut > 0)
							{
								mezivysledek = vysledek3_2;
							}
							else
							{
								if (azimut > -90)
								{
									mezivysledek = vysledek2_1;
								}
								else
								{
									mezivysledek = vysledek3_4;
								}
							}
						}
					}
				}
			}

			
		//VSTUP DRUHÉHO AZIMUTU

			double azimut2 = Convert.ToDouble(nazimut2.Value);			

			//Číselná přípravná část
	
			double cosa_ = Math.Cos(azimut2*rad);
			double cosa2_ = Math.Pow(cosa_, 2);
			double cos2a_ = Math.Cos(2*azimut2*rad);

			double cosd_ = Math.Cos(deklinace*rad);
			double cosd2_ = Math.Pow(cosd_, 2);
			double cos2d_ = Math.Cos(2*deklinace*rad);

			double cosf_ = Math.Cos(zemsirka*rad);
			double cosf2_ = Math.Pow(cosf_, 2);
			double cos2f_ = Math.Cos(2*zemsirka*rad);
			
			double cos2a_2f_ = Math.Cos(2*azimut2*rad-2*zemsirka*rad);
			double cos2a_2d_ = Math.Cos(2*azimut2*rad-2*deklinace*rad);
			double cos2aplus2f_ = Math.Cos(2*azimut2*rad+2*zemsirka*rad);
			double cos2aplus2d_ = Math.Cos(2*azimut2*rad+2*deklinace*rad);
			double cos2f_2d_ = Math.Cos(2*zemsirka*rad-2*deklinace*rad);
			double cos2fplus2d_ = Math.Cos(2*zemsirka*rad+2*deklinace*rad);

			double cos2aplus2fplus2d_ = Math.Cos(2*azimut2*rad+2*zemsirka*rad+2*deklinace*rad);
			double cos2a_2fplus2d_ = Math.Cos(2*azimut2*rad-2*zemsirka*rad+2*deklinace*rad);
			double cos2aplus2f_2d_ = Math.Cos(2*azimut2*rad+2*zemsirka*rad-2*deklinace*rad);
			double cos2a_2f_2d_ = Math.Cos(2*azimut2*rad-2*zemsirka*rad-2*deklinace*rad);
			

			//Výpočtová část

				double cast1_ = -8*Math.Sqrt(2);
				double cast2_ = Math.Sqrt(cosa2_*cosd2_*cos2a_2f_ - 2*cosa2_*cos2f_*cosd2_ + cosa2_*cosd2_*cos2aplus2f_ + 2*cosa2_*cosd2_ + 2*cosa2_*cos2a_*cosd2_ + 4*cosa2_*cos2d_*cosd2_);
				double cast3_ = cos2a_2f_2d_ - cos2aplus2f_2d_ - cos2a_2fplus2d_ + cos2aplus2fplus2d_ + 2*cos2f_2d_ - 2*cos2fplus2d_;
				double cast4_ = cos2a_2f_2d_ + cos2aplus2f_2d_ + cos2a_2fplus2d_ + cos2aplus2fplus2d_ + 2*cos2a_2f_ + 2*cos2aplus2f_ + 2*cos2a_2d_ + 2*cos2aplus2d_ + 4*cos2a_ - 2*cos2f_2d_ - 2*cos2fplus2d_ - 4*cos2f_ + 12*cos2d_ + 12;

				//-90 až 0

				double cast1_1_ = cast1_*cast2_;
				double cast2_1_ = cast1_1_ - cast3_;
				double cast3_1_ = cast2_1_/cast4_;

				double arccos1_ = Math.Acos(cast3_1_);
				double vysledek1_1_ = arccos1_/rad;
				double vysledek2_1_ = vysledek1_1_/15;


				//0 až 90

				double arccos2_ = -Math.Acos(cast3_1_);
				double vysledek1_2_ = arccos2_/rad;
				double vysledek2_2_ = vysledek1_2_/15;
				double vysledek3_2_= vysledek2_2_+24;

				//90 až 180

				double cast1_2_ = cast1_*cast2_;
				double cast2_2_ = cast1_2_ + cast3_;
				double cast3_2_ = cast2_2_/cast4_;

				double arccos3_ = Math.Acos(cast3_2_);
				double vysledek1_3_ = arccos3_/rad;
				double vysledek2_3_ = vysledek1_3_/15;
				double vysledek3_3_ = vysledek2_3_+12;

				//-180 až -90

				double arccos4_ = -Math.Acos(cast3_2_);
				double vysledek1_4_ = arccos4_/rad;
				double vysledek2_4_ = vysledek1_4_/15;
				double vysledek3_4_ = vysledek2_4_+12;

			
			//Logická část

			double mezivysledek2 = 0;

			if (azimut2 == 0)
			{
				mezivysledek2 = 12;
			}
			else
			{
				if (azimut2 == 180)
				{
					mezivysledek2 = 0;
				}		
				else
				{
					if (azimut2 == -180)
					{
						mezivysledek2 = 0;
					}
					else
					{
						if (azimut2 > 90)
						{
							mezivysledek2 = vysledek3_3_;

						}
						else
						{
							if (azimut2 > 0)
							{
								mezivysledek2 = vysledek3_2_;
							}
							else
							{
								if (azimut2 > -90)
								{
									mezivysledek2 = vysledek2_1_;
								}
								else
								{
									mezivysledek2 = vysledek3_4_;
								}
							}
						}
					}
				}
			}

			double dilci = mezivysledek-mezivysledek2;

		//ZABEZPEČENÍ ZÁPORNÝCH HODNOT

			if (dilci < 0)
			{
				dilci = dilci*(-1);
			}
			else
			{
				dilci = dilci+0;
			}

			string vysledek2 = PrevodCasu(dilci);
			double dilcivys = dilci;

			
		//MAX 5 ÚDAJŮ PRO VÝPOČET
			
			if (count < 6)
			{
			
				Label label = new Label();
				label.Text = Convert.ToString(count) + ") od " + Convert.ToString(nazimut.Value) + "° do " + Convert.ToString(nazimut2.Value) + "°";
				label.Left = 350;
				label.Width = 100;
				label.Top = 70+25*count;
				this.Controls.Add(label);
				this.labels.Add(label);

				Label label2 = new Label();
				label2.Text = vysledek2;
				label2.Left = 470;
				label2.Top = 70+25*count;
				this.Controls.Add(label2);
				this.labels.Add(label2);
				
				this.azimuty.Add(dilcivys);
				double total = this.azimuty.Sum();		
				this.sumLabel.Text = "CELKEM: " + PrevodCasu(total);
			}
		}

	//UKONČENÍ APLIKACE

		private void OnClickKonec(object sender,EventArgs e)
		{
			Application.Exit();
		}

	
	//TLAČÍTKO PRO RYCHLÝ VÝPOČET PŘI DANÉM AZIMUTU
	
		public void OnClickStart(object sender,EventArgs e)
		{

		//STATIC

			double den = Convert.ToDouble(nden.Value);
			double mesic = Convert.ToDouble(nmesic.Value);
			double zemsirka = Convert.ToDouble(nzemsirka.Value);
			double azimut = Convert.ToDouble(nazimut.Value);

		//RADIAN

			double rad = Math.PI / 180;	

		//DEKLINACE						

			double deklinace = (23.45*rad*Math.Sin(0.98*rad*den + 29.7*rad*mesic - 109*rad))/rad;
			lbldeklinace.Text = deklinace.ToString("F4") + "°";

		//ČAS

			//Číselná přípravná část
	
			double cosa = Math.Cos(azimut*rad);
			double cosa2 = Math.Pow(cosa, 2);
			double cos2a = Math.Cos(2*azimut*rad);

			double cosd = Math.Cos(deklinace*rad);
			double cosd2 = Math.Pow(cosd, 2);
			double cos2d = Math.Cos(2*deklinace*rad);

			double cosf = Math.Cos(zemsirka*rad);
			double cosf2 = Math.Pow(cosf, 2);
			double cos2f = Math.Cos(2*zemsirka*rad);
			
			double cos2a_2f = Math.Cos(2*azimut*rad-2*zemsirka*rad);
			double cos2a_2d = Math.Cos(2*azimut*rad-2*deklinace*rad);
			double cos2aplus2f = Math.Cos(2*azimut*rad+2*zemsirka*rad);
			double cos2aplus2d = Math.Cos(2*azimut*rad+2*deklinace*rad);
			double cos2f_2d = Math.Cos(2*zemsirka*rad-2*deklinace*rad);
			double cos2fplus2d = Math.Cos(2*zemsirka*rad+2*deklinace*rad);

			double cos2aplus2fplus2d = Math.Cos(2*azimut*rad+2*zemsirka*rad+2*deklinace*rad);
			double cos2a_2fplus2d = Math.Cos(2*azimut*rad-2*zemsirka*rad+2*deklinace*rad);
			double cos2aplus2f_2d = Math.Cos(2*azimut*rad+2*zemsirka*rad-2*deklinace*rad);
			double cos2a_2f_2d = Math.Cos(2*azimut*rad-2*zemsirka*rad-2*deklinace*rad);
			


			//Výpočtová část

				double cast1 = -8*Math.Sqrt(2);
				double cast2 = Math.Sqrt(cosa2*cosd2*cos2a_2f - 2*cosa2*cos2f*cosd2 + cosa2*cosd2*cos2aplus2f + 2*cosa2*cosd2 + 2*cosa2*cos2a*cosd2 + 4*cosa2*cos2d*cosd2);
				double cast3 = cos2a_2f_2d - cos2aplus2f_2d - cos2a_2fplus2d + cos2aplus2fplus2d + 2*cos2f_2d - 2*cos2fplus2d;
				double cast4 = cos2a_2f_2d + cos2aplus2f_2d + cos2a_2fplus2d + cos2aplus2fplus2d + 2*cos2a_2f + 2*cos2aplus2f + 2*cos2a_2d + 2*cos2aplus2d + 4*cos2a - 2*cos2f_2d - 2*cos2fplus2d - 4*cos2f + 12*cos2d + 12;

				//-90 až 0

				double cast1_1 = cast1*cast2;
				double cast2_1 = cast1_1 - cast3;
				double cast3_1 = cast2_1/cast4;

				double arccos1 = Math.Acos(cast3_1);
				double vysledek1_1 = arccos1/rad;
				double vysledek2_1 = vysledek1_1/15;


				//0 až 90

				double arccos2 = -Math.Acos(cast3_1);
				double vysledek1_2 = arccos2/rad;
				double vysledek2_2 = vysledek1_2/15;
				double vysledek3_2 = vysledek2_2+24;

				//90 až 180

				double cast1_2 = cast1*cast2;
				double cast2_2 = cast1_2 + cast3;
				double cast3_2 = cast2_2/cast4;

				double arccos3 = Math.Acos(cast3_2);
				double vysledek1_3 = arccos3/rad;
				double vysledek2_3 = vysledek1_3/15;
				double vysledek3_3 = vysledek2_3+12;

				//-180 až -90

				double arccos4 = -Math.Acos(cast3_2);
				double vysledek1_4 = arccos4/rad;
				double vysledek2_4 = vysledek1_4/15;
				double vysledek3_4 = vysledek2_4+12;

			
			//Logická část

			double mezivysledek = 0;

			if (azimut == 0)
			{
				mezivysledek = 	12;
			}
			else
			{
				if (azimut == 180)
				{
					mezivysledek = 0;
				}		
				else
				{
					if (azimut == -180)
					{
						mezivysledek = 0;
					}
					else
					{
						if (azimut > 90)
						{
							mezivysledek = vysledek3_3;

						}
						else
						{
							if (azimut > 0)
							{
								mezivysledek = vysledek3_2;
							}
							else
							{
								if (azimut > -90)
								{
									mezivysledek = vysledek2_1;
								}
								else
								{
									mezivysledek = vysledek3_4;
								}
							}

						}
					}
				}
			}

			string vysledek2 = PrevodCasu(mezivysledek);

			lblcas.Text = vysledek2;
	
							
		}

	
	//PŘEVOD ČASU NA ČASOVÝ FORMÁT

		private string PrevodCasu(double mezivysledek)
		{
			TimeSpan dny  = TimeSpan.FromDays(mezivysledek/24);
			string time = Convert.ToString(dny);

			string realtime = time.Split('.')[0];

			return realtime;

		}
		


		
	}
}