Wykresy w JAVIE... maly problem

0

Czesc mam maly problem z przeskalowaniem wykresu w Javie. Otoz sytuacja jest taka, jesli chodzi o metode rysujaca funkcje liniowa to niebylo problemu z przeskalowaniem poniewaz wystarczylo wykres tylko odpowiednio przesunac, natomiast problem pojawia sie przy funkcji kwadratowej.
Logika dzialania jest taka:

Metoda drawSquareFunction generuje kolejne pary punktow (x,y) i te pary zapisuje w tablicach tx[], ty[], nastepnie jest polaczenie punktow w petli za pomoca metody drawLine. Wszystko jest ok dopoki nie chce zmienic skali wykresu aby jednastka nie byly pojedyncze piksele tylko np.: 10px. W momecie gdy przeskaluje kolejne punkty x10, y10 to mimo wszystko narysowane jest ale problemem jest ten wierzcholek paraboli ktory wyglada troche "trojkatnie". Wrzucam kod, jesli ktos posiada namiary na jakies bibioteki do rysowania wykresow albo ma pomysl jak rozwiazc ten problem to prosze o pomoc :)

Klasa WykresLabel.java

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;

import javax.swing.JLabel;


public class WykresLabel  extends JLabel {
	

	public void paintComponent(Graphics g)
	{
		Graphics2D g2 = (Graphics2D) g;
		drawUklad(g2);

		drawSquareFunction(g2, 2, 0, -1, 10);
	};
	/*
	 * a - wspolczynnik przy x,
	 * b - wyraz wolny
	 */
	public void drawLinearFunction(Graphics2D g2, int a, int b, int scale)
	{
		int x=0;
		int y=0;
		for(int i=x; i<390; ++i)
		{
				y=(-a)*i+(-b*scale);
				g2.drawLine(i+SYNCHRO_X, y+SYNCHRO_Y, i+SYNCHRO_X, y+SYNCHRO_Y);
			
		}
		for(int i=x; i>-390; --i)
		{
				y=(-a)*i+(-b*scale);
				g2.drawLine(i+SYNCHRO_X, y+SYNCHRO_Y, i+SYNCHRO_X, y+SYNCHRO_Y);
			
		}
		
	}
	
	public void drawSquareFunction(Graphics2D g2, int a, int b, int c, int scale)
	{
		int x=0;
		int y=0;
		int[] tx = new int[390];
		int[] ty = new int[390];
		int step=0;

		for(int i=x; i<390; ++i)
		{
			y = (-a)*i*i + (-b)*i + (-c);
			tx[step]=i*scale+SYNCHRO_X; //zapisanie pktow w tablicy
			ty[step]=y*scale+SYNCHRO_Y;
			++step;

		}
		for(int i=0; i<389; i++)
		{
			g2.drawLine(tx[i], ty[i], tx[i+1], ty[i+1]); // laczenie pktow z tablic
		}
		step=0;
		
		for(int i=x; i>-390; --i)
		{
			y = (-a)*i*i + (-b)*i + (-c);
			tx[step]=i*scale+SYNCHRO_X; // dla drugiego ramienia to samo
			ty[step]=y*scale+SYNCHRO_Y;
			++step;
			
		}
		for(int i=0; i<389; i++)
		{
			g2.drawLine(tx[i], ty[i], tx[i+1], ty[i+1]);
		}
	}
	
	
	/*
	 * Rysuje uklad wspolrzednych
	 */
	public void drawUklad(Graphics2D g2)
	{
		g2.setColor(Color.BLUE);
		for(int i=0; i<800; i++)
		{
			if(i%10==0)
			{
				drawMarkOnX(g2,i);
			}
			g2.drawLine(i, 300, i, 300);
		}
		for(int i=0; i<600; i++)
		{
			if(i%10==0)
			{
				drawMarkOnY(g2,i);
			}
			g2.drawLine(400,i, 400, i);
		}
		g2.setColor(Color.BLACK);
	}
	/*
	 * metoda pomocnicza do rysowania podzialki na osi X
	 */
	private void drawMarkOnX(Graphics2D g2, int x)
	{
		g2.drawLine(x,297,x,303);
	}
	/*
	 * metoda pomocnicza do rysowania podzialki na osi Y
	 */
	private void drawMarkOnY(Graphics2D g2, int y)
	{
		g2.drawLine(397,y,403,y);
	}
	private static final long serialVersionUID = 1L;
	private final int SYNCHRO_X = 400; //przesuniecie ukladu na srodek
	private final int SYNCHRO_Y = 300;


}

Klasa Main.java

import java.awt.EventQueue;

import javax.swing.JFrame;


public class Main {
	
	public static void main(String[] a)
	{
		EventQueue.invokeLater(new Runnable()
		{
			@Override
			public void run() {
				Ramka r = new Ramka();
				r.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
				r.setVisible(true);
				
			}
			
		});
	}

}


class Ramka extends JFrame
{
	public Ramka()
	{
		setSize(800,600);
		w = new WykresLabel();
		this.add(w);
		
	}
	
	private WykresLabel w;
}
0

Użyj JFreeChart. Co do skalowania to jeżeli zmieniasz skalę to musisz też zwiększyć gradację obliczeń. Innymi słowy jeżeli masz punkty A(x1,y1) i B(x2,y2) to musisz obliczyć jeszcze punkt C(x2-x1/2, F(x2-x1/2)). Obliczenia należy wykonać wtedy gdy |x2-x1| << |F(x2)-F(x1)|, inaczej jeżeli skok wartości funkcji jest dużo większy od skoku argumentu.

0

Zwiekszylem gradacje i jest wszystko oki :). Przejrzalem tak ogolnie tego JFreeCharta i mozliwosci ktore on oferuje sa calkiem fajne ale chyba nawet za duze w stosunku do tych ktorych potrzebuje. Moze go wykorzystam w czyms innym. Dzieki koziołek :)

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