Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вычислить значения углов n-угольника 
V
    Опции темы
Alexey91
Дата 10.10.2011, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 195
Регистрация: 18.9.2008

Репутация: нет
Всего: нет



Здравствуйте как можно вычислить значения углов многоугольника (произвольный, только несамопересекающийся), зная его стороны?
PM   Вверх
bsa
Дата 10.10.2011, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Alexey91, никак. нужно знать еще и углы. потому что только треугольники однозначно определяются сторонами. Представь равносторонний шестиугольник. А теперь возьми за два противоположных угла и вытяни в прямую. Получилась вырожденная фигура. Площадь ее равна 0. Но фактически, твоему условию соответствует.
PM   Вверх
Gluttton
Дата 10.10.2011, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

Репутация: нет
Всего: 54



Alexey91, никогда не сталкивался, но думаю, что как вариант можно находить каждый угол для некоторой точки рассматривая ее в совокупности с левым и правым соседом как треугольник.


--------------------
Слава Україні!
PM MAIL   Вверх
math64
Дата 10.10.2011, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 12
Всего: 72



Alexey91,  Gluttton, 
Как уже ответил bsa,  это невозможно. Нужна дополнительная информация. например:
1. Знать углы - 1 для 4 угольника, 2 для 5 угольника etc. Последние 3 вычисляются.
2. Знать диагонали (N-3) штуки, как и углов.
3. В многоугольник можно вписать окружность
4. Вокруг многоугольник можно описать окружность - определить радиус окружности, дальше элементарно.
5. Многоугольник максимальной площади из возможных
a) Предполагаются что углы A, B, C, ...
b) Вычисляется формула площади S(A, B, C, ...)
c) Вычисляются производные dS/dA, dS/dB, dS/dC, ...
d) Решается система дифуров dS/dA = 0; dS/dB = 0, dS/dC = 0, ...

Это сообщение отредактировал(а) math64 - 10.10.2011, 18:39
PM   Вверх
rodnover
Дата 11.10.2011, 10:38 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 223
Регистрация: 7.4.2009

Репутация: 2
Всего: 10



А его "стороны", случайно, координатами не задаются? ;)
PM MAIL   Вверх
Alexey91
Дата 13.10.2011, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 195
Регистрация: 18.9.2008

Репутация: нет
Всего: нет



rodnover, пробую как стороны заданные координаты

Ну если стороны отпадают, то тогда же можно вычислить угол как арккосинус косинуса между векторами?
То только тогда, что брать за вектор?
Получается одна точка на плоскости задается двумя координатами (x,y)
А вектор будет 4 параметра (Xi,Yi,Xi+1,Yi+1)

Попробовал сделать вычисление в цикле для 3-х вершин с координатами (2,8) (6,8) (3,3)

Код

for(int i=0, k; i < n-1; i++)    // Вычисляем углы, начиная с угла под 1-ой вершиной
{
  k=(i+2)%n;

  a=(double)(x[i]*x[i+1]+x[i+1]*x[k]+y[i]*y[i+1]+y[i+1]*y[k]);
  b=sqrt(pow(x[i],2)+pow(x[i+1],2)+pow(y[i],2)+pow(y[i+1],2));
  c=sqrt(pow(x[i+1],2)+pow(x[k],2)+pow(y[i+1],2)+pow(y[k],2));

 
  angles[i+1]=acos(a/(b*c)) * 180.0 / PI;
 }

                                // Вычисляем угол под нулевой вершиной
 a=(x[n-1]*x[0]+x[0]*x[1]+y[n-1]*y[0]+y[0]*y[1]);
 b=sqrt(pow(x[n-1],2)+pow(x[0],2)+pow(y[n-1],2)+pow(y[0],2));
 c=sqrt(pow(x[0],2)+pow(x[1],2)+pow(y[0],2)+pow(y[1],2));

 

 angles[0]=acos(a/(b*c)) * 180.0 / PI;

 return angles;
}



Но проблема, что сумма углов треугольника < 180 градусов. Видимо где-то ошибка. 

Это сообщение отредактировал(а) Alexey91 - 13.10.2011, 09:37
PM   Вверх
rodnover
Дата 13.10.2011, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 223
Регистрация: 7.4.2009

Репутация: 2
Всего: 10



Формулы у тебя странные.

http://ru.wikipedia.org/wiki/%D0%A1%D0%BA%...%BD%D0%B8%D0%B5

Еще на рисунок внимательно посмотри - как вектора расположены.
Код

// V1.x = x[i + 1] - x[i];
// V1.y = y[i + 1] - y[i];
// V2.x = x[k] - x[i + 1];
// V2.y = y[k] - y[i + 1];

// V1.x * V2.x + V1.y * V2.y

a = (double)((x[i + 1] - x[i]) * (x[k] - x[i + 1]) + (y[i + 1] - y[i]) * (y[k] - y[i + 1]));

// sqrt(V1.x * V1.x + V1.y * V1.y);
b = sqrt((x[i + 1] - x[i]) * (x[i + 1] - x[i]) + (y[i + 1] - y[i]) * (y[i + 1] - y[i]));
c = sqrt((x[k] - x[i + 1]) * (x[k] - x[i + 1]) + (y[k] - y[i + 1]) * (y[k] - y[i + 1]));

PM MAIL   Вверх
math64
Дата 13.10.2011, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 12
Всего: 72



Можно упростить так:
Код

for(int i=0; i < n; i++)
{
  int j  = (i + n -1)%n, k=(i+1)%n;
  double dxj = x[j] -x[i], dyj = y[j] - y[i], dxk = x[k] -x[i], dyk = y[k] - y[i];
  a=(double)(dxj*dxk+dyj*dyk);
  b=sqrt(dxj*dxj+dyj*dyj);
  c=sqrt(dxk*dxk+dyk*dyk); 
  angles[i]=acos(a/(b*c)) * 180.0 / M_PI;
 }

Если используется Qt:
Код

QList<double> angles(const QPolygonF& p)
{
  QList<double> angles;
  int n = p.count();
  for(int i=0; i < n; i++)
  {
    int j  = (i + n -1)%n, k=(i+1)%n;
    QPointF pt = p[i];
    QLineF a(pt, p[j]), b(pt, p[k]);
    angles << a.angleTo(b);
  }
  return angles;
}



Это сообщение отредактировал(а) math64 - 13.10.2011, 13:38
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0506 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.