Newsgroup: it.comp.java
Titolo: disegni che non ci sono...

salve, ho un problema urgentissimo che non riesco a capire...
se voglio disegnare una retta, ma non usando il g.drawLine(x1,y1,x2,y2); ma
usando un "for" e quindi disegnando tutti i singoli pixel, come posso fare?
il problema č che se metto dentro un for un metodo per disegnare (tipo il
drawline) non mi disegna niente!
ho provato a fare cosě:
import java.awt.*;
import java.applet.*;
public class Disegno extends Applet {
 Point pri=new Point(10,15);
 Point sec=new Point(100,150);
 public void init() {
 }
public void paint(Graphics g) {
  g.setColor(Color.black);
  for (int i=pri.x;i==sec.x;i++) {
   g.drawString("non va",10,i);                  //non disegna niente!
   g.drawLine(pri.x,pri.y,pri.x+i,pri.y+i);    //non disegna niente!
   }
  }
vi prego aiutatemi!

In java come in C il ciclo for lo devi fare cosě
 for (i = 0; i < upperbound; i++){} ---------> usando un operatore di
disuguaglianza per l'upperbound(limite superiore, in italiano)
ora prova a cambiare il tuo codice come ti suggerisco.....a me funziona!!!
public void paint(Graphics g) {
   g.setColor(Color.black);
   for (int i=pri.x;i<sec.x+1;i++) {  <----------------------- NOTA BENE,
CAMBIALO COSI
      g.drawString("non va",10,i);   <---------- magari commenta questa, che
fa venire un gran pastrocchio
      g.drawLine(pri.x,pri.y,pri.x+i,pri.y+i);
   }
}
Saluti,Andrea
"Void" <chied...@qui.ok> ha scritto nel messaggio
news:9ph88q$mlg$1...@fe1.cs.interbusiness.it...


arg... è vero! che figura :)
cmq ora non riesco a disegnare per punti una retta che va da x1,y1 a
x2,y2...
con quel procedimento riesco solo a fare rette "predefinite"...
qualche suggerimento?

non compriendo cosa intendi, nel senso che, già la tua funzione disegna una
retta per punti. (punto iniziali ---> punto finale)
spiegami meglio (scusa ma alle volte sono un po duro di comprendonio ;-) )


eheh mi sono spiegato male si vede :)
intendevo se io voglio disegnare una retta via pixel (un pixel per volta) e
conosco le coordinate dei pixel iniziali (x1,y1) e finali (x2,y2) come posso
fare?
la funzione che mi hai corretto prima non prende in considerazione la "y2" e
quindi non rappresenta la retta necessaria.
te come faresti?
grazie e ciao :)
PS non "vale" usare direttamente g.drawline(x1,y1,x2,y2);  =)

te come faresti?
Il problema è lo stesso che deve affrontare chi scrive il codice a
basso livello (ad es.) per le schede video e quindi è già stao risolto
e ottimizzato.
L'algoritmo si chiama MidPoint (che io sappia è il più efficiente) e
funziona come segue:
(non è farina del mio sacco, solo un mio pseudo-adattamento dal C)
public void Midpoint—line(int x0, int y0, int x1, int y1) {
/* assumo 0 != m != 1 e x0 ! x1 */ 
int dx, dy, incrE, incrNE, d, x, y; 
dx = x1 ­ x0;
dy = y1 ­ y0; 
d = 2 * dy ­ dx; /* valore iniziale di d */ 
incrE = 2 * dy; /* incremento per il punto ad EST */ 
incrNE = 2 * (dy ­ dx); /* incremento per il punto a NORD­EST */ 
x = x0;
y = y0; 
Write—pixel(x,y); /* scrittura del punto iniziale */ 
while ( x < x1 ) {
	if( d <= 0 ) {
		d += incrE; 
	} else {
		d += incrNE;
		y++;
	}
	x++;
	Write—pixel(x,y);
}
}
Dove Write-Pixel(x,y) serve per accendere un pixel: magari una
drawLine(x,y,x,y)??
HTH
-- 
Ciao
	Fabrizio C.

"Void" <chied...@qui.ok> ha scritto nel messaggio
news:9phmmq$hls$1...@fe2.cs.interbusiness.it...

in un array metti le x da x_iniz a x_final.
calcoli il coeff. angolare della retta (delta_y/delta_x).
tale coeff è la tangente dell'angolo tra retta ed asse x.
A questo punto è semplice calcolare y, come funzione di x.

puoi usare l'equazione della retta fra due punti :
P1(X1,Y1)
P2(X2,Y2)
retta che passa fra i due punti :
Y - Y1 = ((Y2-Y1)/(X2-X1)) * (X-X1)
esplicitatndo la Y:
Y  = ((Y2-Y1)/(X2-X1)) * (X-X1) + Y1
la X la fai variare da X1 --> X2
Spero ti sia di aiuto,saluti

ti allego anche la funzione paint per farti capire come applicare la formula
:
int Y = 0;
[.....]
public void paint(Graphics g) {
  g.setColor(Color.black);
  for (int i=pri.x;i<sec.x+1;i++) {
   Y  =(int)(((double)(sec.y-pri.y)/(double)(sec.x-pri.x)) * (i-pri.x) +
pri.y);<--- cast per la divisione
   g.drawLine(i,Y,i,Y);    <-------   disegna il punto
  }
}
"Void" <chied...@qui.ok> ha scritto nel messaggio
news:9phmmq$hls$1...@fe2.cs.interbusiness.it...
