Построение дуг и окружностей 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Построение дуг и окружностей



Процедура вычерчивания окружности текущим цветом имеет следующий формат:

Cicrle(x,y,r:word);

где x,y – координаты центра окружности, r – ее радиус.
Например, фрагмент программы обеспечит вывод ярко-зеленой окружности с радиусом 50 пикселей и центром в точке (450, 100):

SetColor(LightGreen);
Circle(450, 100, 50);
Дуги можно вычертить с помощью процедуры:

Arc(x,y:integer,a,b,R:integer);

где x,y - центр окружности, a,b - начальный и конечный углы в градусах, R – радиус. Для задания углов используется полярная система координат. Цвет для вычерчивания устанавливается процедурой SetColor. В случае a =0 и b =360, вычерчивается полная окружность.
Например, выведем дугу красного цвета от 0 до 90° в уже вычерченной с помощью Circle(450, 100, 50) окружности:

SetColor(Red);
Arc(450, 100, 0, 90, 50);

Для построения эллиптических дуг предназначена процедура:

Ellipse(x,y:integer,a,b,Rx,Ry:integer);

где x,y – центр эллипса, Rx,Ry -горизонтальная и вертикальная оси. В случае a =0 и b =360 вычерчивается полный эллипс.

Например, построим голубой эллипс:
SetColor (9);
Ellipse (100, 100, 0, 360, 50, 50);

Фон внутри эллипса совпадает с фоном экрана. Чтобы создать закрашенный эллипс, используется специальная процедура:

FillEllipse (x,y:integer,Rx,Ry:integer);

Закраска эллипса осуществляется с помощью процедуры:

 

SetFillStyle(a,b:word);

где а – стиль закраски (таблица 4), b – цвет закраски (таблица 1).

Например, нарисуем ярко-красный эллипс, заполненный редкими точками зеленого цвета:
SetFillStyle (WideDotFill,Green); { установка стиля заполнения}
SetColor (12); {цвет вычерчивания эллипса}
FillEllipse(300, 150, 50, 50);

Таблица 22.6

Стандартные стили заполнения

Константа Значение Маска
     
EmptyFill   Заполнение цветом фона
SolidFill   Заполнение текущим цветом
LineFill   Заполнение символами --, цвет – color
LtslashFill   Заполнение символами // нормальной толщины, цвет – color
SlashFill   Заполнение символами // удвоенной толщины, цвет – color
BkslashFill   Заполнение символами \\ удвоенной толщины, цвет – color
LtbkSlahFill   Заполнение символами \\ нормальной толщины, цвет – color
HatchFill   Заполнение вертикально-горизонтальной штриховкой тонкими линиями, цвет – color
Окончание табл. 22.6
     
XhatchFill   Заполнение штриховкой крест-накрест по диагонали «редкими» тонкими линиями, цвет – color
InterLeaveFill   Заполнение штриховкой крест-накрест по диагонали «частыми» тонкими линиями, цвет – color
WideDotFill   Заполнение «редкими» точками
CloseDotFill   Заполнение «частыми» точками
UserFill   Заполнение по определенной пользователем маске заполнения, цвет – color

Для построения секторов можно использовать следующие процедуры:

PieSlice(x,y:integer,a,b,R:word);

которая рисует и заполняет сектор круга. Координаты x,y – центр окружности, сектор рисуется от начального угла a до конечного угла b, а закрашивание происходит при использовании специальных процедур;

Sector(x,y:integer,a,b,Rx,Ry:word);

которая создает и заполняет сектор в эллипсе. Координаты x,y – центр, Rx,Ry – горизонтальный и вертикальный радиусы, и сектор вычерчивается от начального угла a до конечного угла b.

Пример 22.9:
SetFillStyle (10, 10); {установка стиля}
SetColor (12); {цвет вычерчивания}
PieSlice (100, 100, 0, 90, 50);

Пример 22.10:
SetFillStyle (11, 9); {установка стиля}
SetColor (LightMagenta);{цвет вычерчивания}
Sector (300, 150, 180, 135, 60, 70)

Работа с текстом

Выводимые на экран изображения лучше всего сопровождать пояснительным текстом. В графическом режиме для этого используются процедуры OutText и OutTextXY.
Процедура OutText(Textst:string);

выводит строку текста, начиная с текущего положения указателя.

Пример 22.11

OutText(‘нажмите любую клавишу’);

Недостаток этой процедуры – нельзя указать произвольную точку начала вывода. В этом случае удобнее пользоваться процедурой

OutTextXY(x,y:integer,Textst:string);

где x,y – координаты точки начала вывода текста, Textst – константа или переменная типа String.

Пример 22.12

OutTextXY(60, 100, ‘Нажмите любую клавишу’);

Вывод численных значений. В модуле Graph нет процедур, предназначенных для вывода численных данных. Поэтому для вывода чисел сначала нужно преобразовать их в строку с помощью процедуры Str, а затем подключить посредством ‘+’ к выводимой строке.

Пример 22.13:

Max:=34.56;
Str(Max: 6: 2, Smax); {результат преобразования находится в Smax}
OutTextXY(400, 40, ‘Максимум=’ + Smax);

Для удобства преобразование целочисленных и вещественных типов данных в строку лучше осуществлять специализированными пользовательскими функциями IntSt и RealSt:

Пример 22.14:

function IntSt(Int: integer): string;
var Buf: string[10];
begin
Str(Int, Buf);
IntSt:= Buf;
end;
function RealSt(R: real, Dig, Dec: integer): string;
var Buf: string[20];
begin
Str(R: Dig: Dec, Buf);
RealSt:= Buf;
end;

Эти функции указываются как параметры в процедурах OutText и OutTextXY.

Пример 22.15

x:=5.295643871;
OutTextXY(20,20, ‘x=’+RealSt(x,11,9));

В результате на экране появится x=5.29564443871

Шрифты. Вывод текста в графическом режиме может осуществляться различными стандартными (таблица 22.7) и пользовательскими шрифтами. Различают два типа шрифтов: растровые и векторные. Растровый шрифт задается матрицей точек, а векторный – рядом векторов, составляющих символ. По умолчанию после инициализации графического режима устанавливается растровый шрифт DefaultFont, который, как правило, является шрифтом, используемым драйвером клавиатуры.

Таблица 22.7

Стандартные шрифты

Шрифт Файл
TriplexFont Trip.chr
SmallFont Litt.chr
SansSerifFont Sans.chr
GothicFont Goth.chr


Большинство стандартных шрифтов не содержат русских символов. Разработка же собственных шрифтов – довольно сложный и трудоемкий процесс. Он может быть ускорен, если воспользоваться специализированными пакетами TurboFont, BgiToolKit.
Установить нужный шрифт можно процедурой:

SetTextStyle(Font,d,c:word);

где Font – выбранный шрифт, d – направление (горизонтальное или вертикальное), с – размер выводимых символов. Возможные значения двух первых параметров представлены в таблице 5. При организации вертикального вывода необходимо учитывать, что если не установить точку начала вывода с помощью MoveTo, то текст начинается с нижней строки экрана и продолжается вверх. Величина символов устанавливается коэффициентом с. Если с =1, то символ строится в матрице 8х8, если с =2, то в матрице 16х16 и т.д. до 10-кратного увеличения.

Пример 22.16, выведем 2 строки (вертикальную и горизонтальную) шрифтом DefaultFont разной величины:

SetTextStyle(0,1,1); {буквы стандартной величины}
OutTextXY(200, 200, ‘Вертикальная строка’);
SetTextStyle(0, 0, 2); {размер букв увеличен}
OutTextXY(200, 220, ‘Горизонтальная строка’);

Выравнивание текста. В некоторых случаях требуется в пределах одной строки выводить символы выше или ниже друг друга. Выравнивание текста выполняется с помощью процедуры:

SetTextJustify(Horiz,Vert:word);

как по вертикали, так и по горизонтали посредством задания параметров Horiz и Vert (возможные значения в таблице 22.7).

Таблица 22.7

Параметры выравнивания

Параметр Значение Комментарий
Горизонтальное выравнивание
LeftText   Выровнять влево
CenterText   Центрировать
RightText   Выровнять вправо
Вертикальное выравнивание
BottomText   Переместить вниз
CenterText   Центрировать
TopText   Переместить вверх

 

Построение графиков функций. Для построения графиков функций при помощи графического режима предполагается свободное владение понятием функции, ее графическим и аналитическим представлением. Необходимо также использовать операторы цикла, которые помогут избежать однообразного труда по вычислению ординаты каждой точки. До сих пор при создании рисунков использовали только первый квадрант системы координат. Для построения большинства функций в требуемом интервале изменения необходимо работать хотя бы в двух квадрантах. В общем случае полезно изображать систему координат в любой части плоскости, но наиболее наглядно располагать ее в центре экрана. В таких случаях, установив начало координат в точке (x0,y0) на экране, можно координаты (x,y) произвольной точки кривой определять разностью (x-x0,y-y0). После этого в программе можно употреблять не только положительные, но и отрицательные значения. Рисунок получается маленьким, поэтому требуется увеличить масштаб изображения. Если для функции будет использован весь экран, надо увеличить рисунок по x и по y в зависимости от выбранного экрана.

Выбрать масштаб увеличения можно следующим образом:

· определить горизонтальный и вертикальный размеры графика (для этого вводятся границы области значений и определяются максимальное и минимальное значение функции на заданной области определения, затем вычисляются разности максимального и минимального значений аргументов и функции, которые и являются горизонтальным и вертикальным размерами графика соответственно);

· определить масштаб (сначала определяются масштабы изображения по горизонтали и вертикали с учетом размеров выбранного экрана по формуле:

масштаб(г/в) = размер экрана (по г/в) / размер графика (по г/в)

затем из них выбирается меньший, который и принимается за необходимый масштаб. В нашем случае графический экран имеет размеры 640х480.В любом случае, чтобы высветить на экране точку, надо взять x, вычислить по данной абсциссе y и выполнить рисование точки. Так как на экране можно получить лишь ограниченное количество значений х, то их перебираем с помощью цикла.

Пример 22.17. Построить график функции y=x2

Вариант 1

program f;
uses graph;
var d, m: integer;
x,y: real;
begin

d:=detect;

initgraph(d, m, ‘c:\ bp’);

SetColor(5);

Line(0, 240, 640, 240);

Line(320, 0, 320, 480);

x:=-20;
While x<=20 do

begin
y:=-Sqr(x);
PutPixel(x*5 + 320, y*5 +240, 15);
x:=x+ 0.01;
end;
end.
Вариант 2
program f;
uses graph, crt;
var d, m: integer;

x, y, mx, my, m,x1, x2, y1, y2,h: real;

function f(x:real): real;

begin

f:= Sqr(x);

end;
begin

clrscr; Write(‘Введите границы отрезка’);

Read(x1, x2);

y1:=f(x1);

y2:=f(x2);

mx:=640/(x2 –x1);

my:=480/ (y2 – y1); If mx< my Then m:=mx

else m:= my;

h:=1/m; x:=x1;

d:=detect;

initgraph(d, m, ‘c:/ bp’);

SetColor(5);

Line(0, 240, 640, 240);

Line(320, 0, 320, 480);

While x<= x2 do

Begin

y:=-f(x);

PutPixel(x*m +320, y*m +240, 15);

x:=x+ h;

end;

end.

Рассмотрим построение графика функции, заданной параметрически. В отличие от функции, заданной в явном виде y=f(x), параметр х в этом случае также является функцией, зависящей от некоторого значения.

Пример 22.18. Построить график функции (кардиоида)

x = a cos t (1+ cos t),

y = -a sin t (1+cos t), a > 0, t £ p

Ниже указан фрагмент программы:

SetColor(5);

Line(0, 240, 640, 240);

Line(320, 0, 320, 480);

t:=0;

a:=3;

While t<= 3.1415 do

Begin

x:=a*cos(t)*(1+cos(t));

y:=- a*sin(t)*(1+cos(t));

PutPixel(x*5+320, y*5 +240, 15);

t:=t+ 0.01;

end;

Циклы в графике. Построение случайных процессов. Для того чтобы картинки не были монотонными и регулярными, можно задавать фигурам случайные размеры, цвет, координаты. Для этого имеется специальная функция Random. Она генерирует случайные числа из [0, 1). Для расширения первоначального промежутка используется функция Random(I:word), которая выдает число из диапазона 0…I. На самом деле эти функции генерируют некоторую последовательность псевдослучайных чисел, и чтобы добиться иллюзии полной «случайности» используют процедуру Randomize, которая изменяет базу датчика случайных чисел.

Пример 22.19. Нарисовать в случайном месте экрана точку случайного цвета.

Указан фрагмент программы:

Randomize

x:=random(640);

y:=Random(480);

c:=Random(15);

PutPixel(x, y, c);

Пример 22.20. Нарисовать 5000 точек случайного цвета в случайном месте. Указан фрагмент программы:

For i:=1 to 5000 do

Begin

x:=Random(640);

y:=Random(480);

c:=Random(15);

PutPixel(x, y, c);

end;

Создание иллюзии движения. Создать видимость движения изображения на экране можно несколькими способами. Рассмотрим два из них.

I способ. Имитация движения объекта на экране за счет многократного выполнения программой набора действий: нарисовать – пауза – стереть (нарисовать в том же месте цветом фона) – изменить координаты положения рисунка.

Перед началом составления программы надо продумать описание «двигающегося» объекта, характер изменения координат, определяющих текущее положение объекта, диапазон изменения и шаг.

Упражнение 1. Изучить текст программы, которая рисует модель атома. Проверить ее действие.

program Model_At;

uses Crt, Graph;

const Ra=100; {радиус атома}

Rc=10; {радиус ядра}

Re=4; {радиус электрона}

k=0.5; {коэффициент сжатия орбит электронов}

Dr=30; {параметр изменения координат электрона}

Step1=0.2; {шаг изменения положения электрона}

Step=100; {время задержки – скорость движения электронов}

var cx, cy, y, y1, y2, x, x1, x2, x3,y3:integer;

I, I1, I2, I3: real; d, m: integer;

Begin

clrscr;

d:=detect;

initgraph(d, m, ‘путь к драйверу’); SetTextStyle(0, 0, 2);

OutTextXY(200, 30, ‘Модель атома’);

cx:=GetMaxX div 2; {определить центр экрана- положение ядра}

cy:=GetMaxY div 2;

PieSlice(cx, cy, 0, 360, Rc);{нарисовать ядро атома}

SetColor(Red);

SetLineStyle(0, 0, 3);

Line(cx-7, cy, cx+7, cy);

Line(cx, cy-5, cx, cy+5);

SetLineStyle(0,0,1);

SetFillStyle(1,1);

I:=Pi/4; {задать начальное положение 4 электронов}

I1:= - Pi/4;

I2:= - Pi/2;

I3:= Pi/2;

SetTextStyle(0, 0, 1);

SetColor(jellow);

OutTextXY (180, 420,’Для отмены нажмите любую клавишу’);

While not KeyPressed do {повторять, пока не нажата любая клавиша }

begin {определить координаты электронов}

x:=Round (Ra*cos(I)) +cx; Y:= Round(k+Ra*sin(I)) +cy;

x1:= Round((Ra+Dr)*cos(I1))+cx; y1:= Round (k*(Ra+Dr)*sin(I1)) +cy;

x2:= Round((Ra-Dr)*cos(I2))+cx; y2:= Round (k*(Ra-Dr)*sin(I2))+cy;

x3:= Round((Ra-Dr)*cos(I3)*2.3) +cx; y3:= Round (k*(Ra-Dr)*sin(I3)*2.3) +cy;{установить синий цвет и нарисовать электроны}

SetColor(1);

Circle(x, y, Re);

PutPixel(x, y, 2);

Circle(x1, y1, Re);

PutPixel(x1, y1, 2);

Circle(x2, y2, Re);

PutPixel(x2, y2, 2);

Circle(x3, y3, Re);

PutPixel(x3, y3, 2);

Delay(Step); {нарисовать электроны цветом фона}

SetColor(0);

Circle(x, y, Re);

PutPixel(x, y, 2);

Circle(x1, y1, Re);

PutPixel(x1, y1, 2);

Circle(x2, y2, Re);

PutPixel(x2, y2, 2);

Circle(x3, y3, Re);

PutPixel(x3, y3, 2); {задать изменение положения электронов}

I:=I + Step1;

I1:=I1 – Step1;

I2:=I2 + Step1;

I3:=I3 + Step1;

end; {конец цикла}

CloseGraph;
end.

II способ. Иллюзия движения создается при помощи специальных процедур и функций.

Функция ImageSize(x1,y1,x2,y2:integer):word;

возвращает размер памяти в байтах, необходимый для размещения прямоугольного фрагмента изображения, где x1,y1 – координаты левого верхнего и x2,y2 – правого нижнего углов фрагмента изображения.

Процедура GetImage(x1,y1,x2,y2:integer,var Buf);

помещает в память копию прямоугольного фрагмента изображения, где x1,..,y2 – координаты углов фрагмента изображения, Buf - специальная переменная, куда будет помещена копия видеопамяти с фрагментом изображения. Buf должна быть не меньше значения, возвращаемого функцией ImageSize с теми же координатами.

Процедура PutImage(x,y:integer,var Buf, Mode:word);

выводит в заданное место экрана копию фрагмента изображения, ранее помещенную в память процедурой GetImage. x,y – координаты левого верхнего угла того места на экране, куда будет скопирован фрагмент изображения; Buf – специальная переменная, откуда берется изображение, Mode – способ копирования. Координаты правого нижнего угла не указываются, так как они полностью определяются размерами выводимой на экран копии изображения. Координаты левого верхнего угла могут быть любыми, лишь бы только копия уместилась в пределах экрана (если копия не размещается на экране, то она не выводится, и экран остается без изменений). Параметр Mode определяет способ взаимодействия размещаемой фигуры с уже имеющимся на экране изображением:

Таблица 22.8

Значения параметра

Константа Значение Операция Пояснения
       
NormalPut   Замена существующего на копию Стирает часть экрана и на это место помещает копию
XorPut   Исключительное или Рисует сохраненный образ или стирает ранее нарисованный, сохраняя фон
OrPut   Объединительное или Накладывает сохраненный образ на существующий

Окончание таблицы 22.8

       
AndPut   Логическое и Объединяет сохраненный образ и уже существующий на экране
NotPut   Инверсия изображения То же самое, что и 0, только копия выводится в инверсном виде

 

Контрольные вопросы

1. Назовите основные модули, обеспечивающие аппаратную поддержки графики.

2. Перечислите этапы запуска и завершения графического режима.

3. Назовите процедуры модуля Graph.

4. Назовите функции модуля Graph.

5. Перечислите возможности построения точки, линии, прямоугольников.

ЗАКЛЮЧЕНИЕ

Разработка любой вычислительной системы вне зависимости от уровня ее сложности ставит разработчика перед необходимостью выбора тех или иных структур данных, в рамках которых осуществляется отображение соответствующей предметной области.

Описанный в пособии язык программирования предоставляет программисту возможность определять необходимые типы данных, наиболее полно соответствующие решаемой задаче. Это позволяет осуществлять ее моделирование на том уровне абстракции, который соответствует специфике задачи.

Пособие посвящено вопросам понятия технологии программирования, этапам разработки вычислительной системы, структурной организации данных и методам, лежащим в основе их обработки. В качестве концептуальной основы структурной организации данных используется понятие массива. Рассматриваются фундаментальные приемы и методы программирования, рассмотрены некоторые методы сортировок.

Излагаются практически хорошо обоснованные методы обработки данных.

Учебное пособие предлагает инструмент для применения основ алгоритмизации и программирования в практической деятельности.


Библиографический список

1. Иванова, Г.С. Технология программирования [Текст]: учебник для вузов / Г.С. Иванова. – М.: Изд-во МГТУ им. Н.Э. Баумана, 2002. -320 с.: ил.

2. Иванова, Г.С. Основы программирования [Текст]: учебник для вузов / Г.С. Иванова. – М.: Изд-во МГТУ им. Баумана, 2001.

3. Фаронов, В.В. Программирование на персональных ЭВМ в среде Турбо-Паскаль [Текст]: / В.В. Фаронов.-2-е изд.-М.:Изд-во МГТУ,1992.-448 с.

4. Поляков, Д.Б. Программирование в среде Турбо-Паскаль [Текст]: справ.-метод. пособие / Д.Б. Поляков, И.Ю. Круглов. - М.: Изд-во МАИ, 1992. - 576 с.

5. Фаронов, В.В. Турбо Паскаль Начальный курс [Текст]: / В.В. Фаронов. -Изд-во: <<ОМД Групп>>, 2003. - 528 с.

6. Майерс, Г. Надежность программного обеспечения [Текст]: / Г. Майерс - М.: Мир, 1980. - С. 262.

7. Тассел, Д. Ван Стиль, разработка, эффективность, отладка и испытание программ [Текст]: / Д. Ван Тассел - М.: Мир, 1985. - С. 295.

8. Хьюз, Дж. Структурный подход к программированию Дж. Хьюз, Дж. Мичтом [Текст]: / - М.: Мир, 1980. - С. 254-268.

9. Фокс, Дж. Программное обеспечение и его разработка [Текст]: / Дж. Фокс - М.: Мир, 1985. - С. 227-241.

10. Толковый словарь русского языка / В. Даль.. – Эксмо, 2010 г.- С. 452.

11. Буч, Г. Объектно-ориентированное проектирование с примерами применения: пер. с англ. [Текст]: / Г.Буч. – М.: Конкорд, 1992.



Поделиться:


Последнее изменение этой страницы: 2016-09-19; просмотров: 308; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.134.118.95 (0.119 с.)