Аватар для pahuss
79 / 73 / 66
Регистрация: 11.04.2013
Сообщений: 221

Вращение многоугольника вокруг произвольной точки

11.04.2013, 19:44. Показов 5944. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем здравствуйте. Прошу помощи. Суть задания:написать программу, реализующую вращение многоугольника вокруг произвольной точки.
Моя задумка такова: Будет работать цикл по кругу и из получаемых значений будет выстраиваться линия. Получится, что линия будет вращаться вокруг х0, у0. В теле цикла рабочим параметром будет угол fi. Выражение-система уравнений, определяющая связь между прежним положением х,у и новым х1,у1 через тригонометрические функции. Помогите. Спасибо заранее.



Pascal
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
uses GraphABC;
 
function resultX1(x1:real):integer;
begin
resultX1:=round(x1);
end;
function resultY1(y1:real):integer;
begin
resultY1:=round(int(y1));
end;
 
var x1,y1,x,y,fi:real;
    x0,y0:integer;
 
begin
repeat
      fi:=0;
      fi:=fi+1;
      x1:=x0+(x-x0)*cos(fi)-(y-y0)*sin(fi); y1:=y0+(x-x0)*sin(fi)+(y-y0)*cos(fi);
until fi<361;
 
 
begin
 
x1:=resultX1(x1);
y1:=resultY1(y1);
x0:=320;
y0:=240;
moveTo(x0,y0);
LineTo(x1,y1);
end;
end.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.04.2013, 19:44
Ответы с готовыми решениями:

Вращение прямоугольника вокруг точки
Помогите пожалуйста, прямоугольник вращается, Но, &quot;след&quot; за собой оставляет, не стирается предыдущее положение прямоугольника. Вроде должна...

Вращение вокруг одной из своих вершин
Буду благодарен если кто то поможет!!! Изобразить на экране треугольник, вращающийся в плоскости экрана вокруг одной из своих вершин.

Вращение многоугольника вокруг произвольной точки
Помогите, пожалуйста, написать программу, реализующую вращение многоугольника вокруг произвольной точки. Пересмотрела все выложенные...

6
Почетный модератор
 Аватар для Puporev
64312 / 47609 / 32742
Регистрация: 18.05.2008
Сообщений: 115,181
12.04.2013, 09:02
Пример вращения правильного многоугольника вокруг точки.
Можно чтобы он не поворачивался, геометрии будет чуть меньше, можно сделать неправильный, тогда геометрии будет намного больше, вычислять угол для каждой вершины.
Pascal
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
uses graphABC,crt;
type point=record
           x,y:integer;
           end;
const max=12;
procedure Mng(n,x,y,r,c:integer;u:real);
var p:array[1..max+1] of point;
    i:byte;
    a,da:real;
begin
da:=2*pi/n;
a:=u+pi/2;
for i:=1 to n do
 begin
  p[i].x:=x+round(r*cos(a));
  p[i].y:=y-round(r*sin(a));
  a:=a+da
 end;
 p[n+1]:=p[i];
 setbrushcolor(c);
 polygon(p,n+1);
end;
var n,xc,yc,x1,y1,r,r1:integer;
    u:real;
    k:char;
begin
repeat
write('Количество углов от 3 до ',max,' n=');
read(n);
until n in [3..max];
hidecursor;
clearwindow;
xc:=windowwidth div 2;
yc:=windowheight div 2;
r:=100;
r1:=50;
u:=0;
x1:=xc+round(r*cos(u));
y1:=yc-round(r*sin(u));
lockdrawing;
repeat
clearwindow;
setbrushstyle(bsClear);
textout(xc-50,10,'Выход Esc');
setbrushcolor(clBlue);
circle(xc,yc,2);
Mng(n,x1,y1,r1,clRed,u);
delay(100);
u:=u-0.1;
x1:=xc+round(r*cos(u));
y1:=yc-round(r*sin(u));
redraw;
if keypressed then k:=readkey
until k=#27;
end.
1
 Аватар для pahuss
79 / 73 / 66
Регистрация: 11.04.2013
Сообщений: 221
12.04.2013, 20:56  [ТС]
Не могли бы объяснить, зачем функции {x+round(r*cos(a)) и y-round(r*sin(a))} повторяются три раза и какую роль играет функция lockdrawing в данном примере на пальцах?
0
Почетный модератор
 Аватар для Puporev
64312 / 47609 / 32742
Регистрация: 18.05.2008
Сообщений: 115,181
13.04.2013, 07:50
Цитата Сообщение от pahuss Посмотреть сообщение
зачем функции {x+round(r*cos(a)) и y-round(r*sin(a))} повторяются три раза
Да,3 раза это лишнее, поторопился, достаточно 2 раза-установить координаты центра многоугольника и координаты его вершин.
Pascal
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
uses graphABC,crt;
type point=record
           x,y:integer;
           end;
const max=12;
procedure Mng(n,x,y,r,c:integer;u:real);
var p:array[1..max+1] of point;
    i:byte;
    a,da:real;
begin
da:=2*pi/n;//анутренний угол многоугольника
a:=u+pi/2;//направление на 1 вершину
for i:=1 to n do
 begin
  p[i].x:=x+round(r*cos(a)); //определяем координаты вершин многоугольника
  p[i].y:=y-round(r*sin(a)); //относительно центра описанной окружности
  a:=a+da
 end;
 p[n+1]:=p[i];//замыкаем многоугольник
 setbrushcolor(c);
 polygon(p,n+1);//рисуем
end;
var n,xc,yc,x1,y1,r,r1:integer;
    u:real;
    k:char;
begin
repeat
write('Количество углов от 3 до ',max,' n=');
read(n);
until n in [3..max];
hidecursor;
clearwindow;
xc:=windowwidth div 2;
yc:=windowheight div 2;
r:=100;
r1:=50;
u:=0;
lockdrawing;//блокируем вывод на экран, перерисовываем в буфере
repeat
clearwindow;
setbrushstyle(bsClear);
textout(xc-50,10,'Выход Esc');
setbrushcolor(clBlue);
circle(xc,yc,2);
x1:=xc+round(r*cos(u));//определяем текущие координаты центра окружности
y1:=yc-round(r*sin(u));
Mng(n,x1,y1,r1,clRed,u);
delay(100);
u:=u-0.1; //изменяем угол(- по часовой стрелке, + против часовой)
redraw;  //перерисовываем окно
if keypressed then k:=readkey
until k=#27;//Esc - выход
end.
Цитата Сообщение от pahuss Посмотреть сообщение
и какую роль играет функция lockdrawing в данном примере на пальцах?
Зачем на пальцах, откройте Помощь, стандартные модули, Graph ABC, режимы вывода и прочитайте сами.
1
 Аватар для pahuss
79 / 73 / 66
Регистрация: 11.04.2013
Сообщений: 221
14.04.2013, 11:23  [ТС]
Спасибо огромное!
0
0 / 0 / 0
Регистрация: 01.04.2015
Сообщений: 1
01.04.2015, 21:01
У меня проблема в программе товарища Puporev
Кликните здесь для просмотра всего текста
Pascal
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
uses graphABC,crt;
type point=record
           x,y:integer;
           end;
const max=12;
procedure Mng(n,x,y,r,c:integer;u:real);
var p:array[1..max+1] of point;
    i:byte;
    a,da:real;
begin
da:=2*pi/n;//анутренний угол многоугольника
a:=u+pi/2;//направление на 1 вершину
for i:=1 to n do
 begin
  p[i].x:=x+round(r*cos(a)); //определяем координаты вершин многоугольника
  p[i].y:=y-round(r*sin(a)); //относительно центра описанной окружности
  a:=a+da
 end;
 p[n+1]:=p[i];//замыкаем многоугольник
 setbrushcolor(c);
 polygon(p,n+1);//рисуем
end;
var n,xc,yc,x1,y1,r,r1:integer;
    u:real;
    k:char;
begin
repeat
write('Количество углов от 3 до ',max,' n=');
read(n);
until n in [3..max];
hidecursor;
clearwindow;
xc:=windowwidth div 2;
yc:=windowheight div 2;
r:=100;
r1:=50;
u:=0;
lockdrawing;//блокируем вывод на экран, перерисовываем в буфере
repeat
clearwindow;
setbrushstyle(bsClear);
textout(xc-50,10,'Выход Esc');
setbrushcolor(clBlue);
circle(xc,yc,2);
x1:=xc+round(r*cos(u));//определяем текущие координаты центра окружности
y1:=yc-round(r*sin(u));
Mng(n,x1,y1,r1,clRed,u);
delay(100);
u:=u-0.1; //изменяем угол(- по часовой стрелке, + против часовой)
redraw;  //перерисовываем окно
if keypressed then k:=readkey
until k=#27;//Esc - выход
end.


PascalABC.NET пишет ошибку на 20-й строчке "Нельзя преобразовать тип integer к System.Drawing.Color"
Из-за чего это может быть?
0
Почетный модератор
 Аватар для Puporev
64312 / 47609 / 32742
Регистрация: 18.05.2008
Сообщений: 115,181
02.04.2015, 10:53
Вы бы еще на С++ попробовали это запустить. Написано для простого АВС, для .net нужно переделывать, вот и займитесь.

Добавлено через 13 часов 46 минут
С минимальными переделками под АВС.net
Pascal
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
uses graphABC;
const max=12;
procedure Mng(n,x,y,r:integer;u:real);
var p:array of point;
    i:byte;
    a,da:real;
begin
da:=2*pi/n;//анутренний угол многоугольника
a:=u+pi/2;//направление на 1 вершину
setlength(p,n+1);
for i:=0 to n-1 do
 begin
  p[i].x:=x+round(r*cos(a)); //определяем координаты вершин многоугольника
  p[i].y:=y-round(r*sin(a)); //относительно центра описанной окружности
  a:=a+da
 end;
 p[n]:=p[0];//замыкаем многоугольник
 setbrushcolor(clRed);
 polygon(p);//рисуем
end;
var n,xc,yc,x1,y1,r,r1:integer;
    u:real;
begin
repeat
write('Количество углов от 3 до ',max,' n=');
read(n);
until n in [3..max];
setwindowsize(400,400);
centerwindow;
xc:=windowwidth div 2;
yc:=windowheight div 2;
r:=100;
r1:=50;
u:=0;
lockdrawing;//блокируем вывод на экран, перерисовываем в буфере
repeat
clearwindow;
circle(xc,yc,2);
x1:=xc+round(r*cos(u));//определяем текущие координаты центра окружности
y1:=yc-round(r*sin(u));
Mng(n,x1,y1,r1,u);
sleep(100);
u:=u-0.1; //изменяем угол(- по часовой стрелке, + против часовой)
redraw;  //перерисовываем окно
until false;
end.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.04.2015, 10:53
Помогаю со студенческими работами здесь

Вращение треугольника вокруг произвольной точки
Треугольник А(-2;1) B(-3;3) C(-1;3) повернуть на -90 градусов относительно С 1) Я переместил точку С в начало координат 2) Я Умножил...

Вращение объекта вокруг произвольной точки
Добрый день. У всех создаваемых(по крайней мере мной) объектов &quot;центр&quot; находится в левом верхнем углу, что крайне неудобно если нужно...

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

Вращение фигуры вокруг произвольной оси
Приветствую! Подскажите формулу для вращения. К примеру есть квадрат или любой другой объект, который нужно повернуть вокруг своей оси...

Вращение объекта вокруг произвольной оси
Нужно ввести X,Y,Z точки, через которую проходит ось. Если заданная ось совпадает с осью координат, то вращение объекта происходит верно,...


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

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

Новые блоги и статьи
Согласованность транзакций в MongoDB
Codd 30.04.2025
MongoDB, начинавшая свой путь как классическая NoSQL система с акцентом на гибкость и масштабируемость, сильно спрогрессировала, включив в свой арсенал поддержку транзакционной согласованности. Это. . .
Продвинутый ввод-вывод в Java: NIO, NIO.2 и асинхронный I/O
Javaican 30.04.2025
Когда речь заходит о вводе-выводе в Java, классический пакет java. io долгие годы был единственным вариантом для разработчиков, но его ограничения становились всё очевиднее с ростом требований к. . .
Обнаружение объектов в реальном времени на Python с YOLO и OpenCV
AI_Generated 29.04.2025
Компьютерное зрение — одна из самых динамично развивающихся областей искусственного интеллекта. В нашем мире, где визуальная информация стала доминирующим способом коммуникации, способность машин. . .
Эффективные парсеры и токенизаторы строк на C#
UnmanagedCoder 29.04.2025
Обработка текстовых данных — частая задача в программировании, с которой сталкивается почти каждый разработчик. Парсеры и токенизаторы составляют основу множества современных приложений: от. . .
C++ в XXI веке - Эволюция языка и взгляд Бьярне Страуструпа
bytestream 29.04.2025
C++ существует уже более 45 лет с момента его первоначальной концепции. Как и было задумано, он эволюционировал, отвечая на новые вызовы, но многие разработчики продолжают использовать C++ так, будто. . .
Слабые указатели в Go: управление памятью и предотвращение утечек ресурсов
golander 29.04.2025
Управление памятью — один из краеугольных камней разработки высоконагруженных приложений. Го (Go) занимает уникальную нишу в этом вопросе, предоставляя разработчикам автоматическое управление памятью. . .
Разработка кастомных расширений для компилятора C++
NullReferenced 29.04.2025
Создание кастомных расширений для компиляторов C++ — инструмент оптимизации кода, внедрения новых языковых функций и автоматизации задач. Многие разработчики недооценивают гибкость современных. . .
Гайд по обработке исключений в C#
stackOverflow 29.04.2025
Разработка надёжного программного обеспечения невозможна без грамотной обработки исключительных ситуаций. Любая программа, независимо от её размера и сложности, может столкнуться с непредвиденными. . .
Создаем RESTful API с Laravel
Jason-Webb 28.04.2025
REST (Representational State Transfer) — это архитектурный стиль, который определяет набор принципов для создания веб-сервисов. Этот подход к построению API стал стандартом де-факто в современной. . .
Дженерики в C# - продвинутые техники
stackOverflow 28.04.2025
История дженериков началась с простой идеи — создать механизм для разработки типобезопасного кода без потери производительности. До их появления программисты использовали неуклюжие преобразования. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru