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;
}