Grafica in Java - afisare grafic functii


    Folosindu-ne de clasa "Graphics", utilizand metoda drawLine vom trasa graficul catorva functii matematice mai cunoscute.

  • Graficul functiei sin

        Pentru a trasa graficul unei functii trebuie stabilit domeniul de definitie al variabilei precum si calculul minimului si maximului functiei pe domeniul de definitie ales. Pentru a trasa graficul functiei sinus, vom alege domeniul de definitie al variabilei astfel incat sa aisam cateva perioade de exemplu pentru 3 perioade domeniul de definitie va fi 0-3*2pi. Maximul functiei sinus fiind 1 iar minimul va fi -1. Va trebui sa facem operatia de scalare astfel incat functia sa fie afisata pe in zona dorita de ecran.
        Urmatoarea aplicatie plaseaza traseaza graficul functiei sinus.

        In cazul ca nu se lanseaza aplicatia de sus, pe calculatorul d-voastra trebuie instalat pachetul JDC versiunea JDK6 sau mai recenta.

        Cum se realizeaza aplicatia care traseaza graficul functiei sinus intr-un applet ?
    package Grafice;
    
    
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Rectangle;
    import java.awt.GridBagLayout;
    import javax.swing.JPanel;
    import javax.swing.JApplet;
    import javax.swing.JButton;
    import javax.swing.JLabel;
    import java.awt.Graphics;
    
    public class linii_v1_1 extends JApplet {
    
    	private static final long serialVersionUID = 1L;
    	private JPanel c_panel_1 = null; // panel_1 cu controale plasate
    	private JPanel panel_1 = null; // panoul 1
    	private JLabel etich_1 = null; // eticheta 1
    	private JButton but_1 = null; // butonul 1
    	private Graphics grf=null;
    
    
    	/**
    	 * Aceasta metoda initializeaza: this
    	 * 
    	 * @returneaza  void
    	 */
    	public void init() {
    		this.setSize(350, 300);
    		this.setContentPane(init_panel_1());
    	}
    
    	/**
    	 * Constructorul implicit pentru "linii_v2"
    	 */
    	public linii_v1_1() {
    		super();
    	}
    	   double f(double x) {
    	    	return (Math.sin(x/7) + 2) * getSize().height /5;
    	        }
    	    public void deseneaza() {
    			if(grf==null){
    				grf=panel_1.getGraphics();
    			}
    			grf.clearRect(0, 0, getSize().width, getSize().height);
    	    	grf.setColor(Color.RED);
    	        for (int x = 0 ; x < getSize().width ; x++) {
    		    grf.drawLine(x, (int)f(x), x + 1, (int)f(x + 1));
    	        }
    	    }
    	
    	
    	/**
    	 * 	/**
    	 * Aceasta metoda creaza panelul: "but_1"	
    	 * Returneaza but_1 de tipul:	javax.swing.JButton
    	 */
    	
    	
    	private JButton creaza_but_1() {
    		if (but_1 == null) {
    			but_1 = new JButton();
    			but_1.setBounds(new Rectangle(120, 260, 70, 30));
    			but_1.setText("Start");
    			
    			but_1.addActionListener(new java.awt.event.ActionListener() {
    				public void actionPerformed(java.awt.event.ActionEvent e) {
    					deseneaza();
    					
    				}
    			});
    		}
    		return but_1;
    	}
    
    	/**
    	 * This method initializes jPanel	
    	 * 	
    	 * @return javax.swing.JPanel	
    	 */
    	private JPanel creaza_panel_1() {
    		if (panel_1 == null) {
    			panel_1 = new JPanel();
    			panel_1.setLayout(new GridBagLayout());
    			panel_1.setBounds(new Rectangle(20, 30, 300, 220));
    			// se forteaza culoarea fundalului 
    			this.setBackground(c_panel_1.getBackground());
    		}
    		return panel_1;
    	}
    
    	/**
    	 * Aceasta metoda initializeaza panel_1 plasand controalele dorite 
    	 * Returneaza c_panel_1 de tipul: javax.swing.JPanel 
    	 */
    	
    	
    	private JPanel init_panel_1() {
    		if (c_panel_1 == null) {
    			etich_1 = new JLabel();
    			etich_1.setBounds(new Rectangle(10, 10, 200, 10));
    			etich_1.setText("Apasati butonul Start");
    			c_panel_1 = new JPanel();
    			c_panel_1.setLayout(null);
    			c_panel_1.add(creaza_but_1(), null);
    			c_panel_1.add(etich_1, null);
    			c_panel_1.add(creaza_panel_1(), null);
    			c_panel_1.setLayout(new BorderLayout());
    		}
    		return c_panel_1;
    	}
    }
    
    


        Schimband functia f, cu:

    	   double f(double x) {
    	    	return 110+(Math.cos(x/2) * Math.sin(x/20))* getSize().height/3;
    	        }
    

        Obtinem graficul functiei sinus modulat in amplitudine:


        In urmatoarea aplicatie "linii_v4", vom plasa un slider pentru a modifica perioada functiei sinus.

    package Grafice;
    
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.Rectangle;
    import java.awt.GridBagLayout;
    import javax.swing.JPanel;
    import javax.swing.JApplet;
    import javax.swing.JLabel;
    import javax.swing.JSlider;
    
    public class linii_v4 extends JApplet {
    
    	private static final long serialVersionUID = 1L;
    	private JPanel c_panel_1 = null; 	//panel_1 cu controale plasate
    	private JLabel etich_1 = null; 		// eticheta 1 
    	private JSlider slider_1 = null; 	// slider-ul 1
    	private JPanel panel_1 = null; 		// panoul 1
    	private Graphics g = null;			// grafica
    	/**
    	 * Aceasta metoda initializeaza: this
    	 * 
    	 * @returneaza  void
    	 */
    	public void init() {
    		this.setSize(350,320);
    		this.setContentPane(init_panel_1());
    	}
    
    	/**
    	 * Constructorul implicit pentru "linii_v4"
    	 */
    	public linii_v4() {
    		super();
    	}
    
    	/**
    	 * Aceasta metoda creaza panelul: "panel_1"	
    	 * Returneaza panel_1 de tipul:	javax.swing.JPanel
    	 */
    	private JPanel creaza_panel_1() {
    		if (panel_1 == null) {
    			panel_1 = new JPanel();
    			panel_1.setLayout(new GridBagLayout());
    			panel_1.setBounds(new Rectangle(20, 50, 300, 170));
    
    		}
    		return panel_1;
    	}
    
    	/**
    	 * Aceasta metoda initializeaza panel_1 plasand controalele dorite 
    	 * Returneaza c_panel_1 de tipul: javax.swing.JPanel 
    	 */
    	private JPanel init_panel_1() {
    		if (c_panel_1 == null) {		
    			etich_1 = new JLabel();
    			etich_1.setBounds(new Rectangle(20, 10, 100, 10));
    			etich_1.setText("Afisare functia sinus");
    			
    			creaza_slider_1();
    			slider_1.setBounds(new Rectangle(20, 250, 300, 25));
    			c_panel_1 = new JPanel();
    			c_panel_1.setLayout(null);
    			c_panel_1.add(etich_1, null);
    			c_panel_1.add(creaza_slider_1(), null);
    			c_panel_1.add(creaza_panel_1(), null);
    			c_panel_1.setLayout(new BorderLayout());
    			
    			//this.setBackground(Color.white);
    			//this.setBackground(Color.lightGray);
    			this.setBackground(c_panel_1.getBackground());
    		}
    		return c_panel_1;
    	}
    
    		private double f(double x) {
    	    	return 20+(Math.sin(slider_1.getValue()*x/300) + 1) * getSize().height/5;
    	      }
    
    	/**
    	 * Aceasta metoda initializeaza controlul de tip slider: slider_1
    	 * @returneaza slider_1 de tipul: javax.swing.JSlider	
    	 */
    	private JSlider creaza_slider_1() {
    		if (slider_1 == null) {
    			slider_1 = new JSlider();
    			slider_1.addChangeListener(new javax.swing.event.ChangeListener() {
    				public void stateChanged(javax.swing.event.ChangeEvent e) {
    					etich_1.setText(Integer.toString(slider_1.getValue()));
    					if(g==null){	
    						g= panel_1.getGraphics();
    					}
    			    	g.clearRect(0, 0, getSize().width, getSize().height);
    			    	//g.setColor(Color.RED);
    			    	g.setColor(Color.blue);
    			        for (int x = 0 ; x < getSize().width ; x++) 
    			        {
    			        	g.drawLine(x, (int)f(x), x + 1, (int)f(x + 1));
    			        }
    					
    				}
    			});
    		}
    		return slider_1;
    	}
    }
    


        Obtinem: