Программы на Pascal (Паскаль): снежинка и кривая Коха, фракталы
Всем привет! У всех студентов, и у меня в том числе, началась летняя сессия. Все сдают зачеты и лабы, закрывают пропуски и т.п.
Я давно сдал все лабы, и у меня осталось несколько программ, которые, думаю, многим еще пригодятся. Все они в основном на Паскале и Делфи. Я писал уже о методе Эйлера и Адамса 4-го порядка на Паскале. В этом посте пойдет речь о снежинке Коха на Паскале (Pascal).
Фракталы наверняка вам знакомы и я не буду писать о том, что это такое и с чем их "едят". Давайте просто сразу перейдем к коду. Он на языке Паскаль и адаптирован под PascalABC (скачать PascalABC можно с официального сайта
Снежинка Коха на Паскале (Pascal)
uses GraphABC; procedure Draw(x, y, l, u : Real; t : Integer); procedure Draw2(Var x, y: Real; l, u : Real; t : Integer); begin Draw(x, y, l, u, t); x := x + l*cos(u); y := y - l*sin(u); end; begin if t > 0 then begin l := l/3; Draw2(x, y, l, u, t-1); Draw2(x, y, l, u+pi/3, t-1); Draw2(x, y, l, u-pi/3, t-1); Draw2(x, y, l, u, t-1); end else Line(Round(x), Round(y), Round(x+cos(u)*l), Round(y-sin(u)*l)) end; begin SetWindowSize(425,500); SetWindowCaption('Фракталы: Снежинка Коха'); Draw(10, 354, 400, pi/3, 4); Draw(410, 354, 400, pi, 4); Draw(210, 8, 400, -pi/3, 4); end.
Вот такая снежинка у вас должна получиться:
Вкратце про параметры процедуры Draw:
1 и 2 параметр - это координаты начальной точки, откуда будет рисоваться линия;
3 - длина линии;
4 - полярный угол;
5 - количество шагов.
Можете поэкспериментировать с количеством шагов, и получится что-то вроде этого:
Кривая Коха на Паскале (Pascal)
Как вы поняли, снежинка рисуется из 3-х кривых Коха. И для того чтобы нарисовать кривую Коха, используем тот же код с разницей лишь той, что процедура Draw вызывается один раз и с другими параметрами.
uses GraphABC; procedure Draw(x, y, l, u : Real; t : Integer); procedure Draw2(Var x, y: Real; l, u : Real; t : Integer); begin Draw(x, y, l, u, t); x := x + l*cos(u); y := y - l*sin(u); end; begin if t > 0 then begin l := l/3; Draw2(x, y, l, u, t-1); Draw2(x, y, l, u+pi/3, t-1); Draw2(x, y, l, u-pi/3, t-1); Draw2(x, y, l, u, t-1); end else Line(Round(x), Round(y), Round(x+cos(u)*l), Round(y-sin(u)*l)) end; begin SetWindowSize(425,500); SetWindowCaption('Фракталы: Кривая Коха'); Draw(10, 254, 400, 0, 4); end.
Как видите, изменилось мало чего: полярный угол стал равен нулю и начальная точка смещена немного вверх. И вот что получилось:
Разбираться в коде я не стал, но если возникнут вопросы - пишите в комментариях. Вместе разберемся.
Всем пока и удачи на экзаменах :)