pevel

Untitled

Nov 18th, 2022
686
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.04 KB | None | 0 0
  1. using System;
  2. using System.Drawing;
  3. using System.Linq;
  4. using NUnit.Framework;
  5.  
  6. namespace Manipulation
  7. {
  8.     struct PointD
  9.     {
  10.         public double X;
  11.         public double Y;
  12.  
  13.         public PointD(double x, double y)
  14.         {
  15.             X = x;
  16.             Y = y;
  17.         }
  18.     }
  19.  
  20.     public static class ManipulatorTask
  21.     {
  22.         public static double[] MoveManipulatorTo(double x, double y, double alpha)
  23.         {
  24.             var pointWrist = new PointD(x + Math.Cos(Math.PI - alpha) * Manipulator.Palm,
  25.                 y + Math.Sin(Math.PI - alpha) * Manipulator.Palm);
  26.             var elbow = TriangleTask.GetABAngle(Manipulator.UpperArm, Manipulator.Forearm,
  27.                 GetDistanceBetweenPoints(new PointD(0, 0), pointWrist));
  28.             var shoulder = TriangleTask.GetABAngle(Manipulator.UpperArm,
  29.                 GetDistanceBetweenPoints(new PointD(0, 0), pointWrist),
  30.                 Manipulator.Forearm) + Math.Atan2(pointWrist.Y, pointWrist.X);
  31.             var wrist = Math.PI * 2 - alpha - shoulder - elbow;
  32.             if (double.IsNaN(shoulder) || double.IsNaN(elbow) || double.IsNaN(wrist))
  33.                 return new[] { double.NaN, double.NaN, double.NaN };
  34.             return new[] { shoulder, elbow, wrist };
  35.         }
  36.  
  37.         private static double GetDistanceBetweenPoints(PointD firstPoint, PointD secondPoint)
  38.         {
  39.             return Math.Sqrt((secondPoint.X - firstPoint.X) * (secondPoint.X - firstPoint.X) +
  40.                              (secondPoint.Y - firstPoint.Y) * (secondPoint.Y - firstPoint.Y));
  41.         }
  42.     }
  43.  
  44.     [TestFixture]
  45.     public class ManipulatorTask_Tests
  46.     {
  47.         private static Random random = new Random();
  48.  
  49.         [Test]
  50.         public void TestMoveManipulatorTo()
  51.         {
  52.             for (var i = 0; i < 100; i++)
  53.             {
  54.                 var x = random.NextDouble() * 100 - 50;
  55.                 var y = random.NextDouble() * 100 - 50;
  56.                 var alpha = random.NextDouble() * Math.PI * 2;
  57.                 var angles = ManipulatorTask.MoveManipulatorTo(x, y, alpha);
  58.                 var checkNaN = MassiveHaveNaN(angles);
  59.                 var joints = AnglesToCoordinatesTask.GetJointPositions(angles[0], angles[1], angles[2]);
  60.                 if (checkNaN)
  61.                 {
  62.                     Assert.IsTrue(double.IsNaN(joints[2].X));
  63.                     Assert.IsTrue(
  64.                         double.IsNaN(joints[2].Y)); // NaN должен быть только когда GetJointPositions получает NaN
  65.                 }
  66.                 else
  67.                 {
  68.                     Assert.AreEqual(joints[2].X, x, 1e-4);
  69.                     Assert.AreEqual(joints[2].Y, y,
  70.                         1e-4); // Пришлось снизить точность, так как В GetJointPositions на выходе точки типа float
  71.                 }
  72.             }
  73.         }
  74.  
  75.         private static bool MassiveHaveNaN(double[] massive)
  76.         {
  77.             return massive.Any(element => double.IsNaN(element));
  78.         }
  79.     }
  80. }
Advertisement
Add Comment
Please, Sign In to add comment