допиши автодокументацию до конца как на C#"using System;
using Avalonia;
using NUnit.Framework;
using static Manipulation.Manipulator;
namespace Manipulation
{
    public static class AnglesToCoordinatesTask
    {
        /// <summary>
        /// Получает позиции суставов на основе углов плеча, локтя и запястья.
        /// </summary>
        /// <param name="shoulder">угол плеча</param>
        /// <param name="elbow">угол локтя</param>
        /// <param name="wrist">угол запястья</param>
        /// <returns>Массив позиций суставов.</returns>
        public static Point[] GetJointPositions(double shoulder, double elbow, double wrist)
        {
            var positionY = Math.Sin(shoulder) * UpperArm;
            var positionX = Math.Cos(shoulder) * UpperArm;
            var elbowPos = new Point(positionX, positionY);
            positionY += Math.Sin(elbow + shoulder - Math.PI) * Forearm;
            positionX += Math.Cos(elbow + shoulder - Math.PI) * Forearm;
            var wristPos = new Point(positionX, positionY);
            positionY += Math.Sin(wrist + elbow + shoulder - 2 * Math.PI) * Palm;
            positionX += Math.Cos(wrist + elbow + shoulder - 2 * Math.PI) * Palm;
            var palmEndPos = new Point(positionX, positionY);
            return new[] { elbowPos, wristPos, palmEndPos };
        }
    }

    [TestFixture]
    /// <summary>
    /// Класс с тестами для методов класса AnglesToCoordinatesTask.
    /// </summary>
    public class AnglesToCoordinatesTask_Tests
    {
        [TestCase(Math.PI / 2, Math.PI / 2, Math.PI, Forearm + Palm, UpperArm)]
        [TestCase(Math.PI / 2, Math.PI / 2, Math.PI / 2, Forearm, UpperArm - Palm)]
        [TestCase(Math.PI / 2, Math.PI, Math.PI / 2, Palm, Forearm + UpperArm)]
        [TestCase(Math.PI / 2, Math.PI, Math.PI, 0, UpperArm + Palm + Forearm)]
        /// <summary>
        /// Проверка метода GetJointPositions на правильность вычисления позиций суставов.
        /// </summary>
        /// <param name="shoulder">угол плеча</param>
        /// <param name="elbow">угол локтя</param>
        /// <param name="wrist">угол запястья</param>
        /// <param name="palmEndX">ожидаемая координата X конца ладони</param>
        /// <param name="palmEndY">ожидаемая координата Y конца ладони</param>
        public void TestGetJointPositions(double shoulder, double elbow, double wrist, double palmEndX, double palmEndY)
        {
            var joints = AnglesToCoordinatesTask.GetJointPositions(shoulder, elbow, wrist);
            Assert.AreEqual(palmEndX, joints[2].X, 1e-5, "palm endX");
            Assert.AreEqual(palmEndY, joints[2].Y, 1e-5, "palm endY");
            Assert.AreEqual(GetDistance(joints[0], new Point(0, 0)), UpperArm);
            Assert.AreEqual(GetDistance(joints[0], joints[1]), 1e-5, Forearm);
            Assert.AreEqual(GetDistance(joints[1], joints[2]), 1e-5, Palm);
        }

        /// <summary>
        ///  Вычисляет расстояние между двумя точками.
        /// </summary>
        /// <param name="point1">первая точка</param>
        /// <param name="point2">второая точка</param>
        /// <returns>расстояние между двумя точками</returns>
        private double GetDistance(Point point1, Point point2)
        {
            var positionX = (point1.X - point2.X) * (point1.X - point2.X);
            var positionY = (point1.Y - point2.Y) * (point1.Y - point2.Y);
            return (float)Math.Sqrt(positionX + positionY);
        }
    }
}"