Категории:

  • Программирование


  • Изобразительное искусство


  • Программирование встраиваемых систем


  • Компьютерная графика


  • WEB Разработка


  • Музыка


  • Инженерия


  • iVARIOUS


  • Mobil App


  • Java. Графики функций - продолжение

    Java В предыдущем примере было рассмотрено графическое представление приложения. Сейчас приступим к алгоритмам.
    Все вычисления будут происходить от центральной точки. Весь алгоритм привязан к центральной точке, смещение которой будет приводить к смещению всего графика.
    В примере используется метод рисования линий 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();
    }
    }

    Класс 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;
    }
    }



    Читайте больше в категории: Программирование

    2016-04-16 19:37:54



    Другие статьи:

    Android. Введение

    Ужгородський Кафедральний Собор в 19 ст. ( 3D )

    Maya. Нормали и Системы координат

    WinAPI. Алгоритм построения графиков функций.

    STM32. Режим альтернативной функции

    Java. Создание графических приложений

    PHP. $_COOKIE

    Android. Intent

    Maya. Карта рельефа Bump

    STM32. ADC (АЦП). Пример кода