2 / 2 / 0
Регистрация: 19.10.2017
Сообщений: 214
1

Найти синус угла в многоугольнике

22.12.2018, 15:21. Показов 1496. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Я хочу найти синус каждого угла в многоугольнике с помощью векторного произведения, вот части кода:
C++
1
2
3
4
double cosinus(double x1, double x2, double y1, double y2){
 
  return (x1*x2+y1*y2)/(sqrt(x1*x1+y1*y1)*sqrt(x2*x2+y2*y2));
}
C++
1
2
3
4
5
6
7
8
9
10
int x[i] = {2, 4, 8, 7, 4};
int y[i] = {5, 3, 4, 9, 4};
for (i=0; i<5; i++){
    if (i == 4){
        x[5]=x[0];
    }
    z = cosinus(x[i], x[i+1], y[i], y[i+1]);
    angle[i] = sqrt(1-pow(z,2));
    cout << angle[i] << endl;
  };
Я нахожу синус угла через косинус, по формуле https://www.cyberforum.ru/cgi-bin/latex.cgi?sinx=\sqrt{1-{cosx}^{2}}, но таким образом синус у меня всегда будет положительным, а мне надо определить и отрицательные значения функции. Помогите изменить код?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.12.2018, 15:21
Ответы с готовыми решениями:

Вычислить синус угла и биссектрису
Найти синус угла (A+B) и бисиктрису угла B

Найти синус угла треугольника
В треугольнике АВС: \angle C=90^o, \operatorname{tg}A=\frac{3}{4}. Найдите \sin{A}

Найти синус угла между векторами.
а = {1,5; 3; 6.7; -8}, B = 4; 6; -7.2; -9} Найти синус угла между векторами. применить...

Найти синус угла между векторами.
. А = {1,5; 3; 6.7; -8}, B = 4; 6; -7.2; -9} Найти синус угла между векторами. для вычисления...

9
691 / 5398 / 265
Регистрация: 11.08.2016
Сообщений: 3,352
22.12.2018, 18:23 2
Если угол выпуклый, синус будет положительный, если впуклый - отрицательный.
0
2 / 2 / 0
Регистрация: 19.10.2017
Сообщений: 214
22.12.2018, 21:00  [ТС] 3
В этом то и стоит задача, проверить на впуклость, но у меня всё равно синус всегда положительный, видимо проблема в коде
0
2376 / 833 / 317
Регистрация: 10.02.2018
Сообщений: 1,966
22.12.2018, 21:35 4
sin - из векторного:
https://www.cyberforum.ru/cgi-bin/latex.cgi?\left|\vec{a} \right|\cdot \left|\vec{b} \right|\cdot \sin \left( ab\right) = {a}_{x}\cdot {b}_{y} - {a}_{y}\cdot {b}_{x}

cos - из скалярного:
https://www.cyberforum.ru/cgi-bin/latex.cgi?\left|\vec{a} \right|\cdot \left|\vec{b} \right|\cdot \cos \left( ab\right) = {a}_{x}\cdot {b}_{x} + {a}_{y}\cdot {b}_{y}
0
2 / 2 / 0
Регистрация: 19.10.2017
Сообщений: 214
23.12.2018, 22:38  [ТС] 5
Вот, что получилось, но у меня проблемы с функцией angle, не правильно считает https://www.cyberforum.ru/cgi-bin/latex.cgi?{x}_{a}*{y}_{b}-{y}_{a}*{x}_{b}:
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
#include <math.h>
#include <iostream>
 
using namespace std;
 
int X (int x1, int x2){
    x1 = x2-x1;
    return x1;
};
int Y (int y1, int y2){
    y1 = y2-y1;
    return y1;
};
double angle(double x1, double x2, double y1, double y2){
  return (x1*y2-y1*y2);
};
 
int main(){
  int n = 4;
  int i=n; 
  double ug[i];
  int x[] = {2, 4, 8, 7, 4};
  int y[] = {5, 3, 4, 9, 10};
  int xx[n];
  int yy[n];
  for (i=0; i<n+1;i++){
      if (i==n){
        x[i+1]= x[i-4];
        y[i+1]= y[i-4];
      }
      xx[i]=X(x[i],x[i+1]);
      yy[i]=Y(y[i],y[i+1]);
      cout << xx[i] << "  " << yy[i] << endl;
  };
  for (i=0; i<5;i++){
      if (i>=2){
        x[i+2]= x[i-3];
        y[i+2]= y[i-3];
      }
      ug[i]=angle(xx[i], xx[i+1], yy[i], yy[i+1]);
      cout << ug[i] << endl;
  };
  
  return 0;
};
Добавлено через 5 часов 54 минуты
Теперь я эту глупую ошибку решил. Но остались другие..
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
#include <math.h>
#include <iostream>
 
using namespace std;
 
//векторное произведение
int angle(int x1, int x2, int y1, int y2){
  return x1*y2-x2*y1;
};
 
int main(){
  int n = 4;
  int i=n; 
  double ug[i];
  int x[] = {2, 4, 8, 7, 4};
  int y[] = {5, 3, 4, 9, 10};
  int xx[n];
  int yy[n];
  for (i=0; i<n+1;i++){
    x[5]=x[0];
    y[5]=y[0];
    xx[i]=x[i+1]-x[i];
    yy[i]=y[i+1]-y[i];
    cout << xx[i] << " " << yy[i] << endl;// тут всё верно считает
  };
  for (i=0; i<n+1;i++){
    cout << xx[i] << " " << yy[i] << endl;// а тут, вроде тоже самое, но неправильно выводит 0 и последний элементы
    xx[5]=xx[0];
    yy[5]=yy[0];
    ug[i]=angle(xx[i], xx[i+1], yy[i], yy[i+1]);
      
      cout << ug[i] << endl;
  };
  return 0;
};
0
2376 / 833 / 317
Регистрация: 10.02.2018
Сообщений: 1,966
24.12.2018, 00:13 6
У вас выход за границы массива. x[5] - подразумевает, что у массива есть 6 ячеек. Их же всего 5 для x и 4 для xx. При выходе за границы затираются значения других переменных.
0
2 / 2 / 0
Регистрация: 19.10.2017
Сообщений: 214
24.12.2018, 01:08  [ТС] 7
Вроде понял

Добавлено через 5 минут
И даже заработало
А вот не знаешь, можно ли получше сделать код, оптимизировать?
0
119 / 94 / 35
Регистрация: 18.12.2012
Сообщений: 654
24.12.2018, 04:50 8
Цитата Сообщение от Knzj Посмотреть сообщение
можно ли получше сделать код, оптимизировать?
Нет предела совершенству
Если Вы просите разрешения у Ygg, то скорее всего он его даст
Если Вы спрашиваете о возможности улучшения кода, то ответ, скорее всего, будет "Да"
0
2 / 2 / 0
Регистрация: 19.10.2017
Сообщений: 214
24.12.2018, 12:37  [ТС] 9
Да, я боялся без его разрешения код трогать
0
2376 / 833 / 317
Регистрация: 10.02.2018
Сообщений: 1,966
24.12.2018, 13:14 10

Не по теме:

разрешаю :D


Из оптимизаций приходит на ум несколько вариантов, но нужно смотреть, как оно выйдет, а то может лучше и так оставить.
1) Попытаться убрать дополнительный элемент из хвоста массива, который дублирует первый элемент.
1.1) Сделать первую итерацию до цикла, что бы она поглотила связку начала и конца массива. А в цикле сделать только простые итерации.
1.2) Задействовать деление по модулю. При выходе индекса за границы массива результат модуля всегда будет давать индекс в нужном диапазоне (0 <= (index)%N < N).
2) Попытаться убрать второй массив, если он не нужен. Изменить функцию определения знака синуса, что бы она сама считала разности.
0
24.12.2018, 13:14
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.12.2018, 13:14
Помогаю со студенческими работами здесь

Как найти косинус/синус угла, но не целого, а с минутами
Как найти косинус/синус угла, но не целого, а с минутами? Например косинус угла 66 градусов 26...

Как найти косинус и синус при найденном арктангенсе угла ?
подскажите как здесь находят косинус и синус

Синус угла и цикл
Выведите с шагом в 1 градус все значения синуса угла от 0 до 180 градусов в таком виде:...

Синус тройного угла
можно ли sin(\frac{3t}{2}) заменить углом sin(\frac{t}{2})? правильно ли это будет ведь там можно...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

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