Задание:
Создать апплет в соответствие с индивидуальным заданием.
Задачи 1 – 5 предусматривают моделирование физических закономерностей. В апплете должна быть предусмотрена возможность ввода параметров. В качестве выходных данных должны быть представлены схема взаимодействия и анимация, демонстрирующая результаты вычислений при заданных параметрах.
- Построение графиков простейших функций
Возможные функции представлены списком. При выборе функции из списка появляются поля ввода параметров этой функции. Должна быть предусмотрена возможность вывода суммы двух выбранных пользователем функций.
Выполнение:
Для создания апплета необходимо создать html страницу, в которой будет присутствовать тег:
1 2 |
<applet code=<имя файла апплета> width=<ширина> height=<высота>> </applet> |
У тега applet на самом деле очень много различных параметров, но самые основные перечисленные выше.
Затем необходимо написать на Java сам код апплета.
При написании апплета необходимо учитывать, что главный класс апплета необходимо наследовать от класса Applet. Также главным методом (методом, вызывающимся при старте будет) не метод main, а метод init и его уже не нужно делать статическим.
Проектирование интерфейса:
Необходимо выбирать функцию из списка. Также должна быть возможность вывода суммы двух выбранных пользователем функций. Проще всего для вывода суммы сделать для второй функции отдельный список возможных функций. Но тогда возникает такая проблема, что нужно каким-то образом выводить не только сумму, но и просто одну функцию. Можно, конечно, сделать переключатель, но проще в список функций вставить нулевую функцию (то есть результат которой всегда будет равен 0),
Для ввода параметров функции лучше всего подойдут текстовый поля TextField (они для простоты дальнейшего программирования загнаны в массив, причём отдельный массив для первой функции из суммы и для второй).
Написание программы
Написание программы достаточно просто. Все текстовые представления функций, которыми потом заполняются списки хранятся в массиве. При выборе функции из списка в процедуре обработки событий public Boolean handleEvent(Event evt) в зависимости от функции делаются видимыми определённое количество надписей и текстовых полей. Туда будут вводиться параметры.
При нажатии кнопки «Нарисовать график» с помощью getGraphics() получаем объект типа Graphics. На этом объекте и будет происходить рисование графика и разметочной сетки. затем в зависимости от выбранных функций в списках (а точнее по их индексам) и параметрам в текстовых полях (естественно, их предварительно нужно считать и преобразовать из строки в числа). Сначало его необходимо очистить (закрасить белым прямоугольником) и нарисовать сетку.
Затем выполняется вычисление значения суммы двух функций в зависимости от x им вывод графика на экран. Для вычисления значения одной функции был оформлен метод
1 |
public double calculateFunction(int Func, double x, double v[]) |
В этот метод в качестве параметра Func передаётся номер функции из массива текстовых представлений функций. С помощью switch по различным номерам функций выполняется вычисление результирующего значения в точке x у функции с параметрами, переданными в массиве v.
Исходные коды программы:
lab2.html:
1 2 |
<applet code="Lab2" width=640 height=480> </applet> |
Lab2.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 |
import java.awt.*; import java.applet.*; public class Lab2 extends Applet { Choice chFunc1=new Choice(); Choice chFunc2=new Choice(); int GraphicTop=200; int GraphicHeight=480-200; int GraphicWidth=640; double GraphicSizerX=40; double GraphicSizerY=40; int MAX_PARAMS=4; TextField tfFunc1Params[]=new TextField[MAX_PARAMS]; Label lblFunc1Params[]=new Label[MAX_PARAMS]; Button btnDrawGraphic=new Button("Нарисовать график"); Label lblAdd=new Label("+",Label.LEFT); TextField tfFunc2Params[]=new TextField[MAX_PARAMS]; Label lblFunc2Params[]=new Label[MAX_PARAMS]; int MAX =MAX_PARAMS; String strFuncs[]= new String[MAX]; public void init() { setLayout(null); strFuncs[0]="0"; strFuncs[1]="v0*sin(v1*x+v2)"; strFuncs[2]="v0*cos(v1*x+v2)"; strFuncs[3]="v0*log v1 (v2*x+v3)"; createFunctionsChoice(chFunc1,10,10,100,30); createFunctionsChoice(chFunc2,300,10,100,30); for (int n=0; n<MAX_PARAMS; n++) { tfFunc1Params[n]=new TextField(8); tfFunc1Params[n].setVisible(false); tfFunc1Params[n].reshape(10+n*60, 80, 50, 30); tfFunc1Params[n].setText("0.0"); add(tfFunc1Params[n]); lblFunc1Params[n]=new Label("v"+n,Label.LEFT); lblFunc1Params[n].setVisible(false); lblFunc1Params[n].reshape(10+n*60,40,50,30); add(lblFunc1Params[n]); tfFunc2Params[n]=new TextField(8); tfFunc2Params[n].setVisible(false); tfFunc2Params[n].reshape(300+n*60, 80, 50, 30); tfFunc2Params[n].setText("0.0"); add(tfFunc2Params[n]); lblFunc2Params[n]=new Label("v"+n,Label.LEFT); lblFunc2Params[n].setVisible(false); lblFunc2Params[n].reshape(300+n*60,40,50,30); add(lblFunc2Params[n]); } lblAdd.reshape(250,10,40,30); add(lblAdd); btnDrawGraphic.reshape(150,120,200,30); add(btnDrawGraphic); } public void createFunctionsChoice(Choice chFunc, int x,int y,int width, int height) { for (int n=0; n<MAX;n++) chFunc.addItem(strFuncs[n]); add(chFunc); chFunc.reshape(x,y,width,height); } public void start() { } public void paint(Graphics g) { } public void setCountParams(Choice chFunc, TextField tfFuncParams[], Label lblFuncParams[]) { int CountParams=0; switch (chFunc.getSelectedIndex()) { case 0: CountParams=0; break; case 1: case 2: CountParams=3; break; case 3: CountParams=4; break; } for (int n=0; n<CountParams;n++) { tfFuncParams[n].setVisible(true); lblFuncParams[n].setVisible(true); } for (int n=CountParams; n<MAX_PARAMS; n++) { tfFuncParams[n].setVisible(false); lblFuncParams[n].setVisible(false); } } public boolean handleEvent(Event evt) { if (evt.target== chFunc1) { setCountParams(chFunc1,tfFunc1Params,lblFunc1Params); } if (evt.target == chFunc2) { setCountParams(chFunc2,tfFunc2Params,lblFunc2Params); } if (evt.target == btnDrawGraphic) { double vf1[]= new double[MAX_PARAMS]; for (int n=0; n<MAX_PARAMS; n++) { try{ vf1[n]=Double.parseDouble(tfFunc1Params[n].getText()); }catch (NumberFormatException e) {vf1[n]=0; } } double vf2[]= new double[MAX_PARAMS]; for (int n=0; n<MAX_PARAMS; n++) { try{ vf2[n]=Double.parseDouble(tfFunc2Params[n].getText()); }catch (NumberFormatException e) {vf2[n]=0; } } int x1=0,x2=0,y1=0,y2=0; Graphics g=getGraphics(); int f1=chFunc1.getSelectedIndex(), f2=chFunc2.getSelectedIndex(); drawNet(g); g.setColor(Color.green); for (double x=-100; x<200; x+=0.1) { double y=calculateFunction(f1,x,vf1)+calculateFunction(f2,x,vf2); int ycenter=GraphicTop+GraphicHeight/2; int xcenter=GraphicWidth/2; x2=xcenter+(int)(x*GraphicSizerX); y2=ycenter-(int)(y*GraphicSizerY); g.drawLine(x1,y1,x2,y2); x1=x2; y1=y2; } } return false; } public double calculateFunction(int Func,double x,double v[]) { switch (Func) { case 0: return 0.0; case 1: return v[0]*Math.sin(v[1]*x+v[2]); case 2: return v[0]*Math.cos(v[1]*x+v[2]); case 3: return v[0]*Math.log(v[2]*x+v[3])/Math.log(v[1]); } return 0.0; } public void drawNet(Graphics g) { g.setColor(Color.white); g.fillRect(0,GraphicTop,GraphicWidth,GraphicHeight); g.setColor(Color.lightGray); int xcenter=GraphicWidth/2; int ycenter=GraphicTop+GraphicHeight/2; for (int x=0; x<xcenter;x+=GraphicSizerX) { g.drawLine(xcenter+x,GraphicTop,xcenter+x,GraphicTop+GraphicHeight); g.drawLine(xcenter-x,GraphicTop,xcenter-x,GraphicTop+GraphicHeight); g.drawString(String.valueOf(x/GraphicSizerX),xcenter+x,ycenter); g.drawString(String.valueOf(-x/GraphicSizerX),xcenter-x,ycenter); } for (int y=0; y<GraphicHeight/2; y+=GraphicSizerY) { g.drawLine(0,ycenter+y,GraphicWidth,ycenter+y); g.drawLine(0,ycenter-y,GraphicWidth,ycenter-y); g.drawString(String.valueOf(y/GraphicSizerY),xcenter,ycenter-y); g.drawString(String.valueOf(-y/GraphicSizerY),xcenter,ycenter+y); } g.setColor(Color.black); g.drawLine(0,ycenter,GraphicWidth,ycenter); g.drawLine(xcenter,GraphicTop,xcenter,GraphicTop+GraphicWidth); } } |
Вывод:
Java позволяет достаточно простым способом создавать апплеты.