wykres funkcji

0

Napisałem program rysujący wykresy funkcji program działa z tym że dla niektórych funkcji wykres jest postrzępiony i nie wygląda to za ciekawie (wygląda jak by funkcja nie była ciągła)

oto kod mojego programu

import java.awt.*;
import java.applet.*;

public class Figury extends  Applet {
    int width, height;
    public double fodx (double x) {
      double y;
      y = -0.1*(x+1)*(2-x)*(x-5);
          return y;
         }
    public void init () {
       //getContentPane().setLayout(null);
       width = 800;
       height = 600;
       setSize(width, height);
}
    public void paint(Graphics a) {
        a.setColor(new Color(0,0,0));
        a.drawLine (0, height / 2, width, height / 2);
        a.drawLine (width/2, 0, width/2, height);
        
                       int skala_ox;
            int y1 , y2;        
                skala_ox =5;                             
            for(int i=-20; i  < 20; i++){
               y1 = (int) fodx(i);
               y2 = (int) fodx(i+1);
              a.setColor(new Color(255,0,0));
              a.drawLine( i* skala_ox + (width /2 )  , -y1* skala_ox + (height / 2) , i* skala_ox + (width /2 )  , -y2* skala_ox + (height / 2));
        }

}

}

jeśli ktoś się kiedyś spotkał z podobnym problemem lub wie jak go rozwiązać to będę wdzięczny za pomoc
za każdą pomoc ...

0

zmniejsz krok obliczeń poszczególnych punktów, to powinno pomoć. Co prawda będzie dłużej liczyło ale wykres będzie ładniejszy.

0

nie wiem czy o to chodziło ale po zmianie pętli na cos takiego :

	                double i = -20;

			while (i < 20)  {

				y1 = (int) fodx(i);

				y2 = (int) fodx(i+1);

			  	a.setColor(new Color(255,0,0));

				a.drawLine( (int)i* skala_ox + (width /2 )  , -y1* skala_ox + (height / 2) , (int)i* skala_ox + (width /2 )  , -y2* skala_ox + (height / 2));

				i = i + 0.01;

			} 

jest jeszcze gorzej bo zamiast jednego wykresu rysuje mi sie kilka jeden przy drugim i też poprzerywane

0

posiedziałem pokombinowałem i zrobiłem

[code]import java.awt.;
import java.applet.
;

public class Figury extends Applet {

int width, height;

public double fodx (double x) {
	double y ;
	//y = -0.1*(x+1)*(2-x)*(x-5);
	//y = 1/5*x*(x+3)*(2-x)*(x+1);
	//  y=(x+1)/(3*x+6);
	//y = (3*x)/((x*x)-x+1);
	//y = Math.sin(x*Math.PI+100)+20;
	y= (x*x)-(3*x)+5;
	return y ;
	
}

public void init () {
   
   //getContentPane().setLayout(null);
   width = 800;
   height = 600;
   setSize(width, height);

}

public void paint(Graphics a) {
	a.setColor(new Color(0,0,0));
	
	a.drawLine (0, height / 2, width, height / 2);
    a.drawLine (width/2, 0, width/2, height);
	
	
		int skala_ox , zakres;
		double y1 , y2 ,x1 ,x2 ;		
		 //skala_ox = height/((height/2)-(int)fodx(50)) ;
		 zakres = 20;
		 skala_ox =15;	 	
		 					
			x1=(zakres*-1) * skala_ox + (width /2 );	
			y1=(fodx(zakres*-1)) * skala_ox + (height / 2);
	for(int i=zakres*(-1) ; i  < zakres ;i=i+1){
				//y1 = (int) fodx(i);
				y2 =  fodx(i+1)* skala_ox + (height / 2);
			    x2 = i * skala_ox + (width /2 );
			    	a.setColor(new Color(255,0,0));
					//a.drawLine( (i)* skala_ox + (width /2 )  , -y1* skala_ox + (height / 2) , i* skala_ox + (width /2 )  , -y2* skala_ox + (height / 2));
	                 a.drawLine( (int) x1  , (int) y1 , (int) x2  ,(int) y2);
	        	x1= x2;
	        	y1 = y2; 
	}
	a.setColor(new Color(149,197,255));
	a.drawLine(0,(height / 2)-(1*skala_ox), width ,(height / 2) - (1*skala_ox));
	a.drawLine((1*skala_ox) + (width / 2), 0 ,(1*skala_ox) + (width / 2) ,height);
	/*	
		double i = -20;
		while (i < zakres)  {
			y1 = (int) fodx(i);
			y2 = (int) fodx(i+1);
		  	a.setColor(new Color(255,0,0));
			a.drawLine( (int)i* skala_ox + (width /2 )  , -y1* skala_ox + (height / 2) , (int)i* skala_ox + (width /2 )  , -y2* skala_ox + (height / 2));
			i = i + 0.01;
		} 
	*/

}
}[/code]

nie będę tłumaczył jak działa bo nie ot ot chodzi samemu można wywnioskować
program zamieszczam bo może sie to komuś przydać
gdyby ktoś wykorzystał i ulepszył po drodze to moja prośba to takiej osoby niech napisze co zostało ulepszone

0

Witaj
A wiesz moze jak umiescic skale na osiach i opis osi?Bo kazdy normalny wykres takei cos ma.Pozdrawiam

0

jakaś tam klaska napisana przy okazji laborek z Numerków:

class Panelek extends JPanel{//rozszerzona klasa panelu, na nim jest rysowany wykres funkcji
		double xPos,x1;
		double yPos,y1;
		int skala=10; //skala wykresu, zwiekszajac/zmniejszajac ta warosc przyblizamy/oddalamy wykres
		
		private double krok=0.1;//krok co jaki rysowany jest wykres
		
		public void paint(Graphics g){
			super.paint(g);
			setBackground(Color.BLACK);
			try{
			g.setColor(Color.white);//osie wspolrzednych
			g.drawLine(0,getHeight()/2,getWidth(),getHeight()/2);
			g.drawLine(getWidth()/2,0,getWidth()/2,getHeight());
			
						
			g.setColor(Color.blue);//wykres f-cji
			xPos=-300;
			yPos=policzWartosc(xPos);//policzWartosc() to oczywiscie jakaś tam funkcja licząca wartość f-cji y, w p-cie x
			//System.out.println(getWidth()/10+" "+getHeight()/10+"\n");	
			for(int i=0;i<6000;i++) {
				
				x1=xPos;
				y1=yPos;
				
				xPos+=krok;
				yPos=policzWartosc(xPos);
				g.drawLine((int)( (getWidth()/2) +(x1*skala) ),
			          (int)( (getHeight()/2) -(y1*skala) ),
			          (int)( (getWidth()/2) +(xPos*skala) ),
			          (int)( (getHeight()/2) -(yPos*skala)));
			}
			
			}catch(NullPointerException x){}
		}
	}

pzdr.

0

No tak,ale ciagle nie ma opisu osi wspolrzednych.?Moze ktos wie jak umiescic opis osi wspolrzendych i skale na osiach,by wartosci byly widoczne,np w srodku ukladu wspolrzednych by bylo 0 i itp.Bo tak to sa gole osie i brak jakiegokolwiek opisu,nie wiadomo czego to jest wykres.Prosze o podpowiedz jak to zrobic,pozdrawiam

0

ja mam cos takiego do opisu osi ale opisuje od 1

public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D)g;
        g2.setColor(Color.RED);
        //rysowanie osi X i Y
        g2.drawLine(25,10,25,getHeight()-25);
        g2.drawLine(25,getHeight()-25, getWidth()-10,getHeight()-25);
        //rysowanie strzałek
        g2.drawLine(20,18,25,10);
        g2.drawLine(25,10,29,18);
        g2.drawLine(getWidth()-14,getHeight()-29,getWidth()-10,getHeight()-25);
        g2.drawLine(getWidth()-14,getHeight()-21,getWidth()-10,getHeight()-25);
        //rysowanie podziałki wraz z opisem
        int k=1;
        for(int i=getHeight()-45;i>20;i-=20)
        {
            g2.drawString(java.lang.Integer.toString(k++),7,i+5);
            g2.drawLine(23,i,27,i);
        }
        k=1;
        for(int i=45;i<getWidth()-20;i+=20)
        {
            g2.drawString(java.lang.Integer.toString(k++),i-5,getHeight()-10);
            g2.drawLine(i,getHeight()-27,i,getHeight()-
        }
    }

1 użytkowników online, w tym zalogowanych: 0, gości: 1