- •Оглавление
- •Введение
- •Глава 1
- •Использование компонентов общего назначения: tLabel, tButton, tEdit, tShape, tTimer, tPanel
- •1.1.1. Проект «Калькулятор»
- •1.1.2. Проект «Таймер»
- •1.1.3. Проект «Светофор»
- •1.1.4. Проект «Движение шарика tShape с отражением»
- •Глава 2
- •2.1. Класс tCanvas, его свойства и методы
- •2.1.1. Рисование узоров
- •2.1.2. Рисование поля для различных игр
- •2.1.3. Рисование координатной сетки
- •2.1.4. Построение графиков элементарных функций
- •2.2. Класс tBitmap и работа с растровыми рисунками
- •2.2.1. Рисование на поле растрового рисунка
- •2.2.2. Движение двоичного образа по фоновой картинке
- •2.3. Компонент tImage и его использование
- •2.3.1. Проект «Движение компонента tImage»
- •2.3.2. Перемещение картинок
- •2.3.3. Проект «Движение компонента tImage
- •Глава 3
- •3.1. События от мыши
- •3.1.1. Проект «Попади в мишень»
- •3.1.2. Проект «Снежинки»
- •3.1.3. Проект «Крестики-нолики»
- •3.1.4. Движение образа по удерживанию левой кнопки мыши
- •3.1.5. Проект «Жизнь клеток»
- •3.2. События от клавиатуры
- •3.2.1. Код клавиши
- •3.2.2. Управляемое движение образа
- •3.2.3. Совмещение управляемого и неуправляемого движений.
- •Глава 4
- •4.1. Проект «Простейший графический редактор»
- •Глава 5
- •5.1. Создание кнопок
- •5.1.1. Проект «Лохотрон»
- •5.1.2. Игра «Пятнадцать»
- •5.2. Создание компонентов tImage
- •5.2.1. Проект «Угадай картинку»
- •5.2.2. Проект «Собери картинку»
- •Глава 6
- •6.1. Компоненты tStringGrid и tDrawGrid
- •6.1.1. Сортировка массива
- •6.1.2. Проект «Таблица успеваемости»
- •6.1.3. Система предварительной продажи билетов
- •6.1.4. Проект «Таблица рисунков»
- •6.1.5. Рисование в таблице tDrawGrid
- •6.2. Компоненты tListBox, tCombobox ,
- •6.2.1. Прорисовка изображений в списке tListBox
- •6.2.2. Проект «Зоомагазин»
- •6.2.3. Проект «Шуточная игра»
- •6.2.4. Проект «Редактирование списка вопросов»
- •Глава 7
- •7.1. Тест «Знаете ли вы загадки?»
- •7.2. Проект «Исторические даты»
- •Глава 8
- •8.1. Компоненты tOpenDialog, tSaveDialog – диалоги
- •8.1.1. Просмотр текстовых файлов
- •8.2. Добавление и удаление записей в файл и из файла
- •8.2.1. Проект «Журнал группы»
- •8.3. Файлы для проекта «Судоку»
- •Глава 9
- •9.1. Просмотр видеофильма с использованием
- •9.2. Простейшая мультипликация
- •Глава 10
- •10.1. Пример использования try… except
- •Глава 11
- •11.1. Оформление проекта
- •11.1.1. Проект «Бегущая строка»
- •11.1.2. Проект «Титры»
- •11.1.3. Общие рекомендации по оформлению
- •11.2. Рекомендации для отчета по проекту
- •11.3. Темы проектов
- •11.3.1. Головоломка «Сквэрворд»
- •11.3.2. Задача «Путешествие по маршруту»
- •11.3.3. Головоломка «Ходом коня»
- •11.3.4. Задача «Извилистый путь»
- •11.3.5. Головоломка «Фишки на поле»
- •Список литературы
- •630058, Новосибирск, ул. Русская, 35
2.1.3. Рисование координатной сетки
для построения графиков
Постановка задачи. Нарисовать координатную сетку, как показано на рис. 10.
Реализация. Напишем процедуру setka (x0, y0, mx, my : integer) с входными параметрами x0, y0 – координаты начала системы координат; mx, my – шаги координатной сетки в пикселях.
Рис. 10. Координатная сетка
procedure setka(x0, y0, mx, my:integer);
// x0, y0 - координаты начала системы координат
var lx, ly:real; // метки (оцифровка) линий сетки
dlx, dly:real; // шаг меток (оцифровки) линий сетки
x,y:integer;
cross:integer; счетчик неоцифрованных линий
begin
dlx:=0.5; // шаг меток оси X
dly:=1.0; // шаг меток оси Y, метками будут: 1, 2, 3 и т. д.
with form1.Canvas do
begin
cross:=dcross;
MoveTo(x0,y0); LineTo(x0,y0-h); // ось X
MoveTo(x0,y0); LineTo(x0+w,y0); // ось Y
// засечки, сетка и оцифровка оси X
x:=x0+mx;
lx:=dlx;
repeat
MoveTo(x,y0-3);LineTo(x,y0+3); // засечка
cross:=cross-1;
if cross = 0 then // оцифровка
begin
TextOut(x-8,y0+5,FloatToStr(lx));
cross:=dcross;
end;
Pen.Style:=psDot;
MoveTo(x,y0-3);LineTo(x,y0-h); // линия сетки
Pen.Style:=psSolid;
lx:=lx+dlx;
x:=x+mx;
until (x>x0+w);
// засечки, сетка и оцифровка по оси Y
y:=y0-my;
ly:= dly;
repeat
MoveTo(x0-3,y);LineTo(x0+3,y); // засечка
TextOut(x0-20,y,FloatToStr(ly)); // оцифровка
Pen.Style:=psDot;
MoveTo(x0+3,y); LineTo(x0+w,y); // линия сетки
Pen.Style:=psSolid;
y:=y-my;
ly:=ly+dly;
until (y<y0-h);
end;
end;
Вернемся к способам вывода изображения на форму. Третий способ вывода изображения сразу же при запуске приложения заключается в следующем. Выберите событие формы OnPaint. Справа нажмите на стрелочку и выберите строку FormCreate. Тогда, если напишем в коде процедуры FormCreate вызов процедуры Setka, то рисунок появится на форме сразу после запуска проекта. Ниже приведен код процедуры FormCreate:
procedure TForm1.FormCreate(Sender: TObject);
begin
mx:=25;
my:=25;
dcross:=1; // помечать линии сетки X: 1 – каждую;
// 2 – через одну;
// 3 – через две;
h:=7*my;
w:=14*mx;
setka(30,200,mx,my);
end;
Задание 1. Измените переменную dlx так, чтобы метки по оси Х тоже были через 1.
Задание 2. Упростите процедуру setka(x0, y0, mx, my : integer) так, чтобы координатная сетка была пригодна для построения графиков элементарных функций (примерный вид приведен на рис. 11). Новую процедуру setka назовите koord_setka.
Рис. 11. Оси координат и сетка
2.1.4. Построение графиков элементарных функций
Для построения графиков рекомендуем использовать компонент TPaintbox (вкладка System). В этом случае нет необходимости задавать положение области на форме.
Для того чтобы построить оси координат, нужно задать положение начала математической системы координат и масштабы каждой из осей. Подчеркнем, что отсчет положения начала системы координат ведется в пикселях от левого верхнего угла компонента TPaintbox. Обозначим через u0 и v0 расстояния до начала системы координат по горизонтали и вертикали соответственно. Масштабы по оси абсцисс и по оси ординат обозначим mx и my, их тоже следует задавать в пикселях. Переменные u0, v0, mx, my включим в список глобальных переменных.
Теперь перейдем непосредственно к построению графика. Сначала нам нужно создать процедуру (назовем ее xytouv), которая преобразовывала бы математические координаты в экранные. Алгоритм преобразования прост: значение математической координаты (вещественное число) умножается на масштаб, округляется функцией round и прибавляется к значению u0 (положение начала координат). Это для оси абсцисс. Для оси ординат сложение следует заменить на вычитание, поскольку экранная координата отсчитывается «вниз».
Поместим эту процедуру в разделе implementation модуля Unit1. Здесь x, y – математические координаты точки графика, а u, v – ее экранные координаты. Так как процедура xytouv возвращает экранные координаты u и v, то перед переменными u, v следует написать var.
procedure xytouv(x,y:real; var u,v:integer);
begin
u:=u0+round(x*mx);
v:=v0-round(y*my);
end;
Напишем функцию f(x), с помощью которой задается математическая формула функции. Для примера будем строить график функции y = 2sinx.
Function f (x : real) : real;
begin
f:=2*sin(x);
end;
Затем выберем отрезок на оси абсцисс, на котором будет изображен график функции. Для линейний и квадратичной функций это может быть симметричный отрезок, например [−10; 10]. Для логарифмической функции необходимо выбирать отрезок в положительной части оси абсцисс, например, [0.01; 10]. Для функций синуса и косинуса можно взять любой отрезок, например [−; ]. В нашем примере пусть будет отрезок [−2; 2]. Границы выбранного отрезка будут входными параметрами xmin и xmax для процедуры Graphic.
Будем менять переменную х на отрезке [xmin; xmax] с некоторым шагом dx, который подбираем экспериментально. Начинайте со значения, например, dx = 0,01. Для вывода точки на Paintbox1 (или Form1) используем свойство Pixels канвы Canvas. Ниже приведен код процедуры Graphic.
procedure Graphic(xmin, xmax, dx : real);
{xmin, xmax – минимальное и максимальное значения x,
dx – «шаг» построения}
var x,y:real; u,v:integer;
begin
x:=xmin; {присваиваем x минимальное значение}
while x<xmax do
begin
y:=f(x); {вычисляем y }
{Преобразуем математические координаты в экранные}
xytouv(x,y,u,v);
{Ставим точку зеленого цвета с координатами u,v}
Form1.Paintbox1.Canvas.Pixels[u,v]:=clgreen;
x:=x+dx; {увеличиваем x}
end;
end;
Вызовем процедуру graphic в коде обработчика TForm1.Button1Click (кнопка «Построить»).
procedure TForm1.Button1Click(Sender: TObject);
begin
Graphic(-2*pi, 2*pi, 0.01);
end;
В итоге получим график, изображенный на рис. 12.
Рис. 12. График функции y= 2sinx на отрезке [–2; 2].
Задание. Расширьте возможности приложения. Через компонент TMainMenu задайте несколько функций. Для этого в код функции f вставьте оператор выбора case, в котором разным номерам будут соответствовать различные функции.