Форум программистов, компьютерный форум, киберфорум
PascalABC.NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.58/26: Рейтинг темы: голосов - 26, средняя оценка - 4.58
0 / 0 / 0
Регистрация: 22.04.2015
Сообщений: 45
1

Реализовать линейное перемещение и вращение вокруг какой-либо точки графического объекта

22.04.2015, 18:50. Показов 4943. Ответов 39
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, пожалуйста помогите с задачкой. Вот её содержание:
Реализовать линейное перемещение и вращение вокруг какой-либо точки графического объекта, координаты точек для построения многоугольника считываются с внешнего файла, как и координаты точки вокруг которой осуществляется вращение.
(координаты задавать самим)

(Данная тема - результат объединения кросспостов из веток PascalABC.NET и Turbo Pascal)
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.04.2015, 18:50
Ответы с готовыми решениями:

Вращение объекта вокруг точки
Здравствуйте. Потребовались формулы вращения объекта сразу по 3ем осям. Именно формулы, не...

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

Реализовать перемещение button1 по X оси, внутри какого либо объекта
Вообщем, решил немного упростить код в своей основной программе, для этого решил создать контрол и...

Вращение точки вокруг другой точки в некоторой плоскости
Доброго времени суток. Хочу написать модель атома в 3d. Нужно определить закон смены координат...

39
Почетный модератор
64304 / 47599 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
22.04.2015, 20:41 2
Вы для чего создали одинаковые темы здесь и в АВС.net?
0
0 / 0 / 0
Регистрация: 22.04.2015
Сообщений: 45
22.04.2015, 21:49  [ТС] 3
думал отклика больше будет)
и преподаватель позволяет выполнить её как на TP так и на ABC.net
0
Почетный модератор
64304 / 47599 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
22.04.2015, 21:53 4
Так графика совершенно разная в этих паскалях, вам в каком нужно?

Добавлено через 1 минуту
Цитата Сообщение от sashchernov Посмотреть сообщение
думал отклика больше будет)
Да не будет скорее всего вообще, задание какое-то бестолковое, малопонятное. Вы хоть напишите что хотите получить в результате.
0
0 / 0 / 0
Регистрация: 22.04.2015
Сообщений: 45
22.04.2015, 22:54  [ТС] 5
в результате нужно получить просто линейное перемещение любого объекта и его вращение вокруг любой точки. Вот допустим во внешнем файле лежат вот это : Координаты вершин многоугольника: 4,4;3,2;1,8;11,22.
Координаты точки, вокруг которой вращается объект: 4,3.
А в итоге на экране у нас получается 4-ехугольник, который сначала перемещается линейно, а потом вращается вокруг точки (4,3), все

Добавлено через 1 минуту
я был бы безмерно рад вашей помощи!

Добавлено через 3 минуты
в abc.net желательно. Ну, хотя в чем вам удобнее, мне подойдут как и TP, так и abc.net

Добавлено через 47 минут
я надеюсь на вас
0
Почетный модератор
64304 / 47599 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
23.04.2015, 06:32 6
Цитата Сообщение от sashchernov Посмотреть сообщение
который сначала перемещается линейно, а потом вращается вокруг точки (4,3), все
Как перемещается, откуда и куда и до каких пор? Когда начинает вращаться?
0
0 / 0 / 0
Регистрация: 22.04.2015
Сообщений: 45
24.04.2015, 22:21  [ТС] 7
на экране с левой стороны появляется наш многоугольник и сразу перемещается от одного края экрана до другого и обратно. Потом он появляется в центре экрана и вращается вокруг данной точки

Добавлено через 14 часов 4 минуты
хеелп

Добавлено через 9 часов 42 минуты
я понимаю , что уже надоел, но вы моя последняя надежда :с

Добавлено через 52 минуты
Puporev,
0
0 / 0 / 0
Регистрация: 22.04.2015
Сообщений: 45
26.04.2015, 21:22  [ТС] 8
Puporev, сейчас все условия задачки понятны?
0
Почетный модератор
64304 / 47599 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
26.04.2015, 21:44 9
Не понятно то что координаты берутся из файла, где гарантия что фигура появится слева и где окажется точка вокруг которой будет вращаться. В принципе это все можно подогнать,задав в файле "хорошие" координаты, тогда второй вопрос, в чем все-таки писать код в Паскаль АВС.net или в Турбо Паскаль, это совершенно разные коды, несовместимые друг с другом.
0
0 / 0 / 0
Регистрация: 22.04.2015
Сообщений: 45
26.04.2015, 22:52  [ТС] 10
Puporev, в ABC.net пожалуйста, было бы просто прекрасно, если бы вы написали прогу)
0
Почетный модератор
64304 / 47599 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
27.04.2015, 10:24 11
Подогнал файл под это.
Цитата Сообщение от sashchernov Посмотреть сообщение
на экране с левой стороны появляется наш многоугольник и сразу перемещается от одного края экрана до другого и обратно. Потом он появляется в центре экрана и вращается вокруг данной точки
Содержание файла.
4
10 230
80 230
100 270
70 270
300 300
Программа.
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
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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
uses graphABC;
type mng=record//тип запись с полями 
         kr:array of Point;//координаты вершин
         u,r:array of real;//углы луча из центра к точке с осью Х и радиусы вращения
         end;
var f:boolean;//переменная для выхода из программы     
//вычисление угла между лучом и осью Х
function Ugol(x0,y0,x,y:integer):real;
begin
if (x>x0)and(y<=y0) then Ugol:=arctan((y0-y)/(x-x0))//I четверть
else if (x>x0)and(y>y0) then Ugol:=arctan((y0-y)/(x-x0))+2*pi//IV четверть
else if x<x0 then  Ugol:=arctan((y0-y)/(x-x0))+pi//II-III четверти
else if x=x0 then
 begin
  if y<y0 then  Ugol:=pi/2//вертикально вверх
  else if y>y0 then Ugol:=3*pi/2//вертикально вниз
 end;
end;
//вычисление радиуса вращения=расстояние от точки до центра
//параметры координаты центра и точки
function Radius(x1,y1,x2,y2:integer):real;
begin
Radius:=sqrt(sqr(x1-x2)+sqr(y1-y2));
end;
//вращение точки вокруг центра
//параметры координаты центра, количество вершин, приращение угла, массив точек
procedure Vrach(x0,y0,n:integer;k:real;var a:mng);
var i:integer;
begin
for i:=0 to n-1 do//для всех точек
 begin
  a.u[i]:=a.u[i]+k;//наращиваем угол
  a.kr[i].x:=x0+round(a.r[i]*cos(a.u[i]));//вычисляем новые координаты
  a.kr[i].y:=y0-round(a.r[i]*sin(a.u[i]));
 end;
end;
//рисование многоугольника
procedure ris(a:mng);
begin
Pen.Color:=clRed;//цвет линий
Brush.Color:=clWhite;
Pen.Width:=3;//толщина линий
Polygon(a.kr);
end;
//процедура нажатия клавиши
procedure KeyDown(Key: integer);
begin
if Key=VK_Return then f:=false;//если нажата Enter-меняем значение флага
end;
//основная программа
var  t:text;
     a:mng;//многоугольник
     n,i,x,y,x0,y0,x1,max,min,x2,x3:integer; 
     k:real;
begin
Setwindowsize(500,500);
Window.Center;
x1:=Window.Width div 2;
f:=true;//программа включена на работу
assign(t,'koordinaty.txt');//файл в папке с программой
reset(t);
read(t,n);//прочитаем количество вершин
n:=n+1;//добавим точку для замыкания полигона
setlength(a.kr,n);//выделим память под массивы
setlength(a.u,n);
setlength(a.r,n);
for i:=0 to n-2 do//прочитаем координаты вершин
 begin
  read(t,x,y);
  a.kr[i].x:=x;
  a.kr[i].y:=y;
 end; 
read(t,x0,y0);//прочитаем координаты точки вращения
close(t);
a.kr[n-1]:=a.kr[0];//замкнем полигон
min:=a.kr[0].x;//найдем правую и левую точки
max:=a.kr[0].x;
for i:=0 to n-1 do//а также радиусы и углы
 begin
  if a.kr[i].x<min then min:=a.kr[i].x;
  if a.kr[i].x>max then max:=a.kr[i].x;
 end;
x2:=min;
x3:=max; 
lockdrawing;//Блокирует рисование графических объектов. 
            //Возможна лишь перерисовка всего экрана вызовом Redraw 
while (x3<=windowwidth)and f do//едем вправо
 begin
  Window.Clear;//очищаем экран
  ris(a);//рисуем в исходных координатах
  textout(x1-50,10,'Выход Enter');//выводим сообщение как выйти из программы
  sleep(10);//задержка на 0,01 секунды
  for i:=0 to n-1 do//все точки сдвигаем вправо
  a.kr[i].x:=a.kr[i].x+2;
  inc(x3,2);
  inc(x2,2);
  redraw;//перерисовываем
  OnKeyDown := KeyDown;//если нажмем Enter, сменится флаг на false
 end;
while (x2>0)and f do//едем влево
 begin
  Window.Clear;
  ris(a);//рисуем в исходных координатах
  textout(x1-50,10,'Выход Enter');//выводим сообщение как выйти из программы
  sleep(10);//задержка на 0,01 секунды
  for i:=0 to n-1 do//все точки сдвигаем влево
  a.kr[i].x:=a.kr[i].x-2;
  dec(x2,2);
  redraw;//перерисовываем
  OnKeyDown := KeyDown;//если нажмем Enter, сменится флаг на false
 end; 
//встаем в центр и вычисляем углы и радиусы с точкой вращения
for i:=0 to n-1 do
 begin
  a.kr[i].x :=x1+a.kr[i].x-(max-min) div 2;
  a.r[i]:=Radius(x0,y0,a.kr[i].x,a.kr[i].y);
  a.u[i]:=Ugol(x0,y0,a.kr[i].x,a.kr[i].y);
 end; 
sleep(500);
Window.Clear;
ris(a);
redraw;
OnKeyDown := KeyDown;
k:=0.1;
repeat
Window.Clear;
Vrach(x0,y0,n,k,a);//поворачиваем фигуру
Brush.Color:=clBlue;
Pen.Color:=clBlue;
circle(x0,y0,3);//рисуем точку поворота
ris(a);//рисуем фигуру
textout(x1-50,10,'Выход Enter');
sleep(100);//задержка на 0,1 секунды
redraw;//перерисовываем
OnKeyDown := KeyDown;//если нажмем Enter, сменится флаг на false
until not f;//и программа завершится}
end.
1
0 / 0 / 0
Регистрация: 22.04.2015
Сообщений: 45
27.04.2015, 19:15  [ТС] 12
Puporev, отлииииииииииииииииииично!! большое СПАСИБО)
0
0 / 0 / 0
Регистрация: 22.04.2015
Сообщений: 45
28.04.2015, 21:46  [ТС] 13
Puporev, а как сделать так , чтобы и с одной точкой он осуществлял вращение и передвижение?
0
Почетный модератор
64304 / 47599 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
29.04.2015, 06:26 14
Это как с одной точкой? Точка вращения и так одна, остальные точки координаты вершин многоугольника.
Напиши по человечески что нужно, а то что-то лепишь непонятное.
0
0 / 0 / 0
Регистрация: 22.04.2015
Сообщений: 45
29.04.2015, 10:41  [ТС] 15
Puporev, мда, действительно неправильно выразился. В общем, допустим во внешнем файле у нас 1 точка для многоугольника, так почему он не вращает просто точку вокруг точки вращения? и как это исправить?
0
Почетный модератор
64304 / 47599 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
29.04.2015, 11:36 16
Цитата Сообщение от sashchernov Посмотреть сообщение
так почему он не вращает просто точку вокруг точки вращения?
Головой об стену не пробовал?
Ты же просил
Цитата Сообщение от sashchernov Посмотреть сообщение
вращение вокруг какой-либо точки графического объекта,
Вот и вращаются все точки, вершины многоугольника, вокруг заданной точки

Добавлено через 1 минуту
Или тебе нужно не вокруг точки, а вокруг одной из вершин?

Добавлено через 46 минут
А может вокруг центра фигуры? Ты можешь привести оригинал задания или написать по человечески что тебе нужно?
0
0 / 0 / 0
Регистрация: 22.04.2015
Сообщений: 45
29.04.2015, 23:37  [ТС] 17
Puporev, нет,нет, нет, все хорошо, все что надо прога делает, но я привел частный случай задания координат, т.е во внешнем файле допустим задано вот так:
1
10 230
100 100
но прога не вращает одну точку вокруг заданной, она и не строит эту точку
0
Почетный модератор
64304 / 47599 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
30.04.2015, 06:39 18
Так в условии многоугольник, а это минимум 3 точки. Для 1 или 2х точек нужно переделывать программу.
Считаем из файла N и если это 1, делаем для точки, если 2, делаем для отрезка, если 3 или больше для многоугольника. Тебе это нужно?
0
0 / 0 / 0
Регистрация: 22.04.2015
Сообщений: 45
30.04.2015, 22:21  [ТС] 19
Puporev, было бы вообще отлично)
0
Почетный модератор
64304 / 47599 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
01.05.2015, 09:24 20
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
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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
uses graphABC;
type mng=record//тип запись с полями 
         kr:array of Point;//координаты вершин
         u,r:array of real;//углы луча из центра к точке с осью Х и радиусы вращения
         end;
var f:boolean;//переменная для выхода из пргограммы     
//вычисление угла между лучем и осью Х
function Ugol(x0,y0,x,y:integer):real;
begin
if (x>x0)and(y<=y0) then Ugol:=arctan((y0-y)/(x-x0))//I четверть
else if (x>x0)and(y>y0) then Ugol:=arctan((y0-y)/(x-x0))+2*pi//IV четверть
else if x<x0 then  Ugol:=arctan((y0-y)/(x-x0))+pi//II-III четверти
else if x=x0 then
 begin
  if y<y0 then  Ugol:=pi/2//вертикально вверх
  else if y>y0 then Ugol:=3*pi/2//вертикально вниз
 end;
end;
//вычисление радиуса вращения=расстояние от точки до центра
//параметры координаты центра и точки
function Radius(x1,y1,x2,y2:integer):real;
begin
Radius:=sqrt(sqr(x1-x2)+sqr(y1-y2));
end;
//вращение точки вокруг центра
//параметры координаты центра, количество вершин, приращение угла, массив точек
procedure Vrach(x0,y0,n:integer;k:real;var a:mng);
var i:integer;
begin
for i:=0 to n-1 do//для всех точек
 begin
  a.u[i]:=a.u[i]+k;//наращиваем угол
  a.kr[i].x:=x0+round(a.r[i]*cos(a.u[i]));//вычисляем новые координаты
  a.kr[i].y:=y0-round(a.r[i]*sin(a.u[i]));
 end;
end;
//рисование многоугольника
procedure ris(a:mng;n:integer);
begin
Pen.Color:=clRed;//цвет линий
case n of
2:begin
  Brush.Color:=clRed;
  Circle(a.kr[0].x,a.kr[0].y,2);
  end;
3:begin
  Pen.Width:=3;
  Line(a.kr[0].x,a.kr[0].y,a.kr[1].x,a.kr[1].y);
  end;
else
  begin
   Brush.Color:=clWhite;
   Pen.Width:=3;
   Polygon(a.kr);
  end; 
end;
end;
//процедура нажатия клавиши
procedure KeyDown(Key: integer);
begin
if Key=VK_Return then f:=false;//если нажата Enter-меняем значение флага
end;
//основная программа
var  t:text;
     a:mng;//многоугольник
     n,i,x,y,x0,y0,x1,max,min,x2,x3:integer; 
     k:real;
begin
Setwindowsize(500,500);
Window.Center;
x1:=Window.Width div 2;
f:=true;//программа включена на работу
assign(t,'koordinaty_ln.txt');//файл в папке с программой
                              //(у мня 3 файла-для точки, для линии и для 4х-угольника)
reset(t);
read(t,n);//прочитаем количество вершин
writeln('n=',n);
n:=n+1;//добавим точку для замыкания полигона
setlength(a.kr,n);//выделим память под массивы
setlength(a.u,n);
setlength(a.r,n);
for i:=0 to n-2 do//прочитаем координаты вершин
 begin
  read(t,x,y);
  a.kr[i].x:=x;
  a.kr[i].y:=y;
 end; 
read(t,x0,y0);//прочитаем координаты точкм вращения
close(t);
a.kr[n-1]:=a.kr[0];//замкнем полигон
min:=a.kr[0].x;//найдем правую и левую точки
max:=a.kr[0].x;
for i:=0 to n-1 do//а также радиусы и углы
 begin
  if a.kr[i].x<min then min:=a.kr[i].x;
  if a.kr[i].x>max then max:=a.kr[i].x;
 end;
x2:=min;
x3:=max; 
lockdrawing;//Блокирует рисование графических объектов. 
            //Возможна лишь перерисовка всего экрана вызовом Redraw 
while (x3<=windowwidth)and f do//едем вправо
 begin
  Window.Clear;//очищаем экран
  ris(a,n);//рисуем в исходных координатах
  Brush.Color:=clWhite;
  textout(x1-50,10,'Выход Enter');//выводим сообщение как выйти из программы
  sleep(10);//задержка на 0,01 секунды
  for i:=0 to n-1 do//все точки сдвигаем вправо
  a.kr[i].x:=a.kr[i].x+2;
  inc(x3,2);
  inc(x2,2);
  redraw;//перерисовываем
  OnKeyDown := KeyDown;//если нажмем Enter, сменится флаг на false
 end;
while (x2>0)and f do//едем влево
 begin
  Window.Clear;
  ris(a,n);//рисуем в исходных координатах
  Brush.Color:=clWhite;
  textout(x1-50,10,'Выход Enter');//выводим сообщение как выйти из программы
  sleep(10);//задержка на 0,01 секунды
  for i:=0 to n-1 do//все точки сдвигаем влево
  a.kr[i].x:=a.kr[i].x-2;
  dec(x2,2);
  redraw;//перерисовываем
  OnKeyDown := KeyDown;//если нажмем Enter, сменится флаг на false
 end; 
//встаем в центр и вычисляем углы и радиусы с точкой вращения
for i:=0 to n-1 do
 begin
  a.kr[i].x :=x1+a.kr[i].x-(max-min) div 2;
  a.r[i]:=Radius(x0,y0,a.kr[i].x,a.kr[i].y);
  a.u[i]:=Ugol(x0,y0,a.kr[i].x,a.kr[i].y);
 end; 
sleep(500);
Window.Clear;
ris(a,n);
redraw;
OnKeyDown := KeyDown;
k:=0.1;
repeat
Window.Clear;
Vrach(x0,y0,n,k,a);//поворачиваем фигуру
Brush.Color:=clBlue;
Pen.Color:=clBlue;
circle(x0,y0,2);//рисуем точку поворота
ris(a,n);//рисуеи фигуру
Brush.Color:=clWhite;
textout(x1-50,10,'Выход Enter');
sleep(100);//задержка на 0,1 секунды
redraw;//перерисовываем
OnKeyDown := KeyDown;//если нажмем Enter, сменится флаг на false
until not f;//и программа завершится
end.
1
01.05.2015, 09:24
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.05.2015, 09:24
Помогаю со студенческими работами здесь

Вращение объекта вокруг другого объекта
Как сделать вращение объекта вокруг другого объекта? Например: создаём куб, затем внутри него...

Вращение вокруг объекта
Добрый день. Как заставить один объект вращаться вокруг другого?

Движение графического объекта по траектории и его вращение
Помогите!!! Нужно нарисовать фигуру и задать движение. Начальное направление задается в виде...

Вращение модели вокруг объекта
Не могу понять, как вращать один объект, вокруг другого так, что б один конец вращался по дуге, а...


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

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