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

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

Форум «Всё о Паскале» _ Задачи _ Рекурсия и графика

Автор: Anastacia Adesso 13.09.2006 21:39

Ребята!
Где-то тут ошибка.
Условие в том, что надо рисовать сначала крест потом круги с радиусом в его концах. А потом опять крест.
И так чтоб все потихоньку уменьшалось в 2 раза.
Вот сделала, но надо чтоб он не рисовал ничего в сторону центра.
Не подскажете, пожалуйста, в чём прикол?


Прикрепленные файлы
Прикрепленный файл  UZD3.PAS ( 1014 байт ) Кол-во скачиваний: 234

Автор: Michael_Rybak 13.09.2006 21:52

Добавь параметр came_from, который будет означать, откуда мы пришли (по какому направлению). Получится что-то такое (не запускал):

(*в начале программы*)
const DIR_LEFT = 0;
const DIR_UP = 1;
const DIR_RIGHT = 2;
const DIR_DOWN = 3;
const DIR_NONE = 4;

...

procedure ll(x,y,l,sk,came_from:integer);
begin
if came_from <> DIR_UP then line(x,y, x, y+l);
if came_from <> DIR_DOWN then line(x,y, x, y-l);
if came_from <> DIR_LEFT then line(x,y, x+l, y);
if came_from <> DIR_RIGHT then line(x,y, x-l, y);
if sk>1 then begin
if came_from <> DIR_LEFT then ll(x+l, y, l div 4, sk-1, DIR_RIGHT);
if came_from <> DIR_RIGHT then ll(x-l, y, l div 4, sk-1, DIR_LEFT);
if came_from <> DIR_DOWN then ll(x, y-l, l div 4, sk-1, DIR_UP);
if came_from <> DIR_UP then ll(x, y+l, l div 4, sk-1, DIR_DOWN);
end;
end;

(*в rr аналогично*)

...

initgraph(gr,gm, 'z:\');
ll(x,y,l,sk, DIR_NONE);
rr(x,y,r,sk, DIR_NONE);
...

Автор: volvo 13.09.2006 21:55

Цитата
надо чтоб он не рисовал ничего в сторону центра.
wacko.gif Ты о чем?

Вот так надо, что-ли?



Прикрепленные файлы
Прикрепленный файл  RC.PAS ( 742 байт ) Кол-во скачиваний: 212

Автор: Anastacia Adesso 13.09.2006 22:07

Michael_Rybak, я теперь совсем запуталась nea.gif
Это обязательно такие константы надо ставить?
У меня от них голова болит

Автор: Michael_Rybak 13.09.2006 22:12

Цитата(Anastacia Adesso @ 13.09.2006 18:07) *

Это обязательно такие константы надо ставить?
У меня от них голова болит


Ну назвать их можешь по-другому smile.gif. Смысл в том, что ты идешь из каждой точки рекурсивно во все 4 стороны. А идти в 4 стороны надо только в самый первый раз, а дальше - в 3 стороны, кроме той, откуда пришли. Правильно я понимаю? Для этого и нужны эти константы, чтобы передавать, откуда мы пришли, и не ветвиться в ту сторону. Представь, как бы ты это рисовала руками.

Ну или я неправильно понял, что тебе нужно. Нарисуй, что ли, в paint'е набросок.

Автор: Anastacia Adesso 13.09.2006 22:15

Volvo, это не совсем то.. но прикольно! good.gif

воть типа.. рисум крест. потом круги но тока в три конца. к основанию креста не надо

Michael_Rybak, да именно тока в три стороны.
Но говорят это и без констант можно сделать.
Не знаешь как?

Автор: volvo 13.09.2006 22:27

Цитата
к основанию креста не надо
Ну, не надо, так не надо smile.gif




Прикрепленные файлы
Прикрепленный файл  RC.PAS ( 943 байт ) Кол-во скачиваний: 213

Автор: Michael_Rybak 13.09.2006 22:32

Цитата(Anastacia Adesso @ 13.09.2006 18:15) *

Но говорят это и без констант можно сделать.
Не знаешь как?


Можно, например, передавать dx и dy. И идти прямо, навлево, и направо.

Например, направление вверх задается парой dx = 0, dy = -1. Повернувшись на 90 градусов по часовой стрелке, мы получим координаты new_dx := -dy, new_dy := dx, а против часовой - new_dx := dy, new_dy := -dx

Код не запускал.

uses crt, graph;
var l, x, y, sk, r:integer;
gr, gm: integer;

procedure ll(x,y,dx,dy,l,r,sk:integer);
begin
line(x, y, x + dx * l, y + dy * l); circle(x + dx * l, y + dy * l, r);
line(x, y, x - dy * l, y + dx * l); circle(x - dy * l, y + dx * l, r);
line(x, y, x + dy * l, y - dx * l); circle(x + dy * l, y - dx * l, r);

if sk>1 then begin
ll(x, y, x + dx * l, y + dy * l, dx, dy, l div 4, r div 4, sk - 1);
ll(x, y, x - dy * l, y + dx * l, -dy, dx, l div 4, r div 4, sk - 1);
ll(x, y, x + dy * l, y - dx * l, dy, -dx, l div 4, r div 4, sk - 1);
end;

end;

begin
clrscr;
readln(l);
x:=300; y:=240; r:=trunc(l/2);
readln(sk);
gr:=9; gm:=2;
initgraph(gr,gm, '');
ll(x,y,1,0,l,r,sk);
ll(x,y,-1,0,l,r,sk);
ll(x,y,0,1,l,r,sk);
ll(x,y,0,-1,l,r,sk);

readkey;
end.

Автор: Anastacia Adesso 19.09.2006 14:40

Спасибо!!!! Мы тут ещё подумали..
Посмотрите как сделали!!!


Прикрепленные файлы
Прикрепленный файл  UZD3.PAS ( 1.83 килобайт ) Кол-во скачиваний: 224

Автор: lapp 20.09.2006 8:03

Цитата(Anastacia Adesso @ 19.09.2006 11:40) *

Посмотрите как сделали!!!

Смотрим... Слушай, а ты не могла бы постить русскую или английскую версию? Боюсь, тут мало кто понимает латышский.. sad.gif

Красиво! Но, мне кажется, не совсем рационально..
Если я правильно понял (что не факт), то может быть вот, что сгодится..
Прикрепленный файл  t022_4.pas ( 1.9 килобайт ) Кол-во скачиваний: 432

И я еще подправил немного ввод - так, из любви к искусству, хотя - убей, не понимаю, что это значит smile.gif

Автор: volvo 20.09.2006 19:06

Anastacia Adesso,
тебе, по-моему, надо зайти сюда:
http://fractalworld.xaoc.ru/every.html

здесь есть очень много интересных реализаций...

smile.gif