1 Программирование на языке Паскаль Графика
2 Система координат (0,0) (x,y)(x,y) X Y x y
3 Управление цветом Цвет и толщина линий, цвет точек: Pen ( 1, 255, 0, 0 ); Цвет и стиль заливки: Brush ( 1, 0, 255, 0 ); Цвет текста: TextColor ( 0, 0, 255 ); толщина линии R(red) R(red) G(green) G(green) B(blue) B(blue) – выключить 1 - включить 0 – выключить 1 - включить R R G G B B R R G G B B
4 Точки, отрезки и ломаные (x 1, y 1 ) (x 2, y 2 ) Pen (1, 0, 255, 0); Line (x1, y1, x2, y2); (x, y) Pen (1, 0, 0, 255); Point (x, y); Pen (1, 0, 0, 255); Point (x, y); (x 1, y 1 ) (x 2, y 2 ) (x 3, y 3 ) (x 4, y 4 ) (x 5, y 5 ) Pen (1, 255, 0, 0); MoveTo (x1, y1); LineTo (x2, y2); LineTo (x3, y3); LineTo (x4, y4); LineTo (x5, y5); Pen (1, 255, 0, 0); MoveTo (x1, y1); LineTo (x2, y2); LineTo (x3, y3); LineTo (x4, y4); LineTo (x5, y5);
5 Фигуры с заливкой (x 1, y 1 ) (x 2, y 2 ) Pen (1, 0, 0, 255); Brush (1, 255, 255, 0); Rectangle (x1, y1, x2, y2); Pen (1, 0, 0, 255); Brush (1, 255, 255, 0); Rectangle (x1, y1, x2, y2); (x 1, y 1 ) (x 2, y 2 ) Pen (1, 255, 0, 0); Brush (1, 0, 255, 0); Ellipse (x1, y1, x2, y2); Pen (1, 255, 0, 0); Brush (1, 0, 255, 0); Ellipse (x1, y1, x2, y2); Brush (1, 100, 200, 255); Fill (x, y); Brush (1, 100, 200, 255); Fill (x, y); (x, y) Как отменить заливку? ?
6 Текст TextColor (0, 0, 255); Brush (1, 255, 255, 0); Font (20, 30, 600); MoveTo (x, y); writeln ('Привет!'); TextColor (0, 0, 255); Brush (1, 255, 255, 0); Font (20, 30, 600); MoveTo (x, y); writeln ('Привет!'); Привет! (x, y) размер 10 пикселей размер 10 пикселей угол поворота угол поворота насыщенность: 400 – нормальный 600 – жирный насыщенность: 400 – нормальный 600 – жирный 30 о
7 Пример (200, 50) (100, 100) (300, 200) program qq; begin Pen(2, 255, 0, 255); Brush(1, 0, 0, 255); Rectangle(100, 100, 300, 200); MoveTo(100, 100); LineTo(200, 50); LineTo(300, 100); Brush(1, 255, 255, 0); Fill(200, 75); Pen(2, 255, 255, 255); Brush(1, 0, 255, 0); Ellipse(150, 100, 250, 200); end. program qq; begin Pen(2, 255, 0, 255); Brush(1, 0, 0, 255); Rectangle(100, 100, 300, 200); MoveTo(100, 100); LineTo(200, 50); LineTo(300, 100); Brush(1, 255, 255, 0); Fill(200, 75); Pen(2, 255, 255, 255); Brush(1, 0, 255, 0); Ellipse(150, 100, 250, 200); end.
8 Задания "4": "Лягушка" "5": "Корона"
9 Штриховка (x 1, y 1 ) (x 2, y 2 ) N линий (N=5) h Rectangle (x1, y1, x2, y2); Line( x1+h, y1, x1+h, y2); Line( x1+2*h, y1, x1+2*h, y2); Line( x1+3*h, y1, x1+3*h, y2);... h := (x2 – x1) / (N + 1); Rectangle (x1, y1, x2, y2); x := x1 + h; for i:=1 to N do begin Line( round(x), y1, round(x), y2); x := x + h; end; h := (x2 – x1) / (N + 1); Rectangle (x1, y1, x2, y2); x := x1 + h; for i:=1 to N do begin Line( round(x), y1, round(x), y2); x := x + h; end; var x, h: real; x x округление до ближайшего целого x x
10 Как менять цвет? (x 1, y 1 ) (x 2, y 2 ) Brush ( 1, c, c, c ); Fill ( ???, ??? ); Brush ( 1, c, c, c ); Fill ( ???, ??? ); серый: R = G = B Шаг изменения c: x (x-1, y 1 +1) var c, hc: integer; hc := 255 div (N + 1); c := 0; for i:=1 to N+1 do begin Line (round(x), y1, round(x), y2); Brush (1, c, c, c); Fill (round(x)-1, y1+1); x := x + h; c := c + hc; end;
11 Штриховка (x 1, y 1 ) (x 2, y 2 ) (x 3, y 2 ) a h (x 3 +a, y 1 ) Line( x1+h, y1, x1+h-a, y2); Line( x1+2*h, y1, x1+2*h-a, y2); Line( x1+3*h, y1, x1+3*h-a, y2);... h := (x3 – x2) / (N + 1); a := x1 – x2; x := x1 + h; for i:=1 to N do begin Line( round(x), y1, round(x-a), y2); x := x + h; end; h := (x3 – x2) / (N + 1); a := x1 – x2; x := x1 + h; for i:=1 to N do begin Line( round(x), y1, round(x-a), y2); x := x + h; end; x x x-a
12 Штриховка (x 1, y 1 ) (x 2, y 2 ) hxhx hyhy y y x x y y Line( x1, y1+hy, x1+hx, y1+hy) ; Line( x1, y1+2*hy, x1+2*hx, y1+2*hy); Line( x1, y1+3*hy, x1+3*hx, y1+3*hy);... hx := (x2 – x1) / (N + 1); hy := (y2 – y1) / (N + 1); x := x1 + hx; y := y1 + hy; for i:=1 to N do begin Line( x1, round(y), round(x), round(y)); x := x + hx; y := y + hy; end; hx := (x2 – x1) / (N + 1); hy := (y2 – y1) / (N + 1); x := x1 + hx; y := y1 + hy; for i:=1 to N do begin Line( x1, round(y), round(x), round(y)); x := x + hx; y := y + hy; end;
13 Задания "4": Ввести с клавиатуры число линий штриховки и построить фигуру, залив все области разным цветом. "5": Ввести с клавиатуры число окружностей и построить фигуру, залив все области разным цветом.
14 Program primer ; Uses graph ; Var D, m : integer : {переменные для установки драйвера, режима} Begin D:= detect; InirGraph(d,m, путь к драйверу ); If GrapfResult =0 then {если инициализация прошла успешно} begin closeGraph ; end else writeln (произошла ошибка при инициализации графики); end. Пример заготовки к графическому режиму
15 program graphic; uses graph; var driver, mode, errorcode : integer; xm,ym,i,j : integer; pi,pi300,x1,y1,x2,y2, sc : real; st1,st2,st3 : string; function f(x:real) : real; begin f:=sin(x)+sin(2*x)+sin(3*x)-1-cos(x)-cos(2*x);{ функция для построения} end; {графика} begin st1:='x';st2:='y'; st3:=' Press ENTER'; sc:=50; driver:=9; {egavga} mode:=2; {640х480 пикселей} initgraph(driver,mode,'d:\bp\bgi'); {инициализация графического режима } errorcode:=graphresult; if errorcodegrok then {ошибка } begin writeln('Error init Graph'); closegraph; halt; end; xm:=getmaxx div 2; ym:=getmaxy div 2; { xm=320;ym=240;центр экрана} line(xm,20,xm,460);{ось y} line(20,ym,620,ym);{ ось x} outtextxy(630,ym,st1); {маркировка оси х} outtextxy(xm,10,st2); {маркировка оси у} pi:= ; pi300:=pi/300; x1:=-pi; for i:=0 to 24 do {разметка оси х вертикальными черточками} begin line(xm+round(80*x1),230,xm+round(80*x1),250); x1:=x1+pi300*25; end; x1:=-pi; {собственно построение графика отрезками прямых} while x1
16 Program listik; uses graphabc,crt; var x,y,a,b,x0,y0,mx,my,i,k:integer; h,xt,yt,y2:real; function f(x:real):real; begin result:=0.5*sqr(x)+4*x-3; end; function f1(x:real):real; begin result:=(7*power(sin(sqr(x)),3))/(3*sqr(cos(power(x,3)))+1); end; begin FloodFill(10,10,clsilver); x0:=639 div 2; y0:=479 div 2; mx:=5; my:=5; line(639 div 2,0,639 div 2,479); line(0,479 div 2, 639,479 div 2); for i:=1 to 64 do line(10*i,479 div 2-5,10*i,479 div 2+5); for k:=1 to 48 do line(639 div 2-5,10*k,639 div 2+5,10*k); xt:=-15; h:=0.1; repeat yt:=f(xt); x:=x0+round(xt*mx); y:=y0-round(yt*my); setpixel(round(x),round(y),clblack) ; xt:=xt+h; until (xt>5) or (keypressed); {xt:=-20; h:=0.0031; repeat yt:=f1(xt); x:=x0+round(xt*mx); y:=y0-round(yt*my); setpixel(round(x),round(y),clblack) ; xt:=xt+h; until (xt>20) or (keypressed);} xt:=-7; h:=0.0031; repeat yt:=f1(xt); x:=x0+round(xt*mx); y:=y0-round(yt*my); setpixel(round(x),round(y),clblack) ; xt:=xt+h; until (xt>7) or (keypressed); end.
17 Программирование на языке Паскаль Тема 8. Графики функций
18 Построение графиков функций Задача: построить график функции y = 3 sin(x ) на интервале от 0 до 2π. Анализ: максимальное значение y max = 3 при x = π/2 минимальное значение y min = -3 при x = 3 π/2 Проблема: функция задана в математической системе координат, строить надо на экране, указывая координаты в пикселях.
19 Преобразование координат (x,y)(x,y) X Y x y Математическая система координат Экранная система координат (пиксели) (xэ,yэ)(xэ,yэ) xэxэ yэyэ (0,0)(0,0) (0,0)(0,0) a b k – масштаб (длина изображения единичного отрезка на экране) x э = a + kx y э = b - ky x э = a + kx y э = b - ky
20 Программа 2π2π 2π2π h – шаг изменения x w – длина оси ОХ в пикселях на экране оси координат цикл построения графика program qq; const a = 50; b = 200; k = 50; xmin = 0; xmax = ; var x, y, h: real; xe, ye, w: integer; begin w := round((xmax - xmin)*k); Line(a-10, b, a+w, b); Line(a, 0, a, 2*b); x := xmin; h := 0.05; while x
21 Как соединить точки? Алгоритм: Если первая точка перейти в точку (x э,y э ) иначе отрезок в точку (x э,y э ) Если первая точка перейти в точку (x э,y э ) иначе отрезок в точку (x э,y э ) Программа: начальное значение выбор варианта действий логическая переменная var first: boolean;... begin... first := True; while x
22 Задания "4": Построить график функции y = x 2 на интервале [-3,3]. "5": Построить график функции (эллипс)