Автор работы: Пользователь скрыл имя, 24 Октября 2014 в 02:15, курсовая работа
В данной курсовой работе рассматривается тема «Графика в PascalАВС». Тема курсовой работы выбрана не случайно, так как графика является довольно интересной областью программирования. Данная курсовая работа показывает, что можно создавать простые рисунки не только в графических программах, таких как Paint, AdobePhotoshop, CorelDraw, но и в среде языка программирования PascalАВС.
ВВЕДЕНИЕ 3
ГЛАВА I. ТЕОРЕТИЧЕСКАЯ ЧАСТЬ 4
1.1 Краткая история становления языка программирования Pascal. 4
1.2 Основные понятия графики 6
1.3 Основные функции и процедуры работы с графикой в PascalABC 7
ГЛАВА II. СОЗДАНИЕ ГРАФИЧЕСКОГО ПРОЕКТА 13
2.1 Понятие "фрактал" 13
2.2 Реализация треугольника 15
2.3 Построенияфрактала "Дерево" 19
ЗАКЛЮЧЕНИЕ 21
СПИСОК ЛИТЕРАТУРЫ 22
Действия с пером
PenX текущая координата X пера
PenY текущая координата Y пера
SetPenColor установка цвета пера
PenColor текущий цвет пера
MoveTo перемещение пера
LineTo рисование отрезка от текущего положения пера
SetPenWidth установка ширины пера
PenWidth текущая ширина пера
SetPenStyle установка стиля пера
PenStyle текущий стиль пера
SetPenMode установка режима пера
PenMode текущий режим пера
Режим пера определяет, как цвет пера взаимодействует с цветом поверх-
ности. В GraphABC два режима пера:
pmCopy – обычный режим: при рисовании цвет поверхности заменяется
цветом пера; 25
pmNot – режим инвертирования: при рисовании цвет поверхности ин-
вертируется (становится негативным), а цвет пера при этом иг-
норируется.
Пример:
uses crt,GraphABC;
var
x,x1,y,y1:longint;
begin
x:=150;
line(150,10,125,85);{строем звезду}
line(125,85,150,110);
for x1:=150 to 175 do
line(x,10,x1,110-(x1-150));
line(250,110,175,85);
for y1:=110 to 135 do
line(250,110,150+(y1-110),y1);
line(150,220,175,135);
for x1:=150 downto 125 do
line(150,220,x1,110-(x1-150));
line(40,110,125,135);
for y1:=110 downto 85 do
line(40,110,150+(y1-110),y1);
{ line(90,50,210,170);
line(210,50,90,170); дополнительное построение}
line(210,50,165,55);
line(210,50,205,95);
line(90,170,95,125);
line(90,170,135,165);
line(90,50,95,95);
line(90,50,135,55);
line(210,170,165,165);
line(210,170,205,125);
end.
Рисунок 1.2-Звезда
Пример 2:
uses graphABC;
const
step=Pi*0.2;
Procedure DrawStar(x,y,size:integer); {x,y - координаты центра и size - радиус снежинки}
var i,j,newsize, xnew,ynew:integer;
Begin
if size<1 then PutPixel(x,y,15) else
for i:=0 to 9 do {первый цикл - по количеству направляющих снежинки}
begin
newsize:=size;
for j:=1 to 8 do {второй цикл -рисование 8-ми подуровней снежинки}
begin
xnew:=x+round(newsize*cos(i*
ynew:=y+round(newsize*sin(i*
DrawStar(xnew,ynew,newsize div 5);
newsize:=newsize*2 div 3;
end;
end;
End;{конец процедуры}
Begin {Главная}
DrawStar(320,240,160);
End.
Рисунок 1.3-снежинка
Роль фракталов в машинной графике сегодня достаточно велика. Они приходят на помощь, например, когда требуется, с помощью нескольких коэффициентов, задать линии и поверхности очень сложной формы. С точки зрения машинной графики, фрактальная геометрия незаменима при генерации искусственных облаков, гор, поверхности моря. Фактически найден способ легкого представления сложных неевклидовых объектов, образы которых весьма похожи на природные.
Одним из основных свойств фракталов является самоподобие. В самом простом случае небольшая часть фрактала содержит информацию обо всем фрактале.
Определение фрактала, данное Мандельбротом, звучит так: "Фракталом называется структура, состоящая из частей, которые в каком-то смысле подобны целому" .
1) Геометрические фракталы
Фракталы этого класса самые наглядные. В двухмерном случае их получают с помощью некоторой ломаной (или поверхности в трехмерном случае), называемой генератором. За один шаг алгоритма каждый из отрезков, составляющих ломаную, заменяется на ломаную-генератор, в соответствующем масштабе. В результате бесконечного повторения этой процедуры, получается геометрический фрактал.
Рисунок 2.1
2) Алгебраические фракталы
Это самая крупная группа фракталов. Получают их с помощью нелинейных процессов в n-мерных пространствах. Наиболее изучены двухмерные процессы. Интерпретируя нелинейный итерационный процесс, как дискретную динамическую систему, можно пользоваться терминологией теории этих систем: фазовый портрет, установившийся процесс, аттрактор и т.д.
Известно, что нелинейные динамические системы обладают несколькими устойчивыми состояниями. То состояние, в котором оказалась динамическая система после некоторого числа итераций, зависит от ее начального состояния. Поэтому каждое устойчивое состояние (или как говорят - аттрактор) обладает некоторой областью начальных состояний, из которых система обязательно попадет в рассматриваемые конечные состояния. Таким образом, фазовое пространство системы разбивается на области притяжения аттракторов. Если фазовым является двухмерное пространство, то окрашивая области притяжения различными цветами, можно получить цветовой фазовый портрет этой системы (итерационного процесса). Меняя алгоритм выбора цвета, можно получить сложные фрактальные картины с причудливыми многоцветными узорами. Неожиданностью для математиков стала возможность с помощью примитивных алгоритмов порождать очень сложные нетривиальные структуры.
Рисунок 2.2
3) Стохастические фракталы
Еще одним известным классом фракталов являются стохастические фракталы, которые получаются в том случае, если в итерационном процессе случайным образом менять какие-либо его параметры. При этом получаются объекты очень похожие на природные - несимметричные деревья, изрезанные береговые линии и т.д. Двумерные стохастические фракталы используются при моделировании рельефа местности и поверхности моря .
Существуют и другие классификации фракталов, например деление фракталов на детерминированные (алгебраические и геометрические) и недетерминированные (стохастические).
1) Отображается в виде треугольника, из четырех секций, каждый треугольник имеет половину ширины и высоты оригинала. Центральный треугольник инвертируется и может рассматриваться как отверстие в изображении. Каждый из трех внешних треугольников являются уменьшенной версией целого рисунка с собственными центральными отверстиями. Такая схема повторяется бесконечно.
Рисунок 2.3
2) Алгоритм построения
Существуют различные методы построения треугольника .Одним из них является использование теории хаоса с тремя аттракторами, расположенными на трех вершинах равностороннего треугольника. При переходе с текущей позиции в направлении аттрактора пройденное расстояние всегда составляет расстояние между текущей точкой и выбранной вершиной.
Рассмотрим шаги для построения фрактала:
1.Определить три точки.
2.Выбрать стартовую позицию.
3.Случайно выбрать один из трех аттракторов.
4. Переместить текущую позицию на половину в направлении позиции аттрактора и нарисовать точку.
5.Вернуться к шагу 3.
3)Рисование треугольника
Нам понадобиться три метода. Первый для генерации псевдо - случайных чисел, которые будут использоваться для определения направления во время каждой итерации. Во - вторых, нам необходимо сохранить три позиции равностороннего треугольника, для этого будем использовать структуру Point. Наконец, еще одна структура Point понадобиться для хранения текущей позиции. Объявим три переменные:
Random randomiser = new Random();
private Point[] points;
private Point currentLocation;
Размер треугольника должен
быть, как можно больше, чтобы рассмотреть
детали Чтобы определить наибольший
возможный размер, мы должны рассматривать
соотношение между высотой и шириной любого
равностороннего треугольника. Если предположить,
что основание треугольника выравнивается
по горизонтали, ширина будет такая же,
как длина одной из сторон. Высота будет
иметь ширину, умноженная на половину
квадратного корня из трех. Добавим метод,
который рассчитает соотношение:
private double HeightWidthRatio()
{
return Math.Sqrt(3) / 2;
}
Следующий метод вычисляет размер треугольника, чтобы поместить на форме:
private int SideLength()
{
int height = (int)Math.Min(
(double)ClientSize.Width, ClientSize.Height / HeightWidthRatio());
// отнимаем 2 чтобы треугольник не примыкал к краям.
return (int)height - 2;
}
Следующий метод будет вычислять позиции каждого из трех аттракторов, каждый будет расположен в вершине треугольника. Эти значения будут основаны на размере треугольника и медиане клиентской области формы.
private void SetPointLocations(int sideLength)
{
Point midPoint = new Point(ClientSize.Width / 2, ClientSize.Height / 2);
points = new Point[3];
points[0] = new Point(midPoint.X
, midPoint.Y - (int)(sideLength * HeightWidthRatio() / 2));
points[1] = new Point(midPoint.X - sideLength / 2
, midPoint.Y + (int)(sideLength * HeightWidthRatio() / 2));
points[2] = new Point(midPoint.X + sideLength / 2
, midPoint.Y + (int)(sideLength * HeightWidthRatio() / 2));
}
Следующей задачей является создание метода (точнее двух) для размещения точек.
private void PlotPointLocations(Graphics g)
{
foreach (Point p in _points)
{
PlotPoint(p, g);
}
}
private void PlotPoint(Point p, Graphics g)
{
Brush b = new SolidBrush(Color.Black);
g.FillRectangle(b, p.X, p.Y, 1, 1);
}
Теперь напишем методы, которые используются в цикле алгоритмом для рисования фрактала. Метод DrawNextPoint будет контролировать этот процесс вызывая "MoveTowardsRandomPoint", за которым следует вызов PlotPoint, чтобы поставить точку в текущей позиции. Наконец, вызывается метод Application.DoEvents для обновления формы.
Метод MoveTowardsRandomPoint выбирает одну из трех вершин используя наш объект randomizer.Он как раз и вычисляет половину расстояния между текущей позицией и выбранным аттрактором:
private void DrawNextPoint(Graphics g)
{
MoveTowardsRandomPoint();
PlotPoint(currentLocation, g);
Application.DoEvents();
}
private void MoveTowardsRandomPoint()
{
int moveTowards = randomiser.Next(0,3);
currentLocation.X = (currentLocation.X + points[moveTowards].X) / 2;
currentLocation.Y = (currentLocation.Y + points[moveTowards].Y) / 2;
}
Метод для вызова всего что мы написали:
private void DrawTriangle(Graphics g)
{
int sideLength = SideLength();
SetPointLocations(sideLength);
PlotPointLocations(g);
currentLocation = new Point(points[0].X, points[0].Y);
while (working)
{
DrawNextPoint(g);
}
}
Поместим две кнопки для Старт и Стоп на форму и в обработчике события Click напишем:
private void StopButton_Click(object sender, EventArgs e)
{
StartButton.Enabled = true;
StopButton.Enabled = false;
working = false;
}
private void StartButton_Click(object sender, EventArgs e)
{
StartButton.Enabled = false;
StopButton.Enabled = true;
Graphics g = CreateGraphics();
g.Clear(Color.White);
working = true;
DrawTriangle(g);
}
Алгоритм построения "Веточки" .
Первый отрезок рисуется под произвольным углом к оси Ох, из конца данного отрезка рисуется пара отрезков, направленных в противоположные стороны от направления первого отрезка под одинаковым величиной 30 градусов. Далее рисунок повторяется с каждым из вновь построенных отрезков с уменьшением длины отрезка примерно в полтора раза.
Вложенность такого рекурсивного рисунка очевидно, не менее семи.
Рекурсивная функция имеет 4 параметра: координаты начала отрезка, его длину и угол, под некоторым рисуется отрезок к ос Ох.
Алгоритм построения состоит из следующих шагов:
1. Нарисовать отрезок.
2. Вызвать рекурсивную процедуру, рисующую левую ветку, с новыми параметрами (за координаты начала отрезка взять только что вычисленные координаты конца отрезка, за длину - длину, уменьшенную в полтора раза, за угол, уменьшенный на 30 градусов.
3. Вызвать рекурсивную процедуру, рисующую правую ветку (параметры такие же, как в пункте 2, за исключением угла - новый угол увеличивается на 30 градусов относительно первоначального угла).
4. Выход из процедуры осуществляется, когда длина ветки становится очень малой (около 2 пикселей).
В программе имеется лишь одно обращение к процедуре со следующими параметрами: координаты начала самого первого отрезка, первоначальная длина отрезка, первоначальная длина отрезка и произвольный угол наклона.
Программа "Ветка дерева" на языке PascalABC
uses GraphABC;
const
radian=Pi/180; deltaangle=30*radian;
Procedure Ris(x,y: integer; len, angle: real);