Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка по программированию.doc
Скачиваний:
11
Добавлен:
13.11.2019
Размер:
1.2 Mб
Скачать

Int I,step;

Значение переменной step введем из поля редактировыния Edit. Делается это следующим образом.

step=StrToInt(Edit1->Text);

Конструкция Edit1->Text представляет собой строку символов, находящуюся в поле редактирования. В нашем случае изначально это строка “50”. Функция StrToInt, как это следует из ее названия, производит преобразование строки в целое. Возвращаемое значение – целая константна, равная 50. Эта величина и присваивается переменной step. Если пользователь введет в поле редактирования другое значение, то оно станет актуальным для переменной step после очередного нажатия на кнопку START.

Область рисования PaintBox имеет инструмент Canvas – канва или холст для рисования. Именно этот инструмент располагает рядом свойств и методов, позволяющих выполнять все необходимые нам действия. Синтаксис обращений к методам и свойствам будут понятен из следующих фрагментов текста.

Сейчас нам необходимо установить стиль рисования линий. Исходно это должен быть стиль сплошной линии. Запишем следующее выражение:

PaintBox1->Canvas->Pen->Style=psSolid;

Здесь мы обращаемся к компоненту PaintBox, к его инструменту Canvas, к его свойству Pen (перо, карандаш) и к его свойству Style. Короче говоря, переменной Style присваивается значение psSolid, а это и есть стиль сплошной линии. Вообще говоря, стиль psSolid устанавливается по умолчанию, однако мы задаем его в явном виде, поскольку далее в программе мы стиль изменим, но исходные установки должны устанавливаться каждый раз при нажатии кнопки START.

Установим размер шрифта отображения символов на PaintBox равным 8. Заметим, что все размеры и единицы длины выражаются в пикселях - количествах точек.

PaintBox1->Canvas->Font->Size=8;

Особых комментариев здесь, видимо, не требуется.

Инструмент Brush (кисть) позволяет закрашивать замкнутые или выделенные области PaintBox заданным цветом, который устанавливается в свойстве Color. Зададим это цвет белым с использованием следующего выражения.

PaintBox1->Canvas->Brush->Color=clWhite;

Здесь, очевидно, тоже все понятно.

Теперь «зальем белой краской» все поле рисования.

PaintBox1->Canvas->FillRect(Rect(0,0,PaintBox1->Width,PaintBox1->Height));

Функция FillRect закрашивает прямоугольник. Прямоугольник, в свою очередь, определяется функцией Rect с четырьмя аргументами, определяющими левый верхний и правый нижний углы прямоугольника. Последние два значения определяются свойствами Width и Height компонента PaintBox. Здесь крайне важно знать, что система координат в поле рисования «перевернута». Начало координат (точка x=0, y=0) находится в левом верхнем углу, ось X направлена слева направо, а ось Y направлена сверху вниз/

Теперь нарисуем на холсте оси координат. Для проведения отрезков прямых линий мы можем воспользоваться двумя функциями: MoveTo и LineTo. Первая устанавливает перо (карандаш) в точку, координатами которой являются два аргумента функции X и Y. Координаты приводятся к типу целых чисел. Вторая функция рисует прямую, исходящую из текущей точки в точку, заданную аргументами функции. Прорисовка вертикальной м горизонтальной оси выполняется следующим четырьмя выражениями.

PaintBox1->Canvas->MoveTo(20,20);

PaintBox1->Canvas->LineTo(20,320);

PaintBox1->Canvas->MoveTo(20,170);

PaintBox1->Canvas->LineTo(1050,170);

Сначала перо устанавливается в точку с координатами 20,20, то есть с отступом в 20 пикселей вправо от левой границы холста и 20 пикселей вниз от верхней границы – помним о перевернутой системе координат! Далее проводится вертикально вниз прямая длиной 300 пикселей. Горизонтальная ось проводится на уровне 170 пикселей. Длина горизонтальной оси равна 1030 пикселей. Таким образом значение 0 для отображаемых далее функций синуса и косинуса будет соответствовать горизонтальному уровню 170 на холсте. Расставим небольшие вертикальные штрихи по оси Y, отмечающие значения некоторых опорных точек на этой оси. Иными словами, разметим вертикальную ось, поставив штрихи на расстоянии 100, 200, … 1000 пикселей от начала координат. Делается это с помощью цикла.

for(i=120; i<=1020; i+=100)

{

PaintBox1->Canvas->MoveTo(i,170);

PaintBox1->Canvas->LineTo(i,160);

}

Действия в цикле достаточно очевидны и комментариев не требуют.

Разметим вертикальную ось. Здесь достаточно изобразить два небольших горизонтальных штриха около оси Y на уровнях в 100 пикселей выше и 100 пикселей ниже начала координат. Для этого запишем в программе следующие 4 выражения.

PaintBox1->Canvas->MoveTo(20,70);

PaintBox1->Canvas->LineTo(30,70);

PaintBox1->Canvas->MoveTo(20,270);

PaintBox1->Canvas->LineTo(30,270);

Напротив только что прорисованных двух штрихов и немного левее вертикальной оси выставим числовые значения 1 и -1. Это будут отмасштабированные значения изображаемых тригонометрических функций. Для рисования этих значений воспользуемся функцией TextOutA отображения текста на холсте. Функция имеет три аргумента. Первые два – координаты левого верхнего угла области, в которой отобразится текст. Последним аргументом должна быть строка символов. Если в качестве выводимого текста фигурирует целое число, то оно само заменяет эту строку, но это скорее исключение, чем правило. Так, если бы была необходимость отобразить в виде текста вещественное число с десятичной точкой, то потребовалось бы преобразование числа в строку типа FloatToStr(6.75). Ну, а в нашем случае достаточно применить следующие выражения.

PaintBox1->Canvas->TextOutA(8,62,1);

PaintBox1->Canvas->TextOutA(4,262,-1);

Теперь проставим числовые значения около штрихов на горизонтальной оси.

for(i=120; i<=920; i+=200)

PaintBox1->Canvas->TextOutA(i-2,175,i/100);

Нетрудно понять, что под указанными штрихами отображаются цифры 1, 3, … 9. Это – отмасштабированные значения аргумента рисуемых тригонометрических функций. Внимательно посмотрите на последний фрагмент и разберитесь в том, что здесь абсолютно необходимо применить целочисленное деление i/100.

Приступаем к рисованию графика функции y=sin(x). Мы предполагаем, что аргумент функции будет меняться от 0 до 10. Сопоставим этому изменению аргумента изменение номера пикселя вдоль горизонтальной оси от 0 до 1000. Для этого меняем переменную i от 20 до 1020 с учетом того, что начало координат смещено на 20 пикселей от края канвы. В соответствие с этим аргумент функции должен вычисляться через i по формуле x=(i-20)/100.0. деление здесь должно быть именно вещественным, а не целочисленным.

Прежде всего, поскольку sin(0) равен нулю, необходимо установить перо в начало координат – в точку с координатами 20,170. Дальнейшее рисование производится в цикле с увеличением i на величину шага step.

PaintBox1->Canvas->MoveTo(20,170);

for(i=20+step; i<=1020; i+=step) PaintBox1->Canvas->LineTo(i,170-sin((i-20)/100.)*100);

Вертикальная координата очередной точки задается выражением 170-sin((i-20)/100.)*100. Во-первых, отсчитывать ее надо от оси Y, то есть от уровня 170. Во-вторых, значение синуса надо вычитать из 170, поскольку система координат перевернута. И, в-третьих, значение синуса умножается на 100 для масштабирования по вертикальной оси.

Прежде чем рисовать график второй функции – косинуса, изменим стиль линии со сплошного на штриховой. Установку стиля мы уже умеем делать, а название штрихового стиля будет psDash. Следовательно, далее в программе должна быть строка:

PaintBox1->Canvas->Pen->Style=psDash;

Функция cos(0), как известно, имеет значение 1. Тогда перед рисованием графика необходимо переместить перо в точку с координатами 20,70.

PaintBox1->Canvas->MoveTo(20,70);

И далее будет выполняться рисование в цикле.

for(i=20+step; i<=1020; i+=step) PaintBox1->Canvas->LineTo(i,170-cos((i-20)/100.)*100);

Последнее, что нужно отобразить на холсте, это некая подпись к рисунку. Пусть это будет строка ----------- - SIN, - - - - - - COS, но с увеличенным до 20 размером символов. Установим нужный размер.

PaintBox1->Canvas->Font->Size=20;

Снова используем инструмент вывода текста в нужное место холста.

PaintBox1->Canvas->TextOutA(400,280,"----------- - SIN, - - - - - - COS");

Вот и все, что необходимо написать в теле функции обработчика нажатия на первую кнопку START.

Кнопку FINISH мы организовали для закрытия программы (хотя это можно делать, разумеется, и стандартным закрытием окна программы. Полный выход из программы осуществляется в С++ функцией Close(). Ее-то и следует поместить в обработчик нажатия на вторую кнопку. Теперь программа полностью готова, и если в ней установить шаг прорисовки, равный 1, то есть самый минимально возможный, то на экране монитора можно будет видеть следующую картину.