Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> График Функции 
:(
    Опции темы
Pavelll
Дата 13.2.2011, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 18.1.2011

Репутация: нет
Всего: нет



Здравствуйте, помогите разобраться с кодом.  

У меня есть функция затухающих колебаний:
X в пределах[0,10]
Y(x)= 10*e "в степени"-x/4 "и умножить" *cos(3x)
Y(x)= 10*e "в степени"-x/4
Y(x)= -10*e "в степени"-x/4

Самую первую написал функцию: d.add(10*Math.exp(-x/4)*Math.cos (3*x));
но она как то некорректно отображается( слишком резкие переходы у волны).
И как остальные 2 функции дописать в код? Если не сложно помогите?
Среда  NetBeans
 
Код

package lab2test2;
import java.awt.Color;
import java.awt.Graphics;
import java.util.Iterator;
import java.util.Vector;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Main extends JFrame {
    private GraphPanel g;

   public Main()
   {
       Vector<Double> d = new Vector<Double>();

      // Заполняем вектор данными - например для функции
      for (int x = 0; x <= 10; x++) {
            d.add(10*Math.exp(-x/4)*Math.cos (3*x));

      }
    

      g = new GraphPanel(d);
    

      getContentPane().add(g);
      setBounds(300, 300, 500, 500);
   }
    /** Creates a new instance of TG */


    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
       Main t = new Main();
      t.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      t.setVisible(true);
    }

}
class GraphPanel extends JPanel {
    private Vector<Double> data;

    public GraphPanel(Vector<Double> data) {
        this.data = data;
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);

        // максимальная ширина графика - 10
        // максимальная высота = 1, минимальная = -1
        // Вычисляем коэффициенты

        double Kx = getWidth() / 11.0;
        double Ky = getHeight() / 11.0;

        double xo = -1;
        double yo = -1;
        double x = 0;
        for (Iterator<Double> it = data.iterator(); it.hasNext();) {
            double y = it.next().doubleValue();

            // Рисование начинаем для второй точки
            if (xo >= 0.0) {
                int x1 = (int) ((xo + 1) * Kx);
                int x2 = (int) ((x + 1) * Kx);
                // Учитываем, что координаты идут сверху вниз и максимальное число = 1
                int y1 = (int) (getHeight() - (yo + 5) * Ky);
                int y2 = (int) (getHeight() - (y + 5) * Ky);
                g.drawLine(x1, y1, x2, y2);
            }

            xo = x;
            yo = y;
            x += 1;
        }
    }
}


Результат должен быть как на картинке, но у меня пока только волна колебаний нарисована, та  что по средине.
user posted image

PM MAIL   Вверх
dorogoyIV
Дата 14.2.2011, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

Репутация: 36
Всего: 46



средняя линия будет угловатой - функция такая

Код

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Test extends JFrame
{
 public Test()
 {
  setDefaultCloseOperation(3);
  setBounds(100, 100, 400, 300);
  setLayout(null);

  MyPanel panel = new MyPanel(30, 3);
  panel.setBounds(10, 10, 400, 300);
  add(panel);
 }

 public static void main(String [] args)
 {
  SwingUtilities.invokeLater(new Runnable()
  {
   public void run()
   {
    new Test().setVisible(true);
   }
  });
 }
}

class MyPanel extends JPanel
{
 int scaleX, scaleY;
 int shiftY = 100;
 int length = 10;

 MyPanel(int scaleX, int scaleY)
 {
  setLayout(null);
  this.scaleX = scaleX;
  this.scaleY = scaleY;

  int [] y1 = new int [length];
  int [] y2 = new int [length];
  int [] y3 = new int [length];

  for(int i = 0; i < length; i++)
  {
   y1 [i] = (int)Math.round(func1(i));
   y2 [i] = (int)Math.round(func2(i));
   y3 [i] = (int)Math.round(func3(i));
  }

  MyLine ml1 = new MyLine(y1, scaleX, scaleY, shiftY);
  MyLine ml2 = new MyLine(y2, scaleX, scaleY, shiftY);
  MyLine ml3 = new MyLine(y3, scaleX, scaleY, shiftY);

  Rectangle r = new Rectangle(10, 10, scaleX * length, scaleY * 100);
  ml1.setBounds(r);
  ml2.setBounds(r);
  ml3.setBounds(r);

  add(ml1);
  add(ml2);
  add(ml3);
 }

 public void paintComponent(Graphics g)
 {
  Rectangle rect = getBounds();

  g.drawLine(0, shiftY + rect.y, scaleX * 10, shiftY + rect.y);
  g.drawLine(0, rect.y, 0, (rect.y + shiftY) * 2);

  for(int i = 0; i < length; i += 2)
   g.drawString(i + "", i * scaleX, 110);
 }

 private double func1(double x)
 {
  return 10 * Math.exp(-x / 4) * Math.cos(3 * x) * scaleY;
 }

 private double func2(double x)
 {
  return 10 * Math.exp(-x / 4) * scaleY;
 }

 private double func3(double x)
 {
  return -10 * Math.exp(-x / 4) * scaleY;
 }
}

class MyLine extends JComponent
{
 int [] y;
 int scaleX, scaleY, shift;

 MyLine(int [] y, int scaleX, int scaleY, int shift)
 {
  this.y = y;
  this.scaleX = scaleX;
  this.scaleY = scaleY;
  this.shift = shift;
 }

 public void paintComponent(Graphics g)
 {
  Graphics2D g2 = (Graphics2D)g;
  g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                      RenderingHints.VALUE_ANTIALIAS_ON);

  for(int i = 0; i < y.length - 1; i++)
  {
   g2.drawLine(i * scaleX, y [i] * scaleY + shift,
               (i + 1) * scaleX, y [i + 1] * scaleY + shift);
  }
 }
}

PM MAIL   Вверх
Pavelll
Дата 14.2.2011, 23:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 18.1.2011

Репутация: нет
Всего: нет



dorogoyIV, спасибо за помощь, как раз то что нужно. А в принципе возможно как то поправить эту угловатость, или это уже чисто проблема мат. функции и её нужно подправить?

Это сообщение отредактировал(а) Pavelll - 14.2.2011, 23:57
PM MAIL   Вверх
Pavelll
Дата 15.2.2011, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 18.1.2011

Репутация: нет
Всего: нет



Вот типа получилось такого, нормально график рисует уже, ток кто знает помогите координати построить, что бы они отображались правильно, пока что  в коне нету никаких координат. 
Код

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import javax.swing.JFrame;
import javax.swing.JPanel;

/**
 *
 *
 */
public class Main {

    public static final double WIDTH = 400;

    public static final double HEIGHT = 400;

    public static void main(String[] args) {
        new GraphFrame().setVisible(true);
    }

}

class GraphFrame extends JFrame {

    public GraphFrame() {
        super();
        setBounds(200, 200, (int) Main.WIDTH, (int) Main.HEIGHT);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        getContentPane().add(new GraphPanel());
    }

}

class GraphPanel extends JPanel {

    private static final double SCALE_X = 20;

    private static final double SCALE_Y = 15;

    public GraphPanel() {
        super();
    }

    @Override
    public void paint(Graphics grphcs) {
        super.paint(grphcs);
        Graphics2D g2 = (Graphics2D) grphcs;
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        drawGraph(g2);
    }

    private void drawGraph(Graphics2D g2) {
        double lastX = 0;
        double lastY1 = Main.HEIGHT / 2;
        double lastY2 = Main.HEIGHT / 2;
        double lastY3 = Main.HEIGHT / 2;
        for (int x = 1; x <= Main.WIDTH; x++) {
            double y1 = Main.HEIGHT / 2 - func1(x / SCALE_X) * SCALE_Y;
            double y2 = Main.HEIGHT / 2 - func2(x / SCALE_X) * SCALE_Y;
            double y3 = Main.HEIGHT / 2 - func3(x / SCALE_X) * SCALE_Y;
            g2.drawLine((int)lastX, (int)lastY1, (int)x, (int)y1);
            g2.drawLine((int)lastX, (int)lastY2, (int)x, (int)y2);
            g2.drawLine((int)lastX, (int)lastY3, (int)x, (int)y3);
            lastX = x;
            lastY1 = y1;
            lastY2 = y2;
            lastY3 = y3;
        }
    }

    private double func1(double x) {
        return 10 * Math.exp(-x / 4) * Math.cos(3 * x);
    }

    private double func2(double x) {
        return 10 * Math.exp(-x / 4);
    }

    private double func3(double x) {
        return -10 * Math.exp(-x / 4);
    }
}


Это сообщение отредактировал(а) Pavelll - 15.2.2011, 16:15
PM MAIL   Вверх
aleksandy
Дата 16.2.2011, 07:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 260
Регистрация: 17.12.2006

Репутация: 1
Всего: 5



Добавь
Код

    private void drawGrid(Graphics2D g2) {
        int dx, dy;
        dx = dy = 10;
        Color c = g2.getColor(); // save color
        final int W = getWidth();
        final int H = getHeight();
        g2.setColor(Color.BLUE);
        for (int x = 0; x < W; x += dx) {
            g2.drawLine(x, 0, x, H);
        }
        for (int y = 0; y < H; y += dy) {
            g2.drawLine(0, y, W, y);
        }
        g2.setColor(c); // restore color
    }

Измени 
Код
    @Override
    public void paint(Graphics grphcs) {
        super.paint(grphcs);
        Graphics2D g2 = (Graphics2D) grphcs;
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        drawGrid(g2);
        drawGraph(g2);
    }


А вообще, если не принципиальна собственная реализация, то в SwingX есть компонента JXGraph.

Это сообщение отредактировал(а) aleksandy - 16.2.2011, 07:50
PM   Вверх
Pavelll
Дата 16.2.2011, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 18.1.2011

Репутация: нет
Всего: нет



Не я говорю не про сетку, а про оси координат Х и У с метрикой. Я их пробовал рисовать, но отображаются неправильно. Но за сетку отдельное спасибо, я ее тоже думал сделать.

PM MAIL   Вверх
aleksandy
Дата 17.2.2011, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 260
Регистрация: 17.12.2006

Репутация: 1
Всего: 5



Делов-то
Код

    private void drawAxis(Graphics2D g2) {
        Color c = g2.getColor(); // save color
        final int W = getWidth();
        final int H = getHeight();

        g2.setColor(Color.RED);
        g2.drawLine(0, 0, 0, H);
        g2.drawLine(0, 0, 3, 5);
        g2.drawLine(0, 0, -3, 5);

        int y = H / 2;
        g2.drawLine(0, y, W, y);
        g2.drawLine(W, y, W - 5, y - 3);
        g2.drawLine(W, y, W - 5, y + 3);

        g2.setColor(c); // restore color
    }

PM   Вверх
Pavelll
Дата 17.2.2011, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 18.1.2011

Репутация: нет
Всего: нет



Оно, Спасибо.
PM MAIL   Вверх
Pavelll
Дата 17.2.2011, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 18.1.2011

Репутация: нет
Всего: нет



Вот ещё фишка такая,  я в код кнопки и меню добавил, и ось Х в верх поплыла, после запуска  можно окно немного растянуть в низ тогда ось на место станет, но всё же. Пробовал фрейм увеличить, не помогает ось остается там где и была.  Я её пробовал в низ окна полностью опустить, так тоже пойдет, ну её тогда еле видно. как её можно на место поставить что бы по центру она была?
Код

 import java.awt.BorderLayout;
      import java.awt.Color;
      import java.awt.FlowLayout;
      import java.awt.Graphics;
      import java.awt.Graphics2D;
      import java.awt.RenderingHints;
      import java.awt.event.ActionEvent;
      import java.awt.event.ActionListener;

      import javax.swing.JButton;
      import javax.swing.JFrame;
      import javax.swing.JMenu;
      import javax.swing.JMenuBar;
      import javax.swing.JMenuItem;
      import javax.swing.JPanel;

     
      public class Main {

       public static final double WIDTH = 400;

       public static final double HEIGHT = 400;

       public static void main(String[] args) {
           new GraphFrame().setVisible(true);
       }

      }

      class GraphFrame extends JFrame {

       public GraphFrame() {
           super();
           setBounds(200, 200, (int) Main.WIDTH, (int) Main.HEIGHT);
           setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
           setLayout(new BorderLayout());
           final GraphPanel gp = new GraphPanel();

           JMenuBar mb = new JMenuBar();

           JMenu graph = new JMenu("Graphic");

           JMenuItem paint = new JMenuItem("Paint");
           paint.addActionListener(new ActionListener(){
               public void actionPerformed(ActionEvent e) {
                   gp.dieGraph(false);
               }
             });
           graph.add(paint);
           JMenuItem reset = new JMenuItem("Reset");
           reset.addActionListener(new ActionListener(){
               public void actionPerformed(ActionEvent e) {
                   gp.dieGraph(true);
               }
               });
           graph.add(reset);

           mb.add(graph);
           add(mb,BorderLayout.NORTH);


           add(gp, BorderLayout.CENTER);

           JPanel buttons = new JPanel(new FlowLayout());
           JButton b = new JButton("Paint default");
           b.addActionListener(new ActionListener(){
             public void actionPerformed(ActionEvent e) {
                 gp.dieGraph(false);
             }
           });

           JButton r =  new JButton("Reset");
           r.addActionListener(new ActionListener(){
             public void actionPerformed(ActionEvent e) {
                 gp.dieGraph(true);
             }
             });
           buttons.add(b);
           buttons.add(new JButton("Paint"));
           buttons.add(r);
           add(buttons, BorderLayout.SOUTH);
       }

      }

      class GraphPanel extends JPanel {

       private static final double SCALE_X = 20;

       private static final double SCALE_Y = 15;

       private boolean die = false;

       public GraphPanel() {
           super();
       }

        @Override
       public void paint(Graphics grphcs) {
           super.paint(grphcs);
           Graphics2D g2 = (Graphics2D) grphcs;
           g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
           drawGrid(g2);
           drawAxis(g2);
           if(!die) drawGraph(g2);
       }
         private void drawAxis(Graphics2D g2) {
        Color c = g2.getColor(); // save color
        final int W = getWidth();
        final int H = getHeight();
        g2.setColor(Color.RED);
        g2.drawLine(0, 0, 0, H);
        g2.drawLine(0, 0, 3, 5);
        g2.drawLine(0, 0, -3, 5);
        int y = H / 2;
        g2.drawLine(0, y, W, y);
        g2.drawLine(W, y, W - 5, y - 3);
        g2.drawLine(W, y, W - 5, y + 3);
        g2.setColor(c); // restore color
    }

       public void dieGraph(boolean die){
          this.die = die;
          repaint();
       }

       private void drawGrid(Graphics2D g2) {
           int dx, dy;
           dx = dy = 20;
           Color c = g2.getColor(); // save color
           final int W = getWidth();
           final int H = getHeight();
           g2.setColor(Color.GREEN);
           for (int x = 0; x < W; x += dx) {
               g2.drawLine(x, 0, x, H);
           }
           for (int y = 0; y < H; y += dy) {
               g2.drawLine(0, y, W, y);
           }
           g2.setColor(c); // restore color
       }


       private void drawGraph(Graphics2D g2) {
           double lastX = 0;
           double lastY1 = Main.HEIGHT / 2;
           double lastY2 = Main.HEIGHT / 2;
           double lastY3 = Main.HEIGHT / 2;
           for (int x = 1; x <= Main.WIDTH; x++) {
               double y1 = Main.HEIGHT / 2 - func1(x / SCALE_X) * SCALE_Y;
               double y2 = Main.HEIGHT / 2 - func2(x / SCALE_X) * SCALE_Y;
               double y3 = Main.HEIGHT / 2 - func3(x / SCALE_X) * SCALE_Y;
               g2.drawLine((int)lastX, (int)lastY1, (int)x, (int)y1);
               g2.drawLine((int)lastX, (int)lastY2, (int)x, (int)y2);
               g2.drawLine((int)lastX, (int)lastY3, (int)x, (int)y3);
               lastX = x;
               lastY1 = y1;
               lastY2 = y2;
               lastY3 = y3;
           }
       }

       private double func1(double x) {
           return 10 * Math.exp(-x / 4) * Math.cos(3 * x);
       }

       private double func2(double x) {
           return 10 * Math.exp(-x / 4);
       }

       private double func3(double x) {
           return -10 * Math.exp(-x / 4);
       }
      }


Это сообщение отредактировал(а) Pavelll - 17.2.2011, 21:21
PM MAIL   Вверх
PhoenixX
  Дата 18.2.2011, 01:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 18.2.2011

Репутация: нет
Всего: нет



Народ, те же яйца, тока формулы у меня другие :(

Епициклоида: t в промежутке от 0 до 2pi
X(t)=8*cos(t)-2*cos(4*t)
Y(t)=8*sin(t)-2*sin(4*t)
R(a)=6.

user posted image

Формулы составил, саму прогу (скелет) написал, а как прикрутить одно к другому (чтоб рисовало и работало...) не получается(((
Подсобите новичку пожалуйста smile 

Присоединённый файл ( Кол-во скачиваний: 7 )
Присоединённый файл  1.jpg 30,76 Kb
PM MAIL   Вверх
Pavelll
Дата 20.2.2011, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 18.1.2011

Репутация: нет
Всего: нет



Так что с координатами можно сделать то подскажите? 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   jk1
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема »


 




[ Время генерации скрипта: 0.1522 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.