Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Образовательный студенческий форум _ Информатика / Программирование _ Задание на Pascal

Автор: Элио 19.10.2008, 17:24

Прошу прощения, что озаглавил тему, как "Задание на Pascal, Вопрос по литературе.". Тут уже далеко не о литературе =)
Доброго времени суток, друзья. Получил вот такое задание на выполнение:

Изобразить кривую R = a*cos(φ) + L.
Построение выполнить для a=L. Обеспечить вращение изображение в плоскости экрана против часовой стрелки с одновременным перемещением по средней горизонтали слева направо. Когда правый край экрана будет достигнут, появляются еще два изображения в верхнем и нижнем правых углах и перемещаются влево.

Как я понимаю, в выполнении этого задания мне понадобится знание Графики на Pascal. А такого у меня не имеется (изучение закончилось на динамической памяти). Теперь перехожу к вопросу. Какую литературу посоветуете? smile.gif

Автор: Inspektor 19.10.2008, 17:57

Выбирайте:
http://rapidshare.com/files/155576345/05030703.doc.html
http://rapidshare.com/files/155576885/ __1050___1085___1080___1075___1072____1043___1088___1072___1092___1080___1082___
1072____1074__T_Pasc.html
В первой книге есть всё о графиках. И ещё по теме:
http://rusproject.narod.ru/article/polar2.htm#cardioid

Автор: Элио 21.10.2008, 5:07

Огромное спасибо.

Автор: Элио 26.10.2008, 13:01

Хм, немножко разобрался с графикой, но всё-таки не до конца. Нарисовать фигуру (как я понял, это кардиоида) я смог, а вот сделать так, чтобы она вертелась и перемещалась что-то никак не могу. Вот мой текст программы, рисующий, кардиоиду:

Цитата
Program
Cardioida;
Uses
Crt, Graph;
Const
r=50;
Var
i:integer;
a,L:integer;
t:real;
Procedure Graphinterface;
Var
driver, mode:Integer;
Begin
driver:=detect;
Initgraph(driver,mode,'D:\tp7\BGI');
end;

Function x(t:real):real;
begin
x:=(L*cos(t)+a*cos(t)*cos(t));
end;

Function y(t:real):real;
begin
y:=(L*sin(t)+a*sin(t)*cos(t));
end;

Begin
t:=0; a:=2; L:=2;
Graphinterface;
repeat
putpixel(round(r*x(t)+31),round(r*y(t)+240),4);
t:=t+0.001;
until t>2*pi;
Readln;
CloseGraph;
End.

Долго пытался что-то изобразить, но так и не смог. Буду рад любым подсказкам в решении данной проблемы blush.gif

Автор: crazymaster 27.10.2008, 6:39

Может быть вот так попробовать сделать.
[x,y,1] - координаты точек вашей фигуры. Ввели третью (1) компоненту для переноса по осям.
Чтобы точки вращались, нужно сначала каждую точку нарисовать, затем закрасить ее (в черный), потом преобразовать, снова нарисовать...и т.д.
Повернуть и сместить точку на плоскости можно так:
. . . . . . |cosф sinф 0|
[x,y,1]*|-sinф cosф 0|
. . . . . . | . n . . . m . 1|
n - перенос по оси x,
m - по оси y

Автор: creer 27.10.2008, 18:21

Я когда-то писал об этом в http://www.prepody.ru/topic1295.html?hl=&view=findpost&p=6986 теме.
Там небольшой примерчик.
Чтобы добавить вращение и перемещение - я бы изменил режим вывода изображения при котором повторный вывод данного изображения его стирает (функция SetWriteMode, судя из справки).
Затем добавил обработчик кнопок. Что-то вроде

Код
uses crt;
begin
  repeat
    case readkey of
      #27:halt; {Нажата esc}
      '1':write('2'); {Нажата 1}
      '2':write('1'); {Нажата 2}
    else
      write('-'); {Все остальное}
    end;
  until keypressed;
end.

Помнится, по паскалю был хороший двухтомник Фаронова, в том числе там были подобные примеры.

Автор: Inspektor 6.11.2008, 23:10

для перемещения самое простое это после построения изображения воспользоваться процедурами GetImage/PutImage.
С поворотом так просто не разделаться. У меня получилось такое соотношение:
X=X[sub]0[/sub]+L*cos(A+1)
Y=Y[sub]0[/sub]+L*sin(A+1)
X и Y- это новые координаты точки (X[sub]0[/sub],Y[sub]0[/sub]). L- это расстояние от центра поворота до точки которую мы поворачиваем, а "A"- угол между горизонтальной осью экрана и прямой, которая проходит через центр поворота и точкой, которую поворачиваем.

Цитата
Помнится, по паскалю был хороший двухтомник Фаронова, в том числе там были подобные примеры.

Не, поворота там точно нет и вообще слишком много воды в книге. ИМХО это скорее справочник, чем учебник, т.к. чтоб его до конца прочитать , надо иметь хорошую выдержку.

Автор: creer 8.11.2008, 12:21

Inspektor
Поворота может быть и не было (в той теме, на которую я дал ссылку, есть готовый пример с поворотом), но летающую тарелочку на фоне звездного неба я помню smile.gif.
Но Фаронова лучше обсуждать в личных сообщениях wink.gif.

Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)