Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.79/47: Рейтинг темы: голосов - 47, средняя оценка - 4.79
0 / 0 / 0
Регистрация: 22.06.2017
Сообщений: 1
1

Расчет углов. Задание манипулятор

18.07.2017, 06:38. Показов 8784. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток. Это моя 1 тема на форуме поэтому не судите строго. Учу c# самостоятельно и не долго. Прохожу задания вот на этом сайте ulearn.me.

Столкнулся с такой проблемой. Не могу решить вот эту задачу прям никак. https://ulearn.me/Course/Basic... 7bb2390dfd

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
using System;
namespace Manipulation
{
    public static class ManipulatorTask
    {
    static  double UpperArm = 150;
        static  double Forearm = 120;
        static  double Palm = 100;
        static double xc = 0;
        static double yc = 0;
        public static double GetABAngle(double a, double b, double c)//функция находит угол между 2 сторонами в треугольнике 
        {
            if (CheckSides(a, b, c) < 0)
                return double.NaN;
            else
            {
                double angle = (Math.Pow(a, 2) + Math.Pow(b, 2) - Math.Pow(c, 2)) / (2 * a * b);
                return Math.Acos(angle);
            }
        }
        public static int CheckSides(double a, double b, double c) //проверка треугольника на существование 
        {
            if (a <= 0 || b <= 0 || c < 0 || (a > b + c) || (b > c + a) || (c > a + b) ||
                (a == 0 && b == 0 && c == 0))
                return -1;
            return 1;
        }
        public static double[] MoveManipulatorTo(double x, double y, double angle)//основная функция в которой производится нахождение углов
        {
            double[] temp = new double[3];
            var angle_Elbow = Calc_Elbow(x, y, angle);
            var angle_Shoulder = Calc_Shoulder();
            var angle_Wrist = Calc_Wrist(angle, angle_Elbow, angle_Shoulder);
            if (double.IsNaN(angle_Elbow) || double.IsNaN(angle_Shoulder) ||
                double.IsNaN(angle_Wrist))
                temp = new[] { double.NaN, double.NaN, double.NaN };
            temp = new[] {angle_Shoulder, angle_Elbow, angle_Wrist};
            return temp;
        }
        public static double Calc_Elbow(double x, double y, double angle)
        {
            var ac = Calc_ShWr(x, y, angle);
            var angle_Elbow = GetABAngle(UpperArm, Forearm, ac);
            var i = GetPoints(0, 0, UpperArm, xc, yc, Forearm);
            if ((i[0]>= 0 &&i[1] >=0 ) || (i[0] <= 0 && i[1] <= 0))
                return angle_Elbow;
            return -angle_Elbow;
        }
        public static double Calc_ShWr(double x, double y, double angle)//функция считает растояние от точки Shoulder до точки Wrist
        {
            if(x >= 0)
xc = x - Math.Abs(Palm * Math.Cos(angle));
            else
xc = x + Math.Abs(Palm * Math.Cos(angle));
            if(y >= 0)
yc = Math.Abs(y) - Math.Abs(Palm * Math.Sin(angle));
            else
yc = y + Math.Abs(Palm * Math.Sin(angle));
            if ((xc < 1e-12 && xc > 0) || (xc > -1e-12 && xc < 0)) xc = 0;
            if ((yc < 1e-12 && yc > 0) || (yc > -1e-12 && yc < 0)) yc = 0;
            double ac = Math.Sqrt(Math.Pow(xc, 2) + Math.Pow(yc, 2));
            return ac;
        }
        public static double Calc_Shoulder()
        {
            var i = GetPoints(0, 0, UpperArm, xc, yc, Forearm);
            var angle_Shoulder = Math.Acos(i[0] / Math.Sqrt(i[0] * i[0] + i[1] * i[1]));
            if (yc < 0) angle_Shoulder *= -1;
            return angle_Shoulder;
        }
        public static double[] GetPoints(double x1,double y1,double r1,double x2,double y2,double r2)//пересечения 2-х окружностей чтобы найти точку elbow. 
        {
            double x0, y0, d, a, h;
            d = Math.Sqrt(Math.Pow(x1 - x2, 2) + Math.Pow(y1 - y2, 2));
            a = (r1 * r1 - r2 * r2 + d * d) / (2 * d);
            h = Math.Sqrt(Math.Pow(r1, 2) - Math.Pow(a, 2));
            x0 = x1 + a * (x2 - x1) / d;
            y0 = y1 + a * (y2 - y1) / d;
            var x20 = x0 + h * (y2 - y1) / d;
            var y20 = y0 - h * (x2 - x1) / d;
            if (a == r1) return new double[] {x20, y20};
            var x10 = x0 - h * (y2 - y1) / d;
            var y10 = y0 + h * (x2 - x1) / d;
            if(x20 + y20 > x10+y10) return new double[] { x20, y20 };
            else if(x20 + y20 < x10 + y10) return new double[] { x10, y10 };
            else return new double[] { Math.Min(x20,x10), Math.Max(y10, y20) };
        }
        public static double Calc_Wrist(double angle, double angle_Elbow , double angle_Shoulder)//считаю последний угол. Сумма всех углов равна 0.
        {
            var angle_Wrist = -angle - angle_Elbow - angle_Shoulder;
            if (angle_Wrist >= -Math.PI - 1e-11 && angle_Wrist <= Math.PI+ 1e-11)
                return angle_Wrist;
            angle_Wrist = angle_Wrist % Math.PI;
            var d = Math.Abs(Math.Abs(angle_Wrist) - Math.Abs(Math.PI));
            if ((angle_Wrist < 1e-12 && angle_Wrist > 0) ||
                (angle_Wrist > -1e-12 && angle_Wrist < 0)) angle_Wrist = 0;
            else if (angle_Wrist < 0 && d > 1e-9)
                angle_Wrist = angle_Wrist + Math.PI;
            else if (angle_Wrist > 0 && d > 1e-9)
                angle_Wrist = angle_Wrist - Math.PI;
            return angle_Wrist;
        }
    }
}

На простых примерах все работает. Но программа не может пройти 1 тест ,а именно вот такие входные данные.
Error on: MoveManipulatorTo(-270, 0, 0)
actual x should be -270, but was -70

При чем когда подается на вход (270, 0, 0) все работает верно. Помогите пожалуйста найти ошибку .

Моя логика решения такова:
1) сначала я нахожу коордиты точки Wrist и нахожу угол Elbow(в зависимости от точки Elbow)
2) потом нахожу угол Shoulder , как угол между двумя прямыми выходящими из точки (0,0). 2 прямая ось ОХ
3) Сумма всех углов в моей фигуре равна 0.(углы могут быть в пределах от -пи до пи) Поэтому я нахожу последный угол просто отнимая все остальные.

Заранее спасибо

Добавлено через 23 минуты
Ответ нашел сам.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.07.2017, 06:38
Ответы с готовыми решениями:

Написать программу «Манипулятор робота» так, чтобы она рисовала манипулятор из n сегментов
Здравствуйте)). Прошу помочь. Написать программу «Манипулятор робота» так, чтобы она рисовала...

расчет углов поворота
Здравствуйте!!! Помогите с одной проблемой. 1) Имеется главная система координат. 2) Есть...

Задание на нахождения углов
В параболе 4у=x^2 проведена хорда, абсциссы концов которой равны 2 и 5. Какие углы образует эта...

Исправление приращений, расчет координат для измеренных левых углов при обработке замкнутого теодолитного хода
Ребята очень нужна помощь по созданию таблицы спецификации, программу прилагаю. Заранее ОГРОМНОЕ...

1
24 / 6 / 3
Регистрация: 06.12.2015
Сообщений: 319
03.10.2017, 11:23 2
И зачем я тебе?)
0
03.10.2017, 11:23
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.10.2017, 11:23
Помогаю со студенческими работами здесь

Реализовать класс Triangle (задание 25), опираясь на класс Angle из задания 26 для представления углов
Реализовать класс Triangle (задание 25), опираясь на класс Angle из задания 26 для представления...

Вычисление одного из углов треугольника, когда заданы значения двух других углов
Написать программу вычисления одного из углов треугольника, когда заданы значения двух других...

Ввести значение углов a и b в градусах, затем посчитать и вывести значения cos и sin этих углов
Нужно ввести значение углов a и b в градусах, затем посчитать и вывести значения cos и sin этих...

задание на рекурсивный расчет формулы
С экрана вводится строка, которая имеет записанную без ошибок формулу следующего вида:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru