Salve a tutti , ho paura che la domanda non riguardi completamente java ma vada un po' oltre..
Ho un mio Pannello (JPanel) nel quale disegno i grafici delle funzionirendo in ingresso minX , minY , maxX , maxY che rappresentano la regione di piano cartesiano che sarà visualizzata nel pannello , se necessario disegno gli assi cartesiani ecc..
Il programma prende in ingresso anche un numero intero (il passo) che rappresenta (in parole povere) il numero di piccoli segmenti che comporrà il grafico nella ragione di piano mostrata , poi tramite il parser JEP (link) vado a "valutare" la stringa-funzione considerando la variabile "x" con tutti i valori di ascissa mostrati nel pannello (intervallo [minX , maxX]) e salvo man mano questi valori nella corrispondente cella di un array di double con dimensione "passo"

Il problema sorge quando io vado a disegnare la funzione , cioè vado a tracciare tanti piccoli segrementi (saranno passo - 1) tra i valori assunti nell'array sopra citato in posizione i e i+1 , non riesco a trovare il giusto fattore di proporzionalità che mi comprime/dilata il grafico in modo che tutto sia proporzionato al resto (assi ecc)

So che come l'ho spiegata è molto confusa la cosa , per questo posto il codice che ho scritto finora (il problema sta nelle "y" della riga che troverete scritta in grassetto nel codice..è solo un abbozzo di codice):

codice:
import javax.swing.*;
import java.awt.*;
import org.nfunk.jep.JEP;
import java.awt.geom.*;
import java.awt.event.*;

class Pannello extends JPanel {

	private int minX , minY , maxX , maxY;
	private final Color coloreGriglia;
	private final JEP jep;
	private int passo;
	private double [] valoriFunzione;
	private final int trattini;

	public Pannello (int minX , int minY , int maxX , int maxY) {
		this.minX = minX;
		this.minY = minY;
		this.maxX = maxX;
		this.maxY = maxY;
		coloreGriglia = new Color (4 , 4 , 4);
		jep = new JEP ();
		jep.addStandardConstants();
		jep.addStandardFunctions();
        jep.setImplicitMul(true);
		passo = 1000;
		trattini = 10;
		setPreferredSize (new Dimension (500 , 500));
		setBackground (Color.BLACK);
		addKeyListener (new KeyAdapter () {
			public void keyPressed (KeyEvent ke) {
				if (ke.getKeyCode () == KeyEvent.VK_ENTER) {
					tracciaFunzione (JOptionPane.showInputDialog ("Inserisci la funzione"));
				}
			}
		});
	}

	public void paintComponent (Graphics g) {
		super.paintComponent (g);
		Graphics2D g2 = (Graphics2D) g;
		g.setColor (coloreGriglia);
		int w = getWidth ();
		int h = getHeight ();
		//linee verticali
		for (int i=0;i<w;i+=10) {
			g.drawLine (i , 0 , i , h);
		}
		//linee orizzontali
		for (int i=0;i<h;i+=10) {
			g.drawLine (0 , i , w , i);
		}
		g.setColor (Color.WHITE);
		//asse orizzontale
		if (minY < 0 && maxY > 0) {
			double fattore = maxY * ((double)h)/(maxY - minY);
			double incremento = w/10.0;
			double differenza = maxX - minX;
			double temp;
			g2.draw (new Line2D.Double (0 , fattore , w , fattore));
			for (int i=0;i<trattini;i++) {
				temp = minX + i * differenza/10.0;
				g.drawString (isInt (temp) ? tagliaDecimale (temp) : temp + "" ,(int)(i * incremento) , (int)fattore);
			}
		}
		//asse verticale
		if (minX < 0 && maxX > 0) {
			int differenza = maxY - minY;
			double fattore = -minX * ((double)w)/(maxX - minX);
			double incremento = h/10.0;
			double temp;
			g2.draw (new Line2D.Double (fattore , 0 , fattore, h));
			for (int i=0;i<trattini;i++) {
				temp = maxY - i * differenza/10.0;
				g.drawString (isInt (temp) ? tagliaDecimale (temp) : temp + "" , (int)fattore , (int)(i*incremento));
			}
		}
		//disegna funzione
		g.setColor (Color.RED);
		int differenzaX = maxX - minX;
		int differenzaY = maxY - minY;
		if (valoriFunzione != null) {
			for (int i = 0;i<valoriFunzione.length - 1;i++) {
				if (!Double.isNaN (valoriFunzione [i]) && !Double.isNaN (valoriFunzione [i+1]) && Math.abs (valoriFunzione [i] - valoriFunzione [i+1]) < h) {
					//NON VA BENE IL FATTORE DI PROPORZIONALITA' , COME LO TROVO??
					double temp = maxY * ((double)h)/(maxY - minY);
					g2.draw(new Line2D.Double (i * ((double)w)/passo , ((double)h)/differenzaY * maxY - valoriFunzione [i] * differenzaY , (i+1) * ((double)w)/passo , ((double)h)/differenzaY * maxY - valoriFunzione [i+1] * differenzaY ));
				}
			}
		}
	}

	private void tracciaFunzione (String funzione) {
		valoriFunzione = new double [passo];
		int differenza = maxX - minX;
		for (int i=0;i<valoriFunzione.length;i++) {
			jep.addVariable ("x" , minX + i * ((double)differenza)/passo);
			jep.parseExpression (funzione);
			if (jep.hasError ()) {
				JOptionPane.showMessageDialog (null , jep.getErrorInfo ());
				return;
			}else {
				valoriFunzione [i] = jep.getValue ();
			}
		}
		repaint ();
	}

	private boolean isInt (double d) {
		return d == (int)d;
	}

	private String tagliaDecimale (double d) {
		return (d + "").substring (0 , (d + "").indexOf ("."));
	}

	public static void main (String [] args) {
		JFrame f = new JFrame ();
		f.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
		final Pannello p = new Pannello(-10 , -10 , 10 , 10/*-500 , -500 , 500 , 500*/);
		f.getContentPane ().add (p);
		f.addWindowFocusListener(new WindowAdapter() {
			@Override
			public void windowGainedFocus(WindowEvent e) {
				p.requestFocusInWindow();
		    }
        });
		f.pack ();
		f.setVisible (true);
	}

}
Spero risciate ad aiutarmi