Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

лабораторные на Pasca (Кудрявцев)l

.pdf
Скачиваний:
32
Добавлен:
18.03.2015
Размер:
1.63 Mб
Скачать

Рисование графических примитивов и фигур

203

 

 

While x < GetMaxX do begin

Line (x, GetMaxY div 2 – dy, x, GetMaxY div 2 + dy); x := x + MasKoefX;

end;

Здесь 2dy длина вертикальных штрихов разметки.

Аналогичным образом выполняется разметка оси Y. Следует, одна- ко, помнить, что разрешающая способность по оси X и оси Y не- одинакова, поэтому и коэффициент масштабирования по оси Y бу- дет другим:

MasKoefY = Round (Xasp /Yasp * MasKoefX).

Значения Xasp и Yasp получим, используя функцию

GetAspectRatio (Xasp , Yasp ).

После разметки осей координат экран бдет иметь вид (рис. 2.).

y

MasKoefY

MasKoefX

 

GetMaxX div 2

 

 

 

GetMaxY div 2

0

 

 

 

 

 

 

 

 

 

 

 

 

 

x

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

GetMaxX, GetMaxY

Рис. 2

Для рисования графика функции y = f(x) в системе координат XOY необходимовыполнить следующий фрагмент программы:

Koord x := –k; h := 0.1; While Koord x < k do

begin

x := round (Koord x); y = f(x);

PutPixel (x,round (y));

204

Лабораторная работа № 17

 

 

Koord x := Koord x + h; end;

Так как компьютер выполняет все графические процедуры относи- тельно собственной системы координат, то нужно выполнить пере- ход из одной системы координат в другую. Из рис. 2. видно, что координаты точки A в различных системах координат связаны про- стым соотношением:

xs = GetMaxX div 2 – (–x) = GetMaxX div 2 + x; ys = GetMaxY div 2 – y;

Учитывая все эти соображения, составим программу рисования графиков в среде Turbo Pascal.

Program Grafik; Uses Crt, Graph;

Const n=1000; a=1; b=0;

MasKoefX=40;

Var

Xasp,Yasp: Word;

y_func: array[1..n] of PointType;

MasKoefY: Word;

Ratio: Extended;

{--------------------------------------------------

}

Function f(x: Extended):Extended;

begin

 

f:= sin(x*x)/cos(x);

end;

 

{--------------------------------------------------

}

Procedure GrInit;

var

 

grDriver : Integer;

grMode

: Integer;

ErrCode : Integer;

begin

 

grDriver := Detect;

InitGraph(grDriver, grMode, 'g:\progr\tp');

 

GetAspectRatio(Xasp, Yasp);

 

Ratio:= Xasp/Yasp;

 

MasKoefY:=round(Ratio*MasKoefX);

 

end;

{

--------------------------------------------------}

Рисование графических примитивов и фигур

205

 

 

Procedure SysCoord;

 

Const

 

dx=2;

 

dy=2;

 

var

 

Delen: Word;

 

x,y: Word;

 

Rat: Extended;

 

begin

 

Line(0, GetMaxY div 2, GetMaxX, GetMaxY div 2);

 

x:= (GetMaxX div 2) mod MasKoefX;

 

While x < GetMaxX do

 

begin

 

Line(x, GetMaxY div 2 – dy, x, GetMaxY div 2 + dy);

x:= x + MasKoefX;

 

end;

 

Line(GetMaxX div 2, 0, GetMaxX div 2, GetMaxY);

 

y:= (GetMaxY div 2) mod MasKoefY;

 

While y < GetMaxY do

 

begin

 

Line(GetMaxX div 2 – dx, y, GetMaxX div 2 + dx, y);

y:= y + MasKoefY;

 

end;

 

end;

 

{--------------------------------------------------}

 

Procedure DrawGraph;

 

var

 

i: Word;

 

xi,yi: Extended;

 

Delen: Word;

 

h: Extended;

 

CountPoint: Word;

 

begin

 

Delen:= (GetMaxX div 2) div MasKoefX;

 

h:=1/MasKoefX;

 

i:=0;

 

xi:= –Delen;

 

While xi<Delen do

 

begin

 

yi:= f(xi);

 

y_func[i].x:= GetMaxX div 2 + round(xi*MasKoefX); y_func[i].y:= GetMaxY div 2 – round(yi*MasKoefY); xi:= xi + h;

inc(i)

206

Лабораторная работа № 17

 

 

 

end;

 

CountPoint:=i–1;

 

DrawPoly(CountPoint, y_func);

 

end;

{

--------------------------------------------------------------}

 

Begin

 

GrInit;

 

SysCoord;

 

DrawGraph;

 

ReadLn;

 

CloseGraph;

 

End.

С помощью DrawPoly можно вывести график части функции. Для этого достаточно указать при передаваемом массиве номер n перво- го рассматриваемого элемента (т.е. точки), а в первом параметре количество рассматриваемых точек, начиная с nой, например,

DrawPoly (20, y_func [100]);

КОНТРОЛЬНЫЕ ЗАДАНИЯ

I. Исследовав область определения и выбрав расположение координатных осей на экране и масштаб, построить графики функций:

1. y = ex ;

3. y = 10x ;

5. y = arcctg x;

7. y = arctg (tg x);

9. y = 1/(x + 1);

11. y = 1 + 2/x + 3/x;

13.y = sin x – cos x;

15.y = x + x

17. y = x – 2x2 + x3 ; 19. y = x + ex ;

21. y = (x – 3) e –x/2 ; 23. y = lg x;

25. y = tg x;

27. y = arccos (cos x);

29. y = 1/x2 ;

2.y = ln x;

4.y = ctg x;

6.y = arcsin (sin x);

8.y = x ;

10.y = (x + 3)/(x + 1);

12.y = 3 – 2/x – 1/x ;

14.y = 2x – cos 0.5x;

16.y = x +3cos x

18.y = x + ln (x + 1) + 2;

20.y = x1/x ;

22.y = cos (0.5x) – x ;

24.y = 1/x;

26.y = sin x;

28.y = arcctg (ctg x);

30.y = 1/x3 ;

Рисование графических примитивов и фигур

207

 

 

31. y = x/ln x;

32. y = 3x2 – 2x + 5;

33. y = 1/(3x2 + 2x + 1);

34. y = 1/(x2 + 2x + 1);

35. y = (x + 1)2 – sin x;

36.

y = (1 + x2 )/x;

37. y = x2ex ;

38.

y = x3 – 3x;

39. y = e–x – (x – 4)2;

40.

y = 1/(x3 + 1);

41. y = x2/3;

42.

y = (x – 4) e–x/10 ;

43. y = (sin x – cos x)ex/5 ;

44. y = e–x/3 sin x.

II.Построить кривые по заданному параметрическому представлению:

1.Окружность радиуса r с центром в начале координат:

x = r cost, y = r sin t, t [0, 2π).

2.Эллипс с большой и малой полуосями, равными соответственно r1 и r2 и расположенными параллельно осям координат:

x = r1 cos t, y = r2 sin t, t [0, 2π).

3. УлиткуПаскаля:

x = a cos2 t + b cos t, y = a cos t sin t + b sin t, a > 0, b > 0, t [0, 2π).

Рассмотреть случаи, когда b >= 2a, a < b < 2a, a > b.

4.Кардиоиду:

x= a cos t (1 + cos t), y = a sin t (1+cos t), a > 0, t [0, 2π).

5.Эпициклоиду:

x= (a + b) cos t a cos ((a + b) t/a), y = (a +b) sin t a sin ((a + b) t/a), a > 0, b > 0. Рассмотреть следующие случаи:

a)если b/а есть целое положительное число, t [0, 2π);

b)если b/a = p/q, где p и q – положительные целые взаимно про- стые числа, t [0, 2qπ).

6.Астроиду: x = b cos3 t, y = b sin3 t, t [0, 2π).

7.

Циссоиду: x = at2 /(1 + t2), y = at3/(1 + t2 ), t (– ,), a > 0.

8.

Строфоиду: x = a(t2 – 1)/(t2 + 1), y = at(t2 –1)/(t2 +1), t (– , ), a > 0.

9.

Конхоиду Никомеда: x = a +lcost, y = atgt +lsint, t (– π/2, π/2) – правая

 

ветвь, t (π/2, 3π/2) – левая ветвь, a >0, l > 0. Рассмотреть случаи, ко-

 

гда l < a, l > a, l = a.

10.Астроиду: x = R cos3 (t/4), y = R sin3 (t/4).

11.Гипоциклоиду: x = (R mR) cos mt + mR cos(t mt),

y = (R mR)sinmt mR sin (t – mt), mR = r, (m = r/R), m = 1/4; m = 1/2; m = 2/3; m = 2/5.

208

Лабораторная работа № 17

 

 

12.Декартов лист: x = 3at / (t3 + 1); y = 3at2 / (t3 + 1).

13.Кардиоиду: x = 2r cos t r cos 2t, y = 2r sin t r sin 2t.

14.Строфоиду: x = 2at2 / (1 + t2 ), y = at (t2 – 1) / (1 + t2 ).

15.Трактрису: x = a (ln tg t/2 + cos t), y = a sin t.

16.Циклоиду: x = a (t – sin t), y = a (1 – cos t).

17.Удлиненную(укороченную) циклоиду: x = at d sin t, y = a – d cos t.

18.Циссоиду Диоклеса: x = a / (t2+ 1), y = a / t(t2+ 1).

19.Эвольвенту окружности: x = a (cos t + t sin t), y = a (sin t t cos t).

III. Построить кривые по их уравнениям, заданным в полярных координатах:

1. r = а sin 3α;

2.

r = а sin 2α;

3. r = а α;

4.

r = а α2 l; l >= 0;

5. r = а sin (4α/3);

6.

r = а sin (5α/3);

7. r = а/α2 ;

8.

r = а/cos α ± a tg α;

9. r = a

 

 

 

 

10. r = −a cos2α/ cos α

2cos2α

11. r = а ebα ;

12. r = а(4cos a – 1/cos a);

13. r = a

 

;

14. r = −a

 

 

 

α

α +1;

15. r = а sin 3α;

16.

r = а/sinα ± l;

17. r = аα , a>0;

18. r = 1 + sin(2α);

19. r = sin 2α;

20.

r = 3a sinα cosα/(sin3 α +cos3 α);

21. r = а sin (α/2);

22. r = а sin (α/3);

23. r = а/α;

24.

r = a

 

 

α

25. r = 1 + cos a;

26. r = 2а cos a – l;

27. r = 2а(1 – cos α);

28. r = 2а sin 2α/cos α;

29. r = b + а sinα;

30. r = а(1 + cosα);

31. r = а sin α;

32.

r = 2а sin2 α/cos α;

33. r = 2а(1 – cos α);

34. r = α/4;

35. r = b + а sin α;

36. r = 1 + 2cos α;

37. r = а sin α;

38.

r = 1 + 2cos 2α;

39. r = sin 5α;

40.

r = sin 7α.

IV.

 

 

 

 

 

 

1. Построить ход лучей в собирающей линзе. Свет распространяется парал- лельно оптической оси.

Рисование графических примитивов и фигур

209

 

 

2.Построить ход лучей в собирающей линзе. Свет распространяется под углом a к оптической оси.

3.Построить ход лучей в собирающей линзе. Источник света находится в главном фокусе.

4.Построить ход лучей в собирающей линзе. Источник света находится в фокальной плоскости.

5.Построить ход лучей в рассеивающей линзе. Свет распространяется па- раллельно оптической оси.

6.Построить ход лучей в рассеивающей линзе. Источник света находится в главном фокусе.

7.Выполнить построение изображения в собирающей линзе. Предмет рас- положен на расстоянии l>f от линзы.

8.Выполнить построение изображения в собирающей линзе. Предмет рас- положен на расстоянии l<f от линзы.

9.Выполнить построение изображения в рассеивающей линзе. Предмет расположен на расстоянии l>f от линзы.

10.Выполнить построение изображения в рассеивающей линзе. Предмет расположен на расстоянии l<f от линзы.

11.Выполнить построение изображения в сферическом вогнутом зеркале. Предмет расположен на расстоянии l>f от зеркала.

12.Выполнить построение изображения в сферическом выпуклом зеркале. Предмет расположен на расстоянии l<f от зеркала.

13.Построить ход лучей в треугольной призме.

V. Составить программу, иллюстрирующую:

a)часыходики;

b)секундомер;

c)вращающийся квадрат;

d)вращающийся треугольник;

e)вращающийся вокруг центра отрезок;

f)вращающийся пятиугольник;

g)вращающийся прямоугольник;

h)вращающаяся пятиконечная звезда;

i)вращающаяся шестиконечная звезда.

210

Лабораторная работа № 18

УПРАВЛЕНИЕ ЦВЕТАМИ И ШАБЛОНАМИ ЗАЛИВКИ (ЗАПОЛНЕНИЯ)

В модуле Graph предусмотрены процедуры, с помощью которых можно заполнить (залить) определенным узоромлюбую замкну- тую область изображения. Вид узоразадается так называемым шаблоном заливки. В Turbo Pascal предопределены ряд стандарт- ных шаблонов, но, кроме того, имеется возможность конструиро- вать собственные.

Назначение шаблона заполнения (заливки) производится процеду-

рой

SetFillStyle (Pattern: Word; Color: Word),

где параметр Pattern определяет вид шаблона заливки, а Color его цвет. Все разрешенные значения параметра Pattern предопределены в модулеGraph в виде констант:

Const

EmptyFill = 0;

{ сплошная штриховка цветом фона (узор отсутствует) }

 

 

SolidFill = 1;

{ сплошная штриховка текущим цветом }

 

 

LineFill = 2;

{ штриховка линиями ======= }

 

 

LtSlashFill = 3;

{ штриховка линиями / / / / / / / }

 

 

SlashFill = 4;

{ штриховка утолщенными линиями / / / / / / / }

 

 

BkSlashFill = 5;

{ штриховка линиями \ \ \ \ \ \ \ }

 

 

LtBkSlashFill = 6;

{ штриховка утолщенными линиями \ \ \ \ \ \ \ }

 

 

HatchFill = 7;

{ штриховка +++++++ }

 

 

XHatchFill = 8;

{ штриховка ЧЧЧЧЧЧЧ }

 

 

InterLeaveFill = 9;

{ штриховка в прямоугольную клеточку }

 

 

WideDotFill = 10;

{ штриховка редкими точками }

 

 

CloseDotFill = 11;

{ штриховка частыми точками }

 

 

UserFill = 12;

{ штриховка определяется пользователем }

Константа UserFill используется для определения типа заливки, ко- торый предварительно был задан в программе.

Управление цветами и шаблонами заливки (заполнения)

211

 

 

Для задания нового шаблона необходимо воспользоваться проце-

дурой

SetFillPattern (PattMatrix: FillPatternType; Color: Word),

передав ей в параметре PattMatrix матрицу шаблона заливки и ука- зав цвет параметром Color. Эта процедура по действию аналогична SetFillStyle, но устанавливает только самодельныешаблоны. По- лучение информации о текущих установках шаблона заливки про-

изводится процедурой

GetFillSettings (Var FillType: FillSettingsType),

которая возвращает в переменной FillType предопределенноготипа

Type

 

FillSettingsType = Record

 

Pattern: Word;

{шаблон}

Color: Word;

{цвет}

End;

 

номер шаблона из списка, представленного при описании процеду- ры SetFillStyle (поле Pattern), и цвет, которым наносится этот шаб- лон (поле Color).

Если значение поля Pattern оказалось равным UserFill, то для полу-

чения подробной информации следует вызвать процедуру

GetFillPattern (Var PatternMatrix: FillPatternType),

возвращающую в переменной типа FillPatternType матрицу послед- него определенного пользователем шаблона.

Заливка областей изображения. В модуле Graph имеется ряд про-

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

Процедура

Bar (X1,Y1,X2,Y2: Integer)

рисует прямоугольник, внутренняя область которого залита по те- кущему шаблону. Параметры (X1,Y1) и (X2,Y2) координаты верх- него левого и нижнего правого углов прямоугольника.

Процедура

Bar3D (X1,Y1,X2,Y2: Integer; D3: Word; Top: Boolean)

212

Лабораторная работа № 18

 

 

рисует параллелепипед, лицевая сторона которого заливается по текущему шаблону, а глубина задается в пикселах параметром 3D. Параметр Top задает режим отображения верхней плоскости: True отображать, False не отображать. Этот параметр необходим при рисовании столбцов, стоящих друг на друге.

В модулеGraph определены две константы для нее:

Const

TopOn = True;

{ верхняя плоскость нужна }

TopOff = False;

{ верхняя плоскость не нужна }

Рисование сектора эллипса, который будет залит цветом по теку- щему шаблону, осуществляется процедурой

Sector (X,Y: Integer; StartAngle, EndAngle, XRadius, YRadius: Word).

Параметры процедуры имеют тот же смысл, что и в процедурах Arc, Ellipse. Для задания кругового сектора надо задавать YRadius с уче- том коэффициента сжатия:

Var

R,A,B: Word;

{R – радиус кругового сектора}

Begin

 

. . . . . .

 

GetAspectRatio (A,B);

Sector (100, 100, 0, 90, R, R * LongInt (A) div B );

. . . . . .

End.

Этого же эффекта можно достичь, используя процедуру

PiveSlice (X,Y: Integer; StartAngle, EndAngle, Radius: Word),

которая рисует сектор окружности, площадь которого заливается по текущему шаблону заполнения.

Процедура

FillEllipse (X,Y: Integer; XRadius, YRadius: Word);

рисует эллипс текущим цветом и заполняет его по установленному шаблону.

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

FillPoly (NumPoints: Word; Var PolyPoints).