Цель лабораторной работы: научиться строить графики функций, используя стандартные средства, предоставляемые библиотекой awt Java.
Попробуем научиться строить графики, используя апплеты Java. Сразу нужно оговориться, что существует множество платных и бесплатных библиотек, реализующих различные приемы построения графиков. Например, такая известная вещь, как jfreechart. Но наша задача – разобраться с принципами построения графиков с использованием стандартного инструментария.
Для рисования графика необходимо решить, где он будет в принципе располагаться. Не будем усложнять задачу и нарисуем наш график непосредственно на «поверхности» основного окна апплета. Для этого используем класса Graphics. При запуске апплета используем метод paint непосредственно для рисования графика. Наш начальный код будет выглядеть примерно так:
import java.applet.*;
import java.awt.*;
public class MyApplet extends Applet {
// рисование апплета
public void paint(Graphics g)
{
}
}
Этот код создаст пустое окно апплета. Теперь нужно нарисовать график. Сперва надо вспомнить принципы рисования на экране, которые в общих чертах практически одинаковы для любого языка программирования. Верхняя левая точка экрана (в нашем случае – окна апплета) является нулем декартовой двумерной системы координат. Отрицательные точки по умолчанию на экране не отображаются (что естественно), положительное направление по x – вправо, по y – вниз (рис.7). Это несколько не совпадает с привычным видом декартовой системы координат.
Для начала нужно решить, какого размера будет наш графический апплет. Пусть размер будет 800 на 800 точек. Сразу же нарисуем оси координат. Пусть ось абсцисс находится посередине (координата y = 400), а ось ординат- на 10 точек от левого края экрана (координата x = 10). Для рисования линий используем метод drawLine. Аргументы метода – 4 координаты (x0, y0, x1, y1), задающие две точки. Соответственно, на контейнере будет нарисован отрезок, проходящий через две точки. Код, задающий размер контейнера-апплета и оси координат, будет выглядеть следующим образом:
this.setSize(800, 800);
g.drawLine(10, 0, 10, 800);
g.drawLine(0, 400, 800, 400);
Теперь перейдем непосредственно к рисованию графика. Пусть это будет график функции 350* cos (0.05*x). Для вызова математической функции используется класс Math. Поскольку он входит в стандартный пакет Java, то его не нужно подключать с помощью инструкции import. При вызове функции нужно внимательно смотреть на тип аргументов для нее и в случае необходимости приводить тип. Так, функция cos класса Math, как и большинство остальных функций, работают с аргументами типа double. Мы будем подставлять в качестве аргумента переменную цикла, однако она будет целочисленного типа (int). В этом случае нас выручает то, что мы умножаем аргумент на 0.05, что автоматически приведет результат к типу double. Однако рисовать график будем с помощью того же метода drawLine, а его аргументы должны быть целочисленными. Для этого придется приводить результат к типу int. Для перебора значений аргумента x организуем цикл с помощью инструкции for. Итак, код для построения собственно графика функции:
Полученный график с окном апплета приведен на рис.8.
Рис.8. Результат построения графика функции
ЗАДАНИЕ: разработать приложение, с помощью которого можно построить два (!) графика функции. Варианты функции выбрать из списка ниже либо предложить свой. Графики функции должны быть построены НЕ В ОКНЕ ПРОГРАММЫ APPLETVIEWER, т.е. использовать какой-либо контейнер (Frame, Panel, etc). Кроме построения, приложение должно сохранить полученные значения в текстовом файле. Масштаб по осям абсцисс и ординат подобрать самостоятельно. Графики подписать.
Варианты:
1. 100*sin(0.1*x-pi/2);
2. 250*cos(10*x+pi);
3. 10*exp(-0.1*t)*sin(10*t);
4. 12*exp(-0.01*t)*cos(t);
5. 130*exp(-0.02*t)*sin(2*t);
6. 200*(1-exp(-0.02*t));
7. 100*(1-exp(-0.1*t));
8. 80*(1-exp(-0.04*t));
9. 40*cos(0.3*t);
10. 10*sin(5*t)+8*cos(7*t);
11. 10*sin(0.5*t)*sin(10*t);
Вопросы к лабораторной работе:
1. Что такое функция?
2. Что такое аргумент?
3. Что является графическим объектом в работе?
4. Каковы особенности системы координат для экрана ЭВМ?
5. Что означает Math в коде?
6. Какой тип алгоритма удобно использовать для получения последовательности значений аргумента и функции?