Advertisement
NUCLEARESOL

Finding least time for object to roll on graph

Jul 17th, 2023 (edited)
721
1
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 10.98 KB | None | 1 0
  1. using System;
  2. using System.Diagnostics;
  3. using System.Threading;
  4. using System.Globalization;
  5.  
  6. class Program
  7. {
  8.  
  9.     static void Main()
  10.     {
  11.         int version = 1;
  12.         string type = "parabola";
  13.         double gravitationalA = 9.81d;
  14.         double[] startPoint = { 80, 20 };
  15.         double[] endpoint = { 0, 0 };
  16.         Boolean calculateDistance = true;
  17.  
  18.         Console.WriteLine("Following Variables are used:");
  19.         Console.WriteLine("Gravitational Accel: " + gravitationalA + " m/s");
  20.         Console.WriteLine("Goal: " + endpoint[0] + "," + endpoint[1]);
  21.         Console.WriteLine("Start: " + startPoint[0] + "," + startPoint[1]);
  22.         Console.WriteLine("Calculate Distance" + calculateDistance);
  23.         Console.WriteLine("y/n");
  24.         string confirmation = Console.ReadLine();
  25.  
  26.         if (confirmation != "y")
  27.         {
  28.             Console.WriteLine("");
  29.             Console.WriteLine("Abort, Please change the variable");
  30.             Console.WriteLine("graph type");
  31.             type = Console.ReadLine();
  32.             Console.WriteLine("Gravitational Acceleration");
  33.             gravitationalA = double.Parse(Console.ReadLine(), CultureInfo.InvariantCulture.NumberFormat);
  34.             Console.WriteLine("Start Point X");
  35.             startPoint[0] = double.Parse(Console.ReadLine(), CultureInfo.InvariantCulture.NumberFormat);
  36.             Console.WriteLine("Start Point Y");
  37.             startPoint[1] = double.Parse(Console.ReadLine(), CultureInfo.InvariantCulture.NumberFormat);
  38.             Console.WriteLine("");
  39.             Console.WriteLine("Following Variables are used:");
  40.             Console.WriteLine("Gravitational Accel: " + gravitationalA + " m/s");
  41.             Console.WriteLine("Goal: " + endpoint[0] + "," + endpoint[1]);
  42.             Console.WriteLine("Start: " + startPoint[0] + "," + startPoint[1]);
  43.             Thread.Sleep(3000);
  44.         }
  45.  
  46.         Stopwatch stopwatch = new Stopwatch();
  47.         stopwatch.Start();
  48.         Console.WriteLine("");
  49.         Console.WriteLine("Starting calculation");
  50.         double x = startPoint[0];
  51.         double velX = 0f;
  52.         double timestep = 0.0001f;
  53.         double time = 0f;
  54.         double initialCollvar = 1;
  55.         double initialCollvarStep = 0.1f;
  56.         double zeroInAccuracy = 0.0001f;
  57.         double maxTime = double.PositiveInfinity;
  58.         double limit = 400;
  59.         string strg = "";
  60.         Console.WriteLine(limit);
  61.         Tuple<double, double> calculateAcceleration(double X, double collVar, double depvar1, double depvar2)
  62.         {
  63.             double localSlope = 2.0f * collVar * (X - depvar1);
  64.  
  65.             //return -(float)(Math.Cos(Math.Atan(1f / localSlope)) * Math.Sin(Math.Atan(1f / localSlope)) * gravitationalA);
  66.             return Tuple.Create(-(double)(Math.Cos(Math.Atan(1f / localSlope)) * Math.Sin(Math.Atan(1f / localSlope)) * gravitationalA), localSlope);
  67.         }
  68.         Tuple<double, double> calculateAccelerationCircle(double X,double Y, double collVar, double h, double k)
  69.         {
  70.             double localSlope = (h-X)/(Y-k);
  71.  
  72.             //return -(float)(Math.Cos(Math.Atan(1f / localSlope)) * Math.Sin(Math.Atan(1f / localSlope)) * gravitationalA);
  73.             return Tuple.Create(-(double)(Math.Cos(Math.Atan(1f / localSlope)) * Math.Sin(Math.Atan(1f / localSlope)) * gravitationalA), localSlope);
  74.         }
  75.  
  76.         Console.WriteLine(strg);
  77.         Console.WriteLine("");
  78.         strg = "";
  79.         Tuple < double,double ,double, double> CalculateTimeParabola(double initialCollvar)
  80.         {
  81.             double h = 0;
  82.             double k = 0;
  83.             double distance = 0;
  84.             double deltaX = 0;
  85.  
  86.             x = startPoint[0];
  87.             velX = 0f;
  88.             time = 0f;
  89.             distance = 0f;
  90.             h = 0.5f * (startPoint[0] - (startPoint[1] / (startPoint[0] * initialCollvar)));
  91.             k = -initialCollvar * (double)Math.Pow(h, 2);
  92.             while (x >= 0 && time < limit)
  93.             {
  94.                 Tuple<double, double> calculatedVales = calculateAcceleration(x, initialCollvar, h, k);
  95.                 deltaX = (double)(velX * timestep + 0.5f * calculatedVales.Item1 * Math.Pow(timestep, 2));
  96.                 x = (double)(x + deltaX);
  97.                 velX = velX + (0 + calculateAcceleration(x, initialCollvar, h, k).Item1) * timestep / 1f;
  98.                 distance = distance + (double)Math.Sqrt(deltaX * deltaX * (calculatedVales.Item2 * calculatedVales.Item2 + 1.0f));
  99.                 time = time + timestep;
  100.             }
  101.  
  102.             return Tuple.Create(time, initialCollvar, h, k);
  103.         }
  104.  
  105.         Tuple<double, double, double, double> CalculateTimeCircle(double initialCollvar)
  106.         {
  107.             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)))
  108.             {
  109.                 return Tuple.Create(limit, initialCollvar, 0.0d, 0.0d);
  110.             }
  111.             double q = Math.Sqrt(Math.Pow(startPoint[1],2) + Math.Pow(startPoint[0],2));
  112.             double x3 = startPoint[0] / 2;
  113.             double y3 = startPoint[1] / 2;
  114.  
  115.  
  116.             double h = x3 + (Math.Sqrt(Math.Pow(initialCollvar,2)-Math.Pow(q/2,2))*(-startPoint[1]))/ q;
  117.             double k = y3 + (Math.Sqrt(Math.Pow(initialCollvar,2)-Math.Pow(q/2,2))*(startPoint[0])) / q;
  118.            
  119.             double distance = 0;
  120.             double deltaX = 0;
  121.  
  122.             x = startPoint[0];
  123.             velX = 0f;
  124.             time = 0f;
  125.             distance = 0f;
  126.             double y = k - Math.Sqrt(Math.Pow(initialCollvar, 2) - Math.Pow(x - h, 2));
  127.             while (x >= 0 && time < limit)
  128.             {
  129.                 y = k - Math.Sqrt(Math.Pow(initialCollvar, 2) - Math.Pow(x - h, 2));
  130.                 Tuple<double, double> calculatedVales = calculateAccelerationCircle(x,y, initialCollvar, h, k);
  131.                 deltaX = (double)(velX * timestep + 0.5f * calculatedVales.Item1 * Math.Pow(timestep, 2));
  132.                 x = (double)(x + deltaX);
  133.                 velX = velX + (0 + calculateAccelerationCircle(x,y, initialCollvar, h, k).Item1) * timestep / 1f;
  134.                 distance = distance + (double)Math.Sqrt(deltaX * deltaX * (calculatedVales.Item2 * calculatedVales.Item2 + 1.0f));
  135.                 time = time + timestep;
  136.             }
  137.  
  138.             return Tuple.Create(time, initialCollvar, h, k);
  139.         }
  140.  
  141.         Tuple<double, double, double, double, double, double> jumpingDecend()
  142.         {
  143.             //   Console.WriteLine(Math.Abs(initialCollvarStep)+","+zeroInAccuracy);
  144.             double var1=0;
  145.             double var2=0;
  146.             double var3 = 0;
  147.             double var4 = 0;
  148.             if (type == "parabola")
  149.             {
  150.                 var1 = 0;
  151.                 var2 = 0;
  152.             }
  153.             if (type == "circle")
  154.             {
  155.                 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));
  156.                 Console.Write(initialCollvar);
  157.             }
  158.  
  159.             while (Math.Abs(initialCollvarStep) >= zeroInAccuracy)
  160.             {
  161.                 // --  Console.Write("BOB");
  162.                 initialCollvar = initialCollvar + initialCollvarStep;
  163.                 if (type == "parabola")
  164.                 {
  165.                     time = CalculateTimeParabola(initialCollvar).Item1;
  166.                 }
  167.                 else if (type == "circle")
  168.                 {
  169.                     time = CalculateTimeCircle(initialCollvar).Item1;
  170.                 }
  171.                 // Console.WriteLine(distance);
  172.                 //  Console.WriteLine(initialCollvar + "(x-" + h + ")^2+" + k);
  173.                 strg = strg + "(" + initialCollvar + "," + time + ")" + ",";
  174.                 if (maxTime > time)
  175.                 {
  176.                     maxTime = time;
  177.                     initialCollvarStep = initialCollvarStep * 2;
  178.                 }
  179.  
  180.                 else if (time > maxTime)
  181.                 {
  182.                     if (time >= limit)
  183.                     {
  184.                         initialCollvar = initialCollvar - initialCollvarStep;
  185.                         initialCollvarStep = -initialCollvarStep / 4;
  186.                     }
  187.                     else
  188.                     {
  189.                         initialCollvarStep = -initialCollvarStep;
  190.                     }
  191.                 }
  192.                 else
  193.                 {
  194.                     initialCollvarStep = initialCollvarStep / 2;
  195.                 }
  196.             }
  197.             if (type == "circle")
  198.             {
  199.                 Tuple<double, double, double, double> resultcal = CalculateTimeCircle(initialCollvar);
  200.                 time = CalculateTimeCircle(initialCollvar).Item1;
  201.                 var1 = resultcal.Item1;
  202.                 var2 = resultcal.Item3;
  203.                 var3 = resultcal.Item4;
  204.             }
  205.             else if (type == "parabola")
  206.             {
  207.                 Tuple<double, double, double, double> resultcal = CalculateTimeParabola(initialCollvar);
  208.                 time = CalculateTimeParabola(initialCollvar).Item1;
  209.                 var1 = resultcal.Item2;
  210.                 var2 = resultcal.Item3;
  211.                 var3 = resultcal.Item4;
  212.             }
  213.             if (time > limit)
  214.             {
  215.  
  216.                 if (type == "circle")
  217.                 {
  218.                     initialCollvar = initialCollvar - initialCollvarStep / 2;
  219.                     Tuple<double, double, double, double> resultcal = CalculateTimeCircle(initialCollvar);
  220.                     time = resultcal.Item1;
  221.                     var1 = resultcal.Item2;
  222.                     var2 = resultcal.Item3;
  223.                     var3 = resultcal.Item4;
  224.                 }
  225.                 else if (type == "parabola")
  226.                 {
  227.                     initialCollvar = initialCollvar - initialCollvarStep / 2;
  228.                     Tuple<double, double, double, double> resultcal = CalculateTimeParabola(initialCollvar);
  229.                     time = CalculateTimeCircle(initialCollvar).Item1;
  230.                     var1 = resultcal.Item2;
  231.                     var2 = resultcal.Item3;
  232.                     var3 = resultcal.Item4;
  233.                 }
  234.             }
  235.             Console.WriteLine("Finished");
  236.             return Tuple.Create(initialCollvar, time, var1,var2,var3,var4);
  237.         }
  238.         Tuple<double, double, double, double, double, double> resultTuple = jumpingDecend();
  239.         Console.WriteLine("");
  240.         Console.WriteLine("time taken " + resultTuple.Item2 + " seconds");
  241.         Console.WriteLine("At variable = " + resultTuple.Item1);
  242.         Console.WriteLine("h = " + resultTuple.Item4);
  243.         Console.WriteLine("k = " + resultTuple.Item5);
  244.         Console.WriteLine();
  245.         stopwatch.Stop();
  246.         Console.WriteLine("");
  247.         Console.WriteLine("Calculation Time is {0} s", stopwatch.ElapsedMilliseconds / 1000f);
  248.         Console.WriteLine("Closing In 10 seconds");
  249.         Console.WriteLine(strg);
  250.         Thread.Sleep(10000);
  251.     }
  252. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement