В предыдущем примере было рассмотрено графическое представление приложения. Сейчас приступим к алгоритмам.
Все вычисления будут происходить от центральной точки. Весь алгоритм привязан к центральной точке, смещение которой будет приводить к смещению всего графика.
В примере используется метод рисования линий drawLine(). В зависимости от математических функций - просчитываем две точки x1, x2, вернее одну x1, которая идет впереди, x2 всего лишь повторяет x1 но с опозданием на шаг (например для параболы: x1=1/x2=0; x1=4/x2=1; x1=9/x2=4). Все действия проходят через интерфейс ActionListener , который сообщает классу scale какая именно была нажата кнопка, и какое действие следовательно нужно применить.
Класс scale содержит основной алгоритм построения графиков и перемещения по графику.
Все вычисления будут происходить от центральной точки. Весь алгоритм привязан к центральной точке, смещение которой будет приводить к смещению всего графика.
В примере используется метод рисования линий drawLine(). В зависимости от математических функций - просчитываем две точки x1, x2, вернее одну x1, которая идет впереди, x2 всего лишь повторяет x1 но с опозданием на шаг (например для параболы: x1=1/x2=0; x1=4/x2=1; x1=9/x2=4). Все действия проходят через интерфейс ActionListener , который сообщает классу scale какая именно была нажата кнопка, и какое действие следовательно нужно применить.
public class eventbut implements ActionListener{
@Override
public void actionPerformed(ActionEvent arg) {
AbstractButton aButton = (AbstractButton) arg.getSource();
String s=aButton.getText();
scale.positioncenterscale(s);
Graph_26_02.repaintf();
}
}
@Override
public void actionPerformed(ActionEvent arg) {
AbstractButton aButton = (AbstractButton) arg.getSource();
String s=aButton.getText();
scale.positioncenterscale(s);
Graph_26_02.repaintf();
}
}
Класс scale содержит основной алгоритм построения графиков и перемещения по графику.
- public class scale extends JPanel {
- static boolean line=false;
- static boolean parabola=false;
- static boolean hiperbola=false;
- static int centerx=400;
- static int centry=400;
- static int step=15;
- static int step_line=1;
- static int count_step=0;
- static int scale_func=100;
- public void paint(Graphics g){
- System.out.println(step_line);
- gradient_func(g);
- g.setColor(new Color(0,255,0));
- if(line)
- g.drawString("Line", 50, 50);
- if(parabola)
- g.drawString("Parabola", 50, 70);
- if(hiperbola)
- g.drawString("Hiperbolaa", 50, 90);
- scale_div(g);
- if(parabola)
- parabola (g);
- if(hiperbola)
- hiperbola (g);
- if(line)
- line(g);
- graph_border(g);
- } public static void scale_div(boolean arg){
- if(arg){
- step+=5;
- }
- else if (arg==false){
- step-=5;
- }}
- public static void reset(){
- centerx=400;
- centry=400;
- step=5;
- count_step=0;
- scale_func=100;
- }
- public static void positioncenterscale(String arg){
- switch(arg){
- case "zoom +":scale.scale_div(true);scale_func++;break;
- case "zoom -":scale.scale_div(false);scale_func--;break;
- case "<<":centerx+=step;break;
- case ">>":centerx-=step;break;
- case "top":centry+=step;break;
- case "down":centry-=step;break;
- case "vertex -":step_line+=5;break;
- case "vertex +":if(step_line>5)step_line-=5;break;
- case "reset":reset();break;
- case "Line":if(line==true)line=false;else line=true;break;
- case "Parabola":if(parabola==true)parabola=false;else parabola=true;break;
- case "Hiperbola":if(hiperbola==true)hiperbola=false;else hiperbola=true;break;
- }
- }
- public void gradient_func(Graphics g)
- { int gradient=20;
- for(int i=3;i<=797;i++)
- {
- gradient+=(i/6);
- g.setColor(new Color(gradient,gradient,gradient));
- g.drawLine(3,i,796,i);
- gradient=10;
- }
- }
- public void graph_border(Graphics g){
- g.setColor(new Color(255,255,255));
- g.drawLine(0,0,800,0);
- g.drawLine(0,0,0,800);
- g.drawLine(800,0,800,800);
- g.drawLine(0,800,800,800);
- g.setColor(new Color(190,190,190));
- g.drawLine(1,1,799,1);
- g.drawLine(1,1,1,799);
- g.drawLine(799,1,799,799);
- g.drawLine(1,799,799,799);
- g.setColor(new Color(0,0,0));
- }
- public void parabola (Graphics g){
- int x0=0;
- int y0=(x0*x0);
- int x1=1;
- int y1=x1*x1;
- g.setColor(new Color(255,150,150));
- for(;(centry-y1)>=0;)
- {g.drawLine(centerx+x0,centry-y0,centerx+x1,centry-y1);
- g.drawLine(centerx-x0,centry-y0,centerx-x1,centry-y1);
- x0=x1;
- y0=y1;
- x1+=step_line;
- y1=x1*x1/scale_func;}
- }
- public void hiperbola (Graphics g){
- int x0=0;
- int y0=(x0*x0*x0);
- int x1=1;
- int y1=x1*x1*x1;
- g.setColor(new Color(0,255,255));
- for(;(((centry-y1)>=0)||((centry+y1)<=800));)
- {g.drawLine(centerx+x0,centry-y0,centerx+x1,centry-y1);
- g.drawLine(centerx-x0,centry+y0,centerx-x1,centry+y1);
- x0=x1;
- y0=y1;
- x1+=step_line;
- y1=x1*x1*x1/(scale_func*30);}
- }
- public void line (Graphics g){
- int x0=0;
- int y0=x0;
- int x1=1;
- int y1=x1;
- g.setColor(new Color(255,200,255));
- for(int i=0;i<100;i++)
- {g.drawLine(centerx,centry,centerx+x1,centry-y1);
- g.drawLine(centerx,centry,centerx-x1,centry+y1);
- x0=x1;
- y0=y1;
- x1+=100;
- y1=x1;}
- }
- public void scale_div(Graphics g){
- if(step==0)
- step=1;
- g.drawLine(centerx,centry,centerx,0);
- for(int i=0; i<=(centry/step);i++){ g.drawLine(centerx-2,centry-count_step,centerx+2,centry-count_step);
- count_step+=step;
- }
- count_step=0;
- g.drawLine(centerx,centry,800,centry);
- for(int i=0; i<=((800-centerx)/step);i++){
- g.drawLine(centerx+count_step,centry-2,centerx+count_step,centry+2);
- count_step+=step;
- }
- count_step=0;
- g.drawLine(centerx,centry,centerx,800);
- for(int i=0; i<=((800-centry)/step);i++){
- g.drawLine(centerx-2,centry-count_step,centerx+2,centry-count_step);
- count_step-=step;
- }
- count_step=0;
- g.drawLine(centerx,centry,0,centry);//center-left
- for(int i=0; i<=(centerx/step);i++){
- g.drawLine(centerx+count_step,centry-2,centerx+count_step,centry+2);
- count_step-=step;
- }
- count_step=0;
- }
- }
Комментариев нет:
Отправить комментарий