Advertisement
imk0tter

Rotatix C#

Jan 7th, 2020
342
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.48 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. public class Rotatix
  4. {
  5.     long sideCount;
  6.     int armCount;
  7.  
  8.     long[] armLengths;
  9.     long[] armRotations;
  10.  
  11.     double[] armDegrees;
  12.  
  13.     /// Getters and setters
  14.     ///
  15.     public long Sides
  16.     {
  17.         get
  18.         {
  19.             return sideCount;
  20.         }
  21.  
  22.         set
  23.         {
  24.             sideCount = value;
  25.             ArmRotationsToDegrees(armRotations);
  26.         }
  27.     }
  28.     public long[] Rotations
  29.     {
  30.         get
  31.         {
  32.             return armRotations;
  33.         }
  34.         set
  35.         {
  36.             armRotations = value;
  37.             sideCount = ArmRotationsToSideCount(armRotations);
  38.             ArmRotationsToDegrees(armRotations);
  39.         }
  40.     }
  41.     public long[] Lengths
  42.     {
  43.         get
  44.         {
  45.             return armLengths;
  46.         }
  47.         set
  48.         {
  49.             armLengths = value;
  50.  
  51.         }
  52.     }
  53.     public int Count
  54.     {
  55.         get
  56.         {
  57.             return armCount;
  58.         }
  59.         set
  60.         {
  61.             armCount = value;
  62.         }
  63.     }
  64.     public double[] Degrees
  65.     {
  66.         get
  67.         {
  68.             return armDegrees;
  69.         }
  70.         set
  71.         {
  72.             armDegrees = value;
  73.             ArmDegreesToRotations(armDegrees);
  74.         }
  75.     }
  76.     ///
  77.     ///
  78.     ///
  79.  
  80.     public Rotatix(int armCount)
  81.     {
  82.         Count = armCount;
  83.     }
  84.     public Rotatix(params double[] degrees)
  85.     {
  86.         ArmDegreesToRotations(degrees);
  87.     }
  88.     public Rotatix(params long[] rotations)
  89.     {
  90.         armCount = rotations.Length;
  91.         armLengths = new long[armCount];
  92.         armRotations = new long[armCount];
  93.         armDegrees = new double[armCount];
  94.         Array.Copy(rotations, 0, armRotations, 0, armCount);
  95.  
  96.         sideCount = ArmRotationsToSideCount(armRotations);
  97.         ArmRotationsToDegrees(armRotations);
  98.     }
  99.     public void ArmRotationsToDegrees(params long[] rotations)
  100.     {
  101.         for (int i = 0; i < rotations.Length; ++i)
  102.         {
  103.             armDegrees[i] = (double)(360f / (double)((double)sideCount / (double)rotations[i]));
  104.             //Console.WriteLine("Side Count: {0}, Degrees: {1}, Rotations: {2}", sideCount, armDegrees[i], rotations[i]);
  105.         }
  106.     }
  107.     public void ArmDegreesToRotations(params double[] degrees)
  108.     {
  109.         List<double> _degrees = new List<double>();
  110.         _degrees.AddRange(degrees);
  111.         _degrees.ForEach(ParseDegrees);
  112.         long sideCount = (long)LCM(_degrees.ToArray());
  113.         for (int i = 0; i < degrees.Length; ++i)
  114.         {
  115.             armRotations[i] = (long)(sideCount / _degrees[i]);
  116.         }
  117.         armDegrees = degrees;
  118.         this.sideCount = ArmRotationsToSideCount(armRotations);
  119.     }
  120.     public void ParseDegrees(double degree)
  121.     {
  122.         degree = 360 / degree;
  123.     }
  124.     public long ArmRotationsToSideCount(params long[] rotations)
  125.     {
  126.         long lcm = (long)LCM(rotations);
  127.         return lcm;
  128.     }
  129.  
  130.     public double GCD(double a, double b)
  131.     {
  132.         while (b != 0)
  133.         {
  134.             double x = b;
  135.             b = a % b;
  136.             a = x;
  137.         }
  138.         return a;
  139.     }
  140.  
  141.     public double _LCM(double a, double b)
  142.     {
  143.         return a * b / GCD(a, b);
  144.     }
  145.  
  146.     public long GCD(long a, long b)
  147.     {
  148.         while (b != 0)
  149.         {
  150.             long x = b;
  151.             b = a % b;
  152.             a = x;
  153.         }
  154.         return a;
  155.     }
  156.  
  157.     public long _LCM(long a, long b)
  158.     {
  159.         return a * b / GCD(a, b);
  160.     }
  161.     public long LCM(params long[] integers)
  162.     {
  163.         long[] integers2 = new long[integers.Length - 1];
  164.         if (integers.Length >= 2)
  165.         {
  166.             integers2[0] = _LCM(integers[0], integers[1]);
  167.             if (integers.Length >= 3)
  168.             {
  169.                 Array.Copy(integers, 2, integers2, 1, integers2.Length - 1);
  170.             }
  171.             return LCM(integers2);
  172.         }
  173.         else
  174.         {
  175.             return integers[0];
  176.         }
  177.     }
  178.  
  179.     public double LCM(params double[] integers)
  180.     {
  181.         double[] integers2 = new double[integers.Length - 1];
  182.         if (integers.Length >= 2)
  183.         {
  184.             integers2[0] = _LCM(integers[0], integers[1]);
  185.             if (integers.Length >= 3)
  186.             {
  187.                 Array.Copy(integers, 2, integers2, 1, integers2.Length - 1);
  188.             }
  189.             return LCM(integers2);
  190.         }
  191.         else
  192.         {
  193.             return integers[0];
  194.         }
  195.     }
  196. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement