Форум программистов, компьютерный форум CyberForum.ru

Найти координаты всех вершин правильного многоугольника - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 47, средняя оценка - 4.85
Gans5
0 / 0 / 0
Регистрация: 15.03.2009
Сообщений: 9
25.09.2010, 12:15     Найти координаты всех вершин правильного многоугольника #1
Здрасте!

Есть задача:
Дан правильный N-угольник с центром в точке (X, Y) и с координатами одной из вершин X1, Y1. Найти координаты всех остальных вершин многоугольника.

Может кто нибуть подскажет как она решается? Хотя бы формулы нахождения вершин?

Заранее спасибо!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.09.2010, 12:15     Найти координаты всех вершин правильного многоугольника
Посмотрите здесь:

Многоугольник на плоскости задан целочисленными координатами своих N вершин в декартовой системе координат (найти площадь многоугольника) C++
Даны координаты вершин треугольника, и нужно найти наибольший угол в нем C++
C++ Найти площадь многоугольника, заданного перечислением координат вершин в порядке обхода его границы
C++ Найти площадь треугольника, если заданы координаты его вершин
C++ Найти площадь треугольника, если заданы координаты его вершин
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
25.09.2010, 15:34     Найти координаты всех вершин правильного многоугольника #2
Вершины правильного N-угольника с расстоянием R от центра до вершины (которое легко высчитывается извлечением корня из суммы квадратов разностей координат вершины с координатами центра) делят круг того же радиуса с тем же центром на N равных секторов. Поскольку весь круг - это 360°, угол, занимаемый одним сектором, со всей очевидностью составляет A = 360° / N. При помощи арктангенса (X1-X)/(Y1-Y) и с учётом знаков каждой из этих скобок ты легко найдёшь полный угол A0, на который отклонилась твоя вершина. Координаты каждой следующей вершины будут равны для i = 1..N-1 следующей паре координат: { X + R*cos(A0 + i*A); Y = R*sin(A0 + i*A) }
Gans5
0 / 0 / 0
Регистрация: 15.03.2009
Сообщений: 9
26.09.2010, 16:47  [ТС]     Найти координаты всех вершин правильного многоугольника #3
Вот что у меня получилось....
чвно что-то не то... зацикливается... подправьте плиз.... или подскажите что не так.........
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
int n,x,x1,y,y1,r,A,A0,;
int xx;
int yy;
int main()
{
cout<<"Количество вершин правильного многоугольника : ";
cin>>n;
cout<<"Введите координаты центра многоугольника!"<<endl;
cout<<"X = ";
cin>>x;
cout<<"Y = ";
cin>>y;
cout<<"Введите координаты вершины многоугольника!"<<endl;
cout<<"X1 = ";
cin>>x1;
cout<<"Y1 = ";
cin>>y1;
r=sqrt(((x-y)^2)+((x1-y1)^2));
A =360/n;
cout<<"A = "<<A;
A0=atan((x1-x)/(y1-y));
cout<<"A0= "<<A0;
 
for(int i=1;i=n-1;i++)
{
xx = r*cos(A0 + i*A);
yy = r*sin(A0 + i*A);
cout<<"xx= "<<xx;
cout<<"yy= "<<yy<<endl;
}
 
getch();
}
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
26.09.2010, 19:17     Найти координаты всех вершин правильного многоугольника #4
У вас нет условия выхода из цикла фор. В строке 25 вы записываете в i единицу, а вместо условия выхода записываете в i n-1, это, если я не ошибаюсь, всегда будет представлять собой логическую единицу и выхода не произойдёт. Если не ошибаюсь, ва нужен такой for:
for(int i=1;i<=n-1;i++)
chesser
17 / 17 / 1
Регистрация: 02.08.2010
Сообщений: 44
26.09.2010, 20:38     Найти координаты всех вершин правильного многоугольника #5
Ошибка уже в том, что выбран тип int и для координат вершин, и для расстояния между центром многоугольника и его вершинами, и для величин углов. Разве возможен тут целый тип? Надо выбрать тип double для переменных, хранящих эти величины.
Потом, вычисление координат вершин идет так, будто бы центр многоугольника находится в центре координат. Но это же совсем не факт. Надо учитывать смещение центра многоугольника относительно центра координат.
Gans5
0 / 0 / 0
Регистрация: 15.03.2009
Сообщений: 9
26.09.2010, 21:13  [ТС]     Найти координаты всех вершин правильного многоугольника #6
Что то не получается все равно....

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
#pragma hdrstop
#include <iostream.h>
#include <conio.h>
#include <stdio.h>
#include <windows.h>
#include <math.h>
        //Поддержка русского языка в консоле 
        ostream& operator<<(ostream&out,const char*str)
        {
        char s[256];
        CharToOem(str,s);
        for(int i=0;s[i]!=0;i++)
            out<<s[i];
        return out;
        }
 
//---------------------------------------------------------------------------
 
#pragma argsused
double n,r,x,x1,y,y1,A,A0,s=1;
double xx;
double yy;
int main()
{
cout<<"Количество вершин правильного многоугольника : ";
cin>>n;
cout<<"Введите координаты центра многоугольника!"<<endl;
cout<<"X = ";
cin>>x;
cout<<"Y = ";
cin>>y;
cout<<"Введите координаты вершины многоугольника!"<<endl;
cout<<"X1 = ";
cin>>x1;
cout<<"Y1 = ";
cin>>y1;
r=sqrt(((x-y)^2)+((x1-y1)^2));
A =360/n;
cout<<"A = "<<A<<endl;
A0=atan((x1-x)/(y1-y));
cout<<"A0= "<<A0<<endl;
 
for(int i=1;i<=n-1;i++)
{
xx = r*cos(A0 + i*A);
yy = r*sin(A0 + i*A);
cout<<"xx= "<<xx<<endl;
cout<<"yy= "<<yy<<endl;
};
getch();
}
Mr.X
Эксперт С++
 Аватар для Mr.X
2802 / 1578 / 247
Регистрация: 03.05.2010
Сообщений: 3,666
26.09.2010, 21:46     Найти координаты всех вершин правильного многоугольника #7
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
///////////////////////////////////////////////////////////////////////////////
//Дан правильный N-угольник с центром в точке (X, Y) и с координатами 
//одной из вершин X1, Y1. Найти координаты всех остальных вершин многоугольника.
///////////////////////////////////////////////////////////////////////////////
#include <cmath>
#include <complex>
#include <iostream>
 
typedef double                 T_coord;
typedef std::complex<T_coord>  T_point;
///////////////////////////////////////////////////////////////////////////////
void  print_polygon_vertexes
    (
        int      n, 
        T_point  center, 
        T_point  vertex
    )
{    
    std::cout << "Координаты остальных вершин "
              << n
              << "-угольника:"
              << std::endl;
 
    T_point  radius_next = vertex - center;    
    for(int i = 0; i < n - 1; ++i)
    {
        radius_next *= std::polar(1.0, acos(-1.0) * 2 / n );
        T_point vertex_next = center + radius_next;
        std::cout << vertex_next 
                  << std::endl;
    }
}
///////////////////////////////////////////////////////////////////////////////
int main()
{
    std::locale::global(std::locale(""));
    
    int n;
    do
    {
        std::cout << "Введите число углов многоугольника: ";
        std::cin >> n;
    }while(n < 3);
    std::cout << std::endl
              << "Введите координаты центра "
              << n
              << "-угольника:"
              << std::endl;
    
    T_coord  center_X;
    std::cout << "center_X = ";
    std::cin >> center_X;
 
    T_coord  center_Y;
    std::cout << "center_Y = ";    
    std::cin >> center_Y;
    T_point center(center_X, center_Y);
 
    std::cout << std::endl
              << "Введите координаты вершины "
              << n
              << "-угольника:"
              << std::endl;
 
    T_coord  vertex_X;
    std::cout << "vertex_X = ";
    std::cin >> vertex_X;
 
    T_coord  vertex_Y;
    std::cout << "vertex_Y = ";    
    std::cin >> vertex_Y;
    T_point  vertex(vertex_X, vertex_Y);
 
    print_polygon_vertexes(n, center, vertex);
}
Gans5
0 / 0 / 0
Регистрация: 15.03.2009
Сообщений: 9
27.09.2010, 06:55  [ТС]     Найти координаты всех вершин правильного многоугольника #8
Благодарю вас всех за помощь )
artemoning
0 / 0 / 0
Регистрация: 07.10.2014
Сообщений: 3
07.10.2014, 20:49     Найти координаты всех вершин правильного многоугольника #9
Вы не могли бы мне объяснить это операция над чем "T_point radius_next = vertex - center;"

Сам я Objective-C программист

Добавлено через 1 минуту
Цитата Сообщение от Mr.X Посмотреть сообщение
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
///////////////////////////////////////////////////////////////////////////////
//Дан правильный N-угольник с центром в точке (X, Y) и с координатами 
//одной из вершин X1, Y1. Найти координаты всех остальных вершин многоугольника.
///////////////////////////////////////////////////////////////////////////////
#include <cmath>
#include <complex>
#include <iostream>
 
typedef double                 T_coord;
typedef std::complex<T_coord>  T_point;
///////////////////////////////////////////////////////////////////////////////
void  print_polygon_vertexes
    (
        int      n, 
        T_point  center, 
        T_point  vertex
    )
{    
    std::cout << "Координаты остальных вершин "
              << n
              << "-угольника:"
              << std::endl;
 
    T_point  radius_next = vertex - center;    
    for(int i = 0; i < n - 1; ++i)
    {
        radius_next *= std::polar(1.0, acos(-1.0) * 2 / n );
        T_point vertex_next = center + radius_next;
        std::cout << vertex_next 
                  << std::endl;
    }
}
///////////////////////////////////////////////////////////////////////////////
int main()
{
    std::locale::global(std::locale(""));
    
    int n;
    do
    {
        std::cout << "Введите число углов многоугольника: ";
        std::cin >> n;
    }while(n < 3);
    std::cout << std::endl
              << "Введите координаты центра "
              << n
              << "-угольника:"
              << std::endl;
    
    T_coord  center_X;
    std::cout << "center_X = ";
    std::cin >> center_X;
 
    T_coord  center_Y;
    std::cout << "center_Y = ";    
    std::cin >> center_Y;
    T_point center(center_X, center_Y);
 
    std::cout << std::endl
              << "Введите координаты вершины "
              << n
              << "-угольника:"
              << std::endl;
 
    T_coord  vertex_X;
    std::cout << "vertex_X = ";
    std::cin >> vertex_X;
 
    T_coord  vertex_Y;
    std::cout << "vertex_Y = ";    
    std::cin >> vertex_Y;
    T_point  vertex(vertex_X, vertex_Y);
 
    print_polygon_vertexes(n, center, vertex);
}
Мне бы логическую цепочку, как работает этот алгоритм?
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
07.10.2014, 21:13     Найти координаты всех вершин правильного многоугольника #10
Цитата Сообщение от artemoning Посмотреть сообщение
Вы не могли бы мне объяснить это операция над чем "T_point radius_next = vertex - center;"
Объекты vertex и center имеют тип T_point. На самом деле это псевдоним для типа std::complex<T_coodr> (T_coord, в свою очередь, псевдоним для типа double - обычное число с плавающей запятой двойной точности). Эти объявления расположены в строках 9-10. Тип std::complex<T> - шаблонный класс стандартной библиотеки, инкапсулирующий комплексное число, представляющее собой пару (действительная и мнимая части комплексного числа) объектов типа T (в данном случае, типа T_coord == double), а также операции над такими числами. В данном случае этот тип используется для того, чтобы представить точку в двумерном пространстве. В классе std::complex перегружен оператор вычитания operator-, действующий так, как это принято в математике для комплексных чисел, т.е. вычитающий из действительной части одного операнда действительную часть другого, а из мнимой, соответственно, мнимую. Такая же логика арифметических операций принята и для векторов (и, соответственно, для точек). Таким образом, мы как-бы переносим наш n-угольник, совмещая его центр с началом координат, для удобства вычислений ("вращать" точку куда удобнее относительно начала координат, чем вокруг произвольной точки). Впоследствии, после вычисления очередной точки, мы переносим её обратно, складывая с координатами центра многоугольника.
artemoning
0 / 0 / 0
Регистрация: 07.10.2014
Сообщений: 3
07.10.2014, 22:20     Найти координаты всех вершин правильного многоугольника #11
Цитата Сообщение от silent_1991 Посмотреть сообщение
Объекты vertex и center имеют тип T_point. На самом деле это псевдоним для типа std::complex<T_coodr> (T_coord, в свою очередь, псевдоним для типа double - обычное число с плавающей запятой двойной точности). Эти объявления расположены в строках 9-10. Тип std::complex<T> - шаблонный класс стандартной библиотеки, инкапсулирующий комплексное число, представляющее собой пару (действительная и мнимая части комплексного числа) объектов типа T (в данном случае, типа T_coord == double), а также операции над такими числами. В данном случае этот тип используется для того, чтобы представить точку в двумерном пространстве. В классе std::complex перегружен оператор вычитания operator-, действующий так, как это принято в математике для комплексных чисел, т.е. вычитающий из действительной части одного операнда действительную часть другого, а из мнимой, соответственно, мнимую. Такая же логика арифметических операций принята и для векторов (и, соответственно, для точек). Таким образом, мы как-бы переносим наш n-угольник, совмещая его центр с началом координат, для удобства вычислений ("вращать" точку куда удобнее относительно начала координат, чем вокруг произвольной точки). Впоследствии, после вычисления очередной точки, мы переносим её обратно, складывая с координатами центра многоугольника.
Спасибо, с T_coord и T_point разобрался. А можете эту строку объяснить
C++ (Qt)
1
std::polar(1.0, acos(-1.0) * 2 / n );
И какая логика умножения для std::complex<T> ?

Добавлено через 43 минуты
Сделал наброски кода для восьмиугольника, но где то ошибка, радиус разный

C++
1
2
3
4
5
6
7
8
9
10
11
12
    double oX = center.x, oY = center.y, x1 = point.x, y1 = point.y;
    double radNextX = x1 - oX, radNextY = y1 - oY;
    double x, y;
    
    for(int i = 0; i < 8 - 1; ++i)
    {
        radNextX *= 1 * cos(acos(-1.0)*2/8);
        radNextY *= 1 * sin(acos(-1.0)*2/8);
        x = oX + radNextX;
        y = oY +radNextY;
        NSLog(@"x = %f y = %f r = %f", x, y, sqrt(pow(oX-x, 2)+pow(oY-y, 2)));
    }
Добавлено через 9 минут
Код вроде бы адаптировал правильно, но результат не верный
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
08.10.2014, 06:33     Найти координаты всех вершин правильного многоугольника #12
artemoning, интересно, вы погуглили, как переводить в полярные координаты, но поленились погуглить, как умножать комплексные числа. Для данного раздела это немного оффтопик, но объясню, благо всё просто.
Комплексное число, как я уже говорил, представлено парой чисел, первое из которых является действительной, а второе - мнимой частью комплексного числа. Комплексные числа принято записывать следующим образом:
http://www.cyberforum.ru/cgi-bin/latex.cgi?a+bi,
где http://www.cyberforum.ru/cgi-bin/latex.cgi?a - действительная часть,
http://www.cyberforum.ru/cgi-bin/latex.cgi?b - мнимая часть,
http://www.cyberforum.ru/cgi-bin/latex.cgi?i - мнимая единица, http://www.cyberforum.ru/cgi-bin/latex.cgi?i=\sqrt{-1}.
Умножаются комплексные числа так же, как пара полиномов одной переменной первой степени (т.е. надо просто раскрыть скобки по стандартным алгебраическим правилам):
http://www.cyberforum.ru/cgi-bin/latex.cgi?(a+bi)\cdot (c+di)=ac+adi+bci+bd{i}^{2}
Поскольку http://www.cyberforum.ru/cgi-bin/latex.cgi?i=\sqrt{-1}, то http://www.cyberforum.ru/cgi-bin/latex.cgi?{i}^{2}=-1, и значит:
http://www.cyberforum.ru/cgi-bin/latex.cgi?(a+bi)\cdot (c+di)=ac+adi+bci+bd{i}^{2}=ac+adi+bci-bd
Сгруппируем члены по признаку наличия в множителях мнимой единицы:
http://www.cyberforum.ru/cgi-bin/latex.cgi?(a+bi)\cdot (c+di)=ac+adi+bci+bd{i}^{2}=ac+adi+bci-bd=(ac-bd)+(ad+bc)i
Здесь http://www.cyberforum.ru/cgi-bin/latex.cgi?ac-bd - новая действительная часть, а http://www.cyberforum.ru/cgi-bin/latex.cgi?ad+bc - новая мнимая часть. Именно по этим формулам и нужно вычислять новую точку:
Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
double oX = center.x, oY = center.y, x1 = point.x, y1 = point.y;
double radNextX = x1 - oX, radNextY = y1 - oY;
double x, y;
double polarX, polarY;
double tempX, tempY;
 
for(int i = 0; i < 8 - 1; ++i)
{
    polarX = 1 * cos(acos(-1.0)*2/8);
    polarY = 1 * sin(acos(-1.0)*2/8);
    tempX = radNextX * polarX - radNextY * polarY;
    tempY = radNextX * polarY + radNextY * polarX;
    radNextX = tempX;
    radNextY = tempY;
    x = oX + radNextX;
    y = oY + radNextY;
    NSLog(@"x = %f y = %f r = %f", x, y, sqrt(pow(oX-x, 2)+pow(oY-y, 2)));
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.10.2014, 09:28     Найти координаты всех вершин правильного многоугольника
Еще ссылки по теме:

C++ Найти площадь треугольника, если известны координаты его вершин
C++ Найти координаты вершин треугольника из bmp файла
Функция вычисляющая радиус окружности описанной вокруг правильного многоугольника C++

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

Или воспользуйтесь поиском по форуму:
artemoning
0 / 0 / 0
Регистрация: 07.10.2014
Сообщений: 3
08.10.2014, 09:28     Найти координаты всех вершин правильного многоугольника #13
Спасибо, я вчера нашел эту ошибку, но было уже поздно и я не отписался на форуме. Еще раз спасибо!
Yandex
Объявления
08.10.2014, 09:28     Найти координаты всех вершин правильного многоугольника
Ответ Создать тему
Опции темы

Текущее время: 20:13. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru