Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Diagnostics;
- using System.Threading;
- using System.Globalization;
- class Program
- {
- static void Main()
- {
- int version = 1;
- string type = "parabola";
- double gravitationalA = 9.81d;
- double[] startPoint = { 80, 20 };
- double[] endpoint = { 0, 0 };
- Boolean calculateDistance = true;
- Console.WriteLine("Following Variables are used:");
- Console.WriteLine("Gravitational Accel: " + gravitationalA + " m/s");
- Console.WriteLine("Goal: " + endpoint[0] + "," + endpoint[1]);
- Console.WriteLine("Start: " + startPoint[0] + "," + startPoint[1]);
- Console.WriteLine("Calculate Distance" + calculateDistance);
- Console.WriteLine("y/n");
- string confirmation = Console.ReadLine();
- if (confirmation != "y")
- {
- Console.WriteLine("");
- Console.WriteLine("Abort, Please change the variable");
- Console.WriteLine("graph type");
- type = Console.ReadLine();
- Console.WriteLine("Gravitational Acceleration");
- gravitationalA = double.Parse(Console.ReadLine(), CultureInfo.InvariantCulture.NumberFormat);
- Console.WriteLine("Start Point X");
- startPoint[0] = double.Parse(Console.ReadLine(), CultureInfo.InvariantCulture.NumberFormat);
- Console.WriteLine("Start Point Y");
- startPoint[1] = double.Parse(Console.ReadLine(), CultureInfo.InvariantCulture.NumberFormat);
- Console.WriteLine("");
- Console.WriteLine("Following Variables are used:");
- Console.WriteLine("Gravitational Accel: " + gravitationalA + " m/s");
- Console.WriteLine("Goal: " + endpoint[0] + "," + endpoint[1]);
- Console.WriteLine("Start: " + startPoint[0] + "," + startPoint[1]);
- Thread.Sleep(3000);
- }
- Stopwatch stopwatch = new Stopwatch();
- stopwatch.Start();
- Console.WriteLine("");
- Console.WriteLine("Starting calculation");
- double x = startPoint[0];
- double velX = 0f;
- double timestep = 0.0001f;
- double time = 0f;
- double initialCollvar = 1;
- double initialCollvarStep = 0.1f;
- double zeroInAccuracy = 0.0001f;
- double maxTime = double.PositiveInfinity;
- double limit = 400;
- string strg = "";
- Console.WriteLine(limit);
- Tuple<double, double> calculateAcceleration(double X, double collVar, double depvar1, double depvar2)
- {
- double localSlope = 2.0f * collVar * (X - depvar1);
- //return -(float)(Math.Cos(Math.Atan(1f / localSlope)) * Math.Sin(Math.Atan(1f / localSlope)) * gravitationalA);
- return Tuple.Create(-(double)(Math.Cos(Math.Atan(1f / localSlope)) * Math.Sin(Math.Atan(1f / localSlope)) * gravitationalA), localSlope);
- }
- Tuple<double, double> calculateAccelerationCircle(double X,double Y, double collVar, double h, double k)
- {
- double localSlope = (h-X)/(Y-k);
- //return -(float)(Math.Cos(Math.Atan(1f / localSlope)) * Math.Sin(Math.Atan(1f / localSlope)) * gravitationalA);
- return Tuple.Create(-(double)(Math.Cos(Math.Atan(1f / localSlope)) * Math.Sin(Math.Atan(1f / localSlope)) * gravitationalA), localSlope);
- }
- Console.WriteLine(strg);
- Console.WriteLine("");
- strg = "";
- Tuple < double,double ,double, double> CalculateTimeParabola(double initialCollvar)
- {
- double h = 0;
- double k = 0;
- double distance = 0;
- double deltaX = 0;
- x = startPoint[0];
- velX = 0f;
- time = 0f;
- distance = 0f;
- h = 0.5f * (startPoint[0] - (startPoint[1] / (startPoint[0] * initialCollvar)));
- k = -initialCollvar * (double)Math.Pow(h, 2);
- while (x >= 0 && time < limit)
- {
- Tuple<double, double> calculatedVales = calculateAcceleration(x, initialCollvar, h, k);
- deltaX = (double)(velX * timestep + 0.5f * calculatedVales.Item1 * Math.Pow(timestep, 2));
- x = (double)(x + deltaX);
- velX = velX + (0 + calculateAcceleration(x, initialCollvar, h, k).Item1) * timestep / 1f;
- distance = distance + (double)Math.Sqrt(deltaX * deltaX * (calculatedVales.Item2 * calculatedVales.Item2 + 1.0f));
- time = time + timestep;
- }
- return Tuple.Create(time, initialCollvar, h, k);
- }
- Tuple<double, double, double, double> CalculateTimeCircle(double initialCollvar)
- {
- if (initialCollvar < (double)Math.Sqrt(Math.Pow(startPoint[1], 2) + Math.Pow((Math.Pow(startPoint[1], 2) - Math.Pow(startPoint[0], 2)) / (-2 * startPoint[0]), 2)))
- {
- return Tuple.Create(limit, initialCollvar, 0.0d, 0.0d);
- }
- double q = Math.Sqrt(Math.Pow(startPoint[1],2) + Math.Pow(startPoint[0],2));
- double x3 = startPoint[0] / 2;
- double y3 = startPoint[1] / 2;
- double h = x3 + (Math.Sqrt(Math.Pow(initialCollvar,2)-Math.Pow(q/2,2))*(-startPoint[1]))/ q;
- double k = y3 + (Math.Sqrt(Math.Pow(initialCollvar,2)-Math.Pow(q/2,2))*(startPoint[0])) / q;
- double distance = 0;
- double deltaX = 0;
- x = startPoint[0];
- velX = 0f;
- time = 0f;
- distance = 0f;
- double y = k - Math.Sqrt(Math.Pow(initialCollvar, 2) - Math.Pow(x - h, 2));
- while (x >= 0 && time < limit)
- {
- y = k - Math.Sqrt(Math.Pow(initialCollvar, 2) - Math.Pow(x - h, 2));
- Tuple<double, double> calculatedVales = calculateAccelerationCircle(x,y, initialCollvar, h, k);
- deltaX = (double)(velX * timestep + 0.5f * calculatedVales.Item1 * Math.Pow(timestep, 2));
- x = (double)(x + deltaX);
- velX = velX + (0 + calculateAccelerationCircle(x,y, initialCollvar, h, k).Item1) * timestep / 1f;
- distance = distance + (double)Math.Sqrt(deltaX * deltaX * (calculatedVales.Item2 * calculatedVales.Item2 + 1.0f));
- time = time + timestep;
- }
- return Tuple.Create(time, initialCollvar, h, k);
- }
- Tuple<double, double, double, double, double, double> jumpingDecend()
- {
- // Console.WriteLine(Math.Abs(initialCollvarStep)+","+zeroInAccuracy);
- double var1=0;
- double var2=0;
- double var3 = 0;
- double var4 = 0;
- if (type == "parabola")
- {
- var1 = 0;
- var2 = 0;
- }
- if (type == "circle")
- {
- initialCollvar = (double)Math.Sqrt(Math.Pow(startPoint[1], 2) + Math.Pow((Math.Pow(startPoint[1], 2) - Math.Pow(startPoint[0], 2)) / (-2 * startPoint[0]), 2));
- Console.Write(initialCollvar);
- }
- while (Math.Abs(initialCollvarStep) >= zeroInAccuracy)
- {
- // -- Console.Write("BOB");
- initialCollvar = initialCollvar + initialCollvarStep;
- if (type == "parabola")
- {
- time = CalculateTimeParabola(initialCollvar).Item1;
- }
- else if (type == "circle")
- {
- time = CalculateTimeCircle(initialCollvar).Item1;
- }
- // Console.WriteLine(distance);
- // Console.WriteLine(initialCollvar + "(x-" + h + ")^2+" + k);
- strg = strg + "(" + initialCollvar + "," + time + ")" + ",";
- if (maxTime > time)
- {
- maxTime = time;
- initialCollvarStep = initialCollvarStep * 2;
- }
- else if (time > maxTime)
- {
- if (time >= limit)
- {
- initialCollvar = initialCollvar - initialCollvarStep;
- initialCollvarStep = -initialCollvarStep / 4;
- }
- else
- {
- initialCollvarStep = -initialCollvarStep;
- }
- }
- else
- {
- initialCollvarStep = initialCollvarStep / 2;
- }
- }
- if (type == "circle")
- {
- Tuple<double, double, double, double> resultcal = CalculateTimeCircle(initialCollvar);
- time = CalculateTimeCircle(initialCollvar).Item1;
- var1 = resultcal.Item1;
- var2 = resultcal.Item3;
- var3 = resultcal.Item4;
- }
- else if (type == "parabola")
- {
- Tuple<double, double, double, double> resultcal = CalculateTimeParabola(initialCollvar);
- time = CalculateTimeParabola(initialCollvar).Item1;
- var1 = resultcal.Item2;
- var2 = resultcal.Item3;
- var3 = resultcal.Item4;
- }
- if (time > limit)
- {
- if (type == "circle")
- {
- initialCollvar = initialCollvar - initialCollvarStep / 2;
- Tuple<double, double, double, double> resultcal = CalculateTimeCircle(initialCollvar);
- time = resultcal.Item1;
- var1 = resultcal.Item2;
- var2 = resultcal.Item3;
- var3 = resultcal.Item4;
- }
- else if (type == "parabola")
- {
- initialCollvar = initialCollvar - initialCollvarStep / 2;
- Tuple<double, double, double, double> resultcal = CalculateTimeParabola(initialCollvar);
- time = CalculateTimeCircle(initialCollvar).Item1;
- var1 = resultcal.Item2;
- var2 = resultcal.Item3;
- var3 = resultcal.Item4;
- }
- }
- Console.WriteLine("Finished");
- return Tuple.Create(initialCollvar, time, var1,var2,var3,var4);
- }
- Tuple<double, double, double, double, double, double> resultTuple = jumpingDecend();
- Console.WriteLine("");
- Console.WriteLine("time taken " + resultTuple.Item2 + " seconds");
- Console.WriteLine("At variable = " + resultTuple.Item1);
- Console.WriteLine("h = " + resultTuple.Item4);
- Console.WriteLine("k = " + resultTuple.Item5);
- Console.WriteLine();
- stopwatch.Stop();
- Console.WriteLine("");
- Console.WriteLine("Calculation Time is {0} s", stopwatch.ElapsedMilliseconds / 1000f);
- Console.WriteLine("Closing In 10 seconds");
- Console.WriteLine(strg);
- Thread.Sleep(10000);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement