Практика_5
Задание 1.
Создать новое приложение (форму).
Задать:
Имя проекта – Работа с графикой.
Размер формы – 700; 500
Расположение на экране монитора – 250; 250
Добавить на форму две метки label1, и label2. Изменить свойства шрифта для этих компонентов так, чтобы текст хорошо читался, цвет текста – черный.
Добавить на форму кнопку. Указать для неё следующие свойства:
свойство | значение |
Fontr | Arial, обычный, 12 |
Добавить на форму два поля TextBox (Edit). Изменить размер и свойства шрифта для этих компонентов так, чтобы текст хорошо читался, цвет текста – черный.
Сохраните проект.
Задание 2. Разместить фоновое изображение на форме, использовать файл fon.jpg (не забудьте скопировать файл в папку проекта). Поместить на форму компонент PictureBox и загрузить в него изображение, использовать файл z5_2.jpg (не забудьте скопировать файл в папку проекта).
Сохраните проект.
Задание 3. Изменить проект, созданный ранее, для построения графика функции y = x*sin(x) на промежутке, заданном пользователем.
Создать обработчик события Click для кнопки button1 и строить в нем график функции по точкам:
var x, y, h, k, x0, xn:real;
x1, y1, n, c_x, c_y:integer;
gr:Graphics;
bm:Bitmap;
p_c:Pen;
Нарисовать оси координат в виде двух перпендикулярных линий, пересекающихся в центре компонента PictureBox.
//подготовка графической области для рисования по пикселям
bm:=new Bitmap(PictureBox1.Width,Picturebox1.Height);
pictureBox1.Image:=(Image)(bm);
gr:=Graphics.FromImage(pictureBox1.Image);
//закраска графической области белым цветом
gr.Clear(Color.White);
//центр области построения
c_x:=PictureBox1.Width div 2;
c_y:=PictureBox1.Height div 2;
//оси
p_c:=new Pen(Color.Black,1);
gr.DrawLine(p_c, 0, c_y, 2*c_x, c_y);
gr.DrawLine(p_c, c_x, 0, c_x, 2*c_y);
Чтобы получить видимость сплошной линии, количество точек, которые образуют график функции, должно быть не менее 10 000 (n = 10 000).
//количество точек
n:=10000;
Крайние границы промежутка, которые пользователь ввёл в TextBox1 и TextBox2, необходимо преобразовать из строковой переменной в числовую – вещественную (Float):
//концы промежутка
x0:=StrToFloat(TextBox1.Text);
xn:=StrToFloat(TextBox2.Text);
При построении нужно учитывать масштаб: ширина компонента PictureBox должна соответствовать длине заданного промежутка. Тогда масштабный коэффициент можно рассчитать по формуле k=PictureBox1.Wight/(xn-x0)
//масштабный коэффициент
k:=PictureBox1.Width/(xn-x0);
Шаг изменения значения x определяется как h=(xn-x0)/n
//шаг
h:=(xn-x0)/n;
x:=x0;
Сам график функции будем «рисовать» в цикле:
for var i:=1 to n do
begin
y:=x*sin(x);
end;
Необходимo учитывать, что при вычислении значения x и y будут вещественными, а значения графических координат могут быть только целыми. Поэтому перед прорисовкой точки нужно преобразовать вещественные числа в целые с помощью функции trunc.
x1:=trunc(x*k)+c_x;
y1:=trunc(-y*k)+c_y;
Некоторые точки графика при построении могут оказаться за пределами графической области, поэтому необходима проверка значения y1: значение должно быть неотрицательным и меньше высоты графической области.
//проверка попадания точки в графическую область
if (y1=0) and (y12*c_y) then
bm.SetPixel(x1,y1,Color.Blue);
x:=x+h;
Сохраните проект.
З
адание 4. Самостоятельно добавьте в проект график функции y=0,3x2 – 4x+2 в той же системе координат красным цветом.
Сохраните проект.
З
адание 5. Создать проект и построить гистограмму по данным температуры воздуха в течение недели, которые хранятся в массиве. Описать массив с константными данными.
Поместить на форму компоненты: PictureBox и Button1.
Изменить свойства Text у компонента Button1 на «Диаграмма с данными».
Написать обработчик события Click для компонента Button1, в котором диаграмма строится с помощью прямоугольников.
const a: array[1..7] of integer = (10, 14, 16, 12, 7, 10, 8);
n = 7;
var max, x, y1, y2, h, i, cr, cg,
cb : integer;
m : real;
gr : Graphics;
rnd : Random;
sb : SolidBrush;
Найти максимальный элемент в массиве max.
max := a[1];
for i := 2 to n do
if a[i] max then
max := a[i];
Рассчитать масштабный коэффициент:
m := PictureBox1.Height / max;
Подготовка графической области для рисования:
gr := PictureBox1.CreateGraphics;
gr.Clear(Color.White);
rnd := new Random();
Ширина прямоугольника: h := trunc(PictureBox1.Width/(2*n+1));
В цикле строить n прямоугольников одинаковой ширины.
x := h;
for i := 1 to n do
begin
cr := rnd.next(256);
cg := rnd.next(256);
cb := rnd.next(256);
sb := new SolidBrush(Color.FromArgb(cr,cg,cb));
y1 := PictureBox1.Height - 1;
y2 := y1 - trunc(a[i] * m)- 1;
gr.FillRectangle(sb, x, y2, h, y1);
x := x + 2 * h;
end;
Задание 6. Самостоятельно измените проект из примера 4.6 так, чтобы строилась линейчатая диаграмма (столбики расположены горизонтально).
Код для преподавателя:
procedure Form1.button1_Click(sender: Object; e: EventArgs);
const a: array[1..7] of integer = (10, 14, 16, 12, 7, 10, 8);
n = 7;
var max, y, x1, x2, h, i, cr, cg, cb : integer;
m : real;
gr : Graphics;
rnd : Random;
sb : SolidBrush;
begin
max := a[1];
for i := 2 to n do
if a[i] max then
max := a[i];
h := trunc(PictureBox1.Height/(2*n+1));
m := PictureBox1.Width / max;
y := h;
//подготовка графической области для рисования примитивов
gr := PictureBox1.CreateGraphics;
gr.Clear(Color.White);
rnd := new Random();
for i := 1 to n do
begin
cr := rnd.next(256);
cg := rnd.next(256);
cb := rnd.next(256);
sb := new SolidBrush(Color.FromArgb(cr,cg,cb));
x1 := PictureBox1.Width ;
x2 := x1 - trunc(a[i] * m)- 1;
gr.FillRectangle(sb,x2,y,x1,h);
y := y + 2 * h;
end;
end;
end.