Buon pomeriggio a tutti! vorrei avere un aiuto, se è possibile: io ho un'applet da risolvere che consiste nel disegnare i punti da coordinate lette da un file, e con il cursore del mouse tracciare un segmento (ed eventualmente cliccare sugli estremi per spostarlo) e nello stesso tempo i punti più vicini si colorano di rosso, quelli medi di giallo, ed infine quelli più lontani di verde (con soglie a piacere! io ho messo rispettivamente "<50", "<100" e ">=100", nel metodo paint).
Il mio professore mi ha messo davanti un problema: mettendo una coordinata grandissima ovviamente i punti si adattano all'interno dell'applet (con dimensione 750x450), ma lui vuole (giustamente!) che anche la distanza tra il segmento e il punto sia proporzionato (anche nel colorarsi)...è proprio questo che non riesco a risolvere!!!! Lui mi ha suggerito di prendere Xmin e Xmax e trasformarle nell'intervallo (preso da weidth=750) come 650, in modo che ho una distanza dai bordi di 50 e 50, cosi anche Ymin e Ymax e quindi risolvere un sistema di disequazione che sia : a*Xmin+b>=50
a*Xmax+b<=700
a*Ymin+c>=50
a*Ymax+c<=400
dove "a" è uguale per tutti, mentre "b" è relativo alle ascisse e "c" relativo alle ordinate, quindi ci sono in tutto 3 incognite che devono essere trovate, e in base all'inserimento di nuove o eliminazione di coordinate vanno ad inserirsi al'interno di questo sistema, cosi che otteniamo la scala proporzionata.
Io, detto francamente non so come risolverlo....se c'è qualcuno che ci riesce o che mi da altri soluzioni, ne sarei veramente grata! Sarebbe il mio ultimo esame prima della laurea ed è per questo che vi scrivo perchè sono realmente disperata!!!! Vi ringrazio infinitamente!
********************
import javax.swing.JApplet;
import java.awt.geom.Line2D;
import java.awt.geom.Point2D;
import java.awt.geom.Ellipse2D;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Color;
import java.awt.Shape;
import java.awt.event.MouseEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseMotionAdapter;
import javax.swing.JOptionPane;
import java.lang.Integer;
import java.util.Vector;
import java.util.NoSuchElementException;
import java.util.Scanner;
import java.io.*;
public class progetto extends JApplet
{
private Point2D.Double inizio;
private Point2D.Double fine;
private Line2D.Double segmento;
private Ellipse2D.Double ellisseInizio;
private Ellipse2D.Double ellisseFine;
Vector<Integer> x = new Vector<Integer>(500);
Vector<Integer> y = new Vector<Integer>(500);
int ampiezza=10;
int maxX, minX;
int maxY, minY;
int max, min;
private double inizioX;
private double inizioY;
private double xMovimento;
private double yMovimento;
private double xRilascio;
private double yRilascio;
private double x3;
private double y3;
private double x4;
private double y4;
public progetto()
{
int i;
String xlinea;
String ylinea;
String nomeFile=JOptionPane.showInputDialog("Digita il nome del file da leggere");
Scanner fileLettura;
try
{
fileLettura = new Scanner(new File(nomeFile));
while(fileLettura.hasNextLine())
{
String linea = fileLettura.nextLine();
i = linea.indexOf(' '); // posizione del primo spazio
xlinea = linea.substring(0,i).trim(); // da inizio a spazio
ylinea = linea.substring(i).trim(); // da spazio in poi
int xcoord = Integer.parseInt(xlinea);
int ycoord = Integer.parseInt(ylinea);
if(maxX<xcoord)
maxX=xcoord;
if(maxY<ycoord)
maxY=ycoord;
if(minX>xcoord)
minX=xcoord;
if(minY>ycoord)
minY=ycoord;
x.addElement(xcoord);
y.addElement(ycoord);
if(maxX>=maxY)
{
max=maxX;
}
else
{
max=maxY;
}
if(minX<=minY)
{
min=minX;
}
else
{
min=minY;
}
}
}
catch (FileNotFoundException e) // questo viene eseguito solo se si verifica una
{ // eccezione di classe FileNotFoundException
System.out.println("Il file "+nomeFile + " non esiste o non puo' essere aperto");
}
catch (NoSuchElementException e) // questo viene eseguito solo se si verifica una
{ // eccezione di classe NoSuchElementException
System.out.println("errore di lettura file "+e);
}
class AscoltaClick extends MouseAdapter
{
public void mousePressed(MouseEvent e)
{
inizioX = e.getX();
inizioY = e.getY();
Point2D.Double p2 = new Point2D.Double(inizioX, inizioY);
if ((x3==0)&&(y3==0))
{
ellisseInizio = new Ellipse2D.Double(x3-5, y3-5, 0, 0);
ellisseFine = new Ellipse2D.Double(x4-5, y4-5, 0, 0);
}
else
{
ellisseInizio = new Ellipse2D.Double(x3-5, y3-5, 10, 10);
ellisseFine = new Ellipse2D.Double(x4-5, y4-5, 10, 10);
}
if(ellisseFine.contains(inizioX,inizioY)==true)
{
segmento.setLine(inizio,p2);
}
else if(ellisseInizio.contains(inizioX,inizioY)==true)
{
segmento.setLine(p2,fine);
}
else
{
x3=inizioX;
y3=inizioY;
inizio = p2;
}
repaint();
}
public void mouseReleased(MouseEvent e)
{
xRilascio = e.getX();
yRilascio = e.getY();
if(ellisseInizio.contains(inizioX,inizioY)==true)
{
inizio = new Point2D.Double(xRilascio, yRilascio);
x3=xRilascio;
y3=yRilascio;
segmento = new Line2D.Double(inizio,fine);
}
else
{
fine = new Point2D.Double(xRilascio, yRilascio);
x4=xRilascio;
y4=yRilascio;
segmento = new Line2D.Double(inizio,fine);
}
repaint();
}
}
class AscoltaMovimento extends MouseMotionAdapter
{
public void mouseDragged(MouseEvent e)
{
xMovimento = e.getX();
yMovimento = e.getY();
Point2D.Double p = new Point2D.Double(xMovimento, yMovimento);
if(ellisseInizio.contains(inizioX,inizioY)==true)
{
segmento = new Line2D.Double(p,fine);
}
else
{
segmento = new Line2D.Double(inizio,p);
}
repaint();
}
}
MouseAdapter ascoltaEventi = new AscoltaClick(); //Crea un nuovo oggetto
addMouseListener(ascoltaEventi); //Il metodo addMouseListener serve a registrare gli eventi del mouse
MouseMotionAdapter ascoltaMosse = new AscoltaMovimento();
addMouseMotionListener(ascoltaMosse);
}
public void paint(Graphics g)
{
Graphics2D g2 = (Graphics2D) g;
g2.clearRect(0,0,getWidth(),getHeight());
g.setColor(Color.red);
g2.drawRect(0,0,getWidth()-1,getHeight()-1);
g.setColor(Color.black);
g2.drawString("SCALA ",5,445);
for(int i=0;i<x.size();i++)
g.fillOval(x.get(i)*getWidth()/(max+50)-ampiezza/2,y.get(i)*getHeight()/(max+50)-ampiezza/2, ampiezza, ampiezza);
if(segmento!=null)
g2.draw(segmento);
for(int i=0;i<x.size();i++)
{
if(segmento.ptSegDist(x.get(i)*getWidth()/(max+50), y.get(i)*getHeight()/(max+50))<50)
{
g.setColor(Color.red);
g.fillOval(x.get(i)*getWidth()/(max+50)-ampiezza/2,y.get(i)*getHeight()/(max+50)-ampiezza/2, ampiezza, ampiezza);
}
else if(segmento.ptSegDist(x.get(i)*getWidth()/(max+50), y.get(i)*getHeight()/(max+50))<100)
{
g.setColor(Color.yellow);
g.fillOval(x.get(i)*getWidth()/(max+50)-ampiezza/2,y.get(i)*getHeight()/(max+50)-ampiezza/2, ampiezza, ampiezza);
}
else if(segmento.ptSegDist(x.get(i)*getWidth()/(max+50), y.get(i)*getHeight()/(max+50))>=100)
{
g.setColor(Color.green);
g.fillOval(x.get(i)*getWidth()/(max+50)-ampiezza/2,y.get(i)*getHeight()/(max+50)-ampiezza/2, ampiezza, ampiezza);
}
}
}
}



