В том же проекте реализуйте метод MoveManipulatorTo в классе ManipulatorTask.
Он должен возвращать массив углов new[] {shoulder, elbow, wrist}
, необходимых для приведения эффектора манипулятора в точку (x, y)
относительно крепления манипулятора к столу, и с углом между последним суставом и горизонталью равному alpha
в радианах.
Если это невозможно, то возвращайте массив из трех double.NaN
.
Сверяйтесь с чертежом! Не перепутайте углы и их направления!
В том же файле напишите рандомизированный тест. Он должен генерировать случайные значения X, Y, Angle, вызывать MoveManipulatorTo, по углам вычислять позицию эффектора и проверять, что она совпадает с требуемой.
Эта ненавистная геометрия
Для решения этой задачи достаточно школьных знаний геометрии, однако поскольку наш курс посвящён программированию, и учитывая нелюбовь студентов к этой прекрасной области знаний, ниже дана схема геометрического решения этой задачи.
- Проще всего найти угол wrist. Сделать это можно по формуле wrist = –alpha – shoulder – elbow.
- Найдите координаты сустава Wrist по координатам (x, y) и углу alpha — они понадобятся в следующих шагах.
- Найдите угол elbow с помощью метода GetABAngle в треугольнике (shoulder, elbow, wrist), в котором все три стороны теперь известны.
- Найдите угол shoulder, как сумму двух углов:
- угла (wrist, shoulder, elbow), который опять же можно найти с помощью метода GetABAngle.
- и угла между лучом (shoulder, wrist) и осью OX. Его можно найти с помощью функции Math.Atan2 и координат сустава wrist.
Стоит заметить, что это не единственный способ решить данную задачу. Вы можете изобрести свой собственный.
1 2 3 4 5 6 7 8 |
// Вставьте сюда финальное содержимое файла ManipulatorTask.cs using System; using NUnit.Framework; namespace Manipulation { public static class ManipulatorTask { |
Стоимость решения этой задачи всего 100 рублей, купи решения у меня 🙂