" programmino semplice "

di il
14 risposte

" programmino semplice "

Salve a tutti, sono un neo-programmatore ancora in fase di apprendimento.
Ma ora vado al sodo:
Come esercitazione java mi sono auto-assegnato un problema ke consiste nel disegnare un bersaglio e, dopo aver inserito le coordinate di un punto (da tastiera), sapere se ho fatto centro, se ho mancato il bersaglio,etc... (un prog. un po' stupido, considerando ke ancora non sono arrivato alla coordinazione degli eventi del mouse, ma ke volete farci... in 3 settimane di studi forzatamente sporadici è il massimo ke so fare al momento spero di riuscire a migliorarlo col tempo, fino a farlo diventare un gioco decente ).
Il prog. ke ho scritto fino ad adesso è questo:

import java.applet.Applet;
import java.awt.*;
import java.awt.geom.*;

import javax.swing.*;


public class Bersaglio extends Applet
{
private final int c1x = 50 ;
private final int c1y = 50 ;
private final int c1Lung = 120 ;
private final int c1Larg = 120 ;


public void paint(Graphics
{
final double raggio = 3;

Graphics2D a = (Graphics2D) b ;

// Disegno il primo cerchio, rimpicciolendo i seguenti e alternando il colore

Ellipse2D.Double c1 =
new Ellipse2D.Double(c1x, c1y, c1Lung, c1Larg);
a.setColor(Color.BLUE);
a.fill(c1);

Ellipse2D.Double c2 =
new Ellipse2D.Double (c1x + 10, c1y + 10, c1Lung-20, c1Larg-20);
a.setColor(Color.RED);
a.fill(c2);

Ellipse2D.Double c3 =
new Ellipse2D.Double (c1x + 20, c1y +20, c1Lung-40, c1Larg-40);
a.setColor(Color.BLUE);
a.fill(c3);

Ellipse2D.Double c4 =
new Ellipse2D.Double (c1x + 30, c1y +30, c1Lung-60, c1Larg-60);
a.setColor(Color.RED);
a.fill(c4);

Ellipse2D.Double c5 =
new Ellipse2D.Double (c1x + 40, c1y + 40, c1Lung-80, c1Larg-80);
a.setColor(Color.BLUE);
a.fill(c5);

// Avvio la finestra che chiede le coordinate

String input = JOptionPane.showInputDialog ("Inserire la coordinata x");
float x = Float.parseFloat(input);

input = JOptionPane.showInputDialog ("Inserire la coordinata y");
float y = Float.parseFloat(input);

// Disegno il punto risultante


Ellipse2D.Double cerchietto
= new Ellipse2D.Double(x - raggio, y - raggio,
2 * raggio, 2 * raggio);
a.setColor (Color.LIGHT_GRAY);
a.draw(cerchietto);

// Inizio il controllo

if ( (x >= (c1x + 40)&& x < (c1x + 80)) && (y >= (c1y + 40)&& y < (c1y + 80)))
input = JOptionPane.showInputDialog ("AZZ ! Complimenti, hai fatto centro !");

else if ( (x >= (c1x + 30)&& x < (c1x + 90)) && (y >= (c1y + 30)&& y < (c1y + 90)))
input = JOptionPane.showInputDialog ("Bravo, ci sei andato vicino");

else if ( (x >= (c1x + 20)&& x < (c1x + 100)) && (y >= (c1y + 20)&& y < (c1y + 100)))
input = JOptionPane.showInputDialog ("Una buona mira");

else if ( (x >= (c1x + 10)&& x < (c1x + 110)) && (y >= (c1y + 10)&& y < (c1y + 110)))
input = JOptionPane.showInputDialog ("Hmmm...Soddisfacente");

else if ( (x >= c1x && x < (c1x + 120)) && (y >= c1y && y < (c1y + 120)))
input = JOptionPane.showInputDialog ("Hai ancora molto da imparare..");
else
input = JOptionPane.showInputDialog ("Ma sìì Propt' na KIAVECA");


}

}

Ma mi sono reso conto che così controllo solo se il punto è dentro ai quadrati ke delimita i vari cerchi.

Come posso fare in modo di "controllare" che un punto sia all'interno "solo" dell'area ke voglio, sia essa un cerchio o anke una figura "irregolare",
qual''è la "formula generica" ke va bene in questi casi?

Grazie per la pazienza.

P.S. e Menomale ke pensavo fosse un programmino semplice-semplice

14 Risposte

  • Re: " programmino semplice "

    Basta fare la distanza tra il punto dato ed il centro del bersaglio, quindi confrontarlo con le due distanze che rappresentano il minimo e il massimo di quella zona. Per es. l'ultimo anello, il più largo dovrebbe essere tra 60 e 80, quindi un colpo distante 72 dal centro ci sta; invece un colpo distante 53 è compreso nell'area tra 40 e 60.

    Chip
  • Re: " programmino semplice "

    Perdonami l'ignoranza, ma nn ho capito bene,
    nel senso, ho capito quello ke vuoi dire ma non so come applicarlo, come faccio a tener presente solo la distanza tra il centro e il mio punto senza tener presente le coordinate x e y ?
    saresti così gentile da scrivere direttamente la riga di comando ke devo mettere in almeno 1 dei miei if ? non per pigrizia, ma per il fatto ke non so come fare a mettere in pratica il tuo prezioso consiglio,

    grazie ancora .
  • Re: " programmino semplice "

    Dunque il centro di tutti i tuoi cerchi è c1x e c1y ovvero 50,50.
    Tu dai in ingresso le coordinate del "colpo": x,y e calcoli la distanza dal centro, che e:

    d = sqrt( (x-c1x)^2 + (y-c1y)^2 )

    Ora il primo cerchio è largo 120, il secondo 100, il terzo 80 il quarto 60, il quinti 40.
    Le "corone" sono date tra 120-100, 100-80, 80-60, 60-40 e dentro 40 c'è il centro.

    Il controllo sarà:
    if ( d < 40)
    input = JOptionPane.showInputDialog ("AZZ ! Complimenti, hai fatto centro !");
    if ( d > 40) && (d < 60)
    input = JOptionPane.showInputDialog ("Bravo, ci sei andato vicino!");
    if ( d > 60) && (d < 80)
    input = JOptionPane.showInputDialog ("Una buona mira");
    if ( d > 80) && (d < 100)
    input = JOptionPane.showInputDialog ("Hmmm...Soddisfacente");
    if ( d > 100) && (d < 120)
    input = JOptionPane.showInputDialog ("Hai ancora molto da imparare..");
    if ( d > 120)
    input = JOptionPane.showInputDialog ("Ma sìì Propt' na KIAVECA");

    Se vuoi ti riscrivo il pezzetto dell'applet incriminato anche se sarebbe più giusto lo modificassi tu se vuoi imparare.

    Chip
  • Re: " programmino semplice "

    L'ho fatto ma non funziona bene
  • Re: " programmino semplice "

    ..perchè il cerchio nn viene costruito partendo dal centro, ma dalla sua estremità in alto a sinistra...quindi le distanze nn sono queste..il centro nn si trova in quelle coordinate; come devo fare? forse dovrei raddoppiare la distanza, booh adesso ci provo..
  • Re: " programmino semplice "

    Non vaaaa
    Ho provato a dimezzare,raddoppiare, non so + ke fare (ho fatto anke la rima ) la formula nn va bene perkè il cerkio viene creato partendo dall'angolo superiore sinistro del quadrato in cui viene inscritto... come fare ??
  • Re: " programmino semplice "

    Su su non ti perdere per così poco... la risposta l'hai quasi data... qua non si tratta né di java né di programmare... se le xy indicano l'angono in alto a sinistra del quadrato di riferimento... dove si troverà mai il centro di questo cerchio? prendi carta e penna disegna un quadrato e dentro un cerchio

    Chip
  • Re: " programmino semplice "

    Allora.... gli if credo di averli messi bene adesso :


    double d = Math.sqrt( ((x-c1x)*(x-c1x)) + ((y-c1y)*(y-c1y)));

    if ( d <= 20)
    input = JOptionPane.showInputDialog ("AZZ ! Complimenti, hai fatto centro !");

    else if ( (d > 20) && (d <= 30))
    input = JOptionPane.showInputDialog ("Bravo, ci sei andato vicino");

    else if ( (d > 30 ) && (d <= 40))
    input = JOptionPane.showInputDialog ("Una buona mira");

    else if ( (d > 40) && (d <= 50 ) )
    input = JOptionPane.showInputDialog ("Hmmm...Soddisfacente");

    else if ( (d > 50) && (d < 60 ) )
    input = JOptionPane.showInputDialog ("Hai ancora molto da imparare..");
    else
    input = JOptionPane.showInputDialog ("Ma sìì Propt' na KIAVECA");


    Ma ancora nn va... allora credo ke il problema di fondo sia la formula per ricavare la distanza.. non lo so, io mi sto rincoglionendo a forza di rifare questo programma... ho ancora molto da imparare, sta di fatto ke ancora nn sono riuscito a trovare la risposta... ti ringrazio per l'aiuto e per la pazienza ke mi hai dedicato, ma mi sa che se mi dici tu quello ke devo scrivere faccio mooooolto prima,

    grazie ancora.
  • Re: " programmino semplice "

    Farei prima ma se faccio così farei ancora prima a dirti di abbandonare. Va tutto bene, resta solo la ricerca del "vero" centro del bersaglio che come hai detto tu stesso non si trova in 50,50 perché quelle sono le coordinate di origine del quadrato dentro cui è circoscritto.
    Dovrebbe essere facile trovarle, visto che hai questa situazione:
    50,50
    +----------+
    + +
    + +
    + +
    + +
    +----------+

    Il centro dovrebbe trovarsi un pò più giù e a destra di 50,50. Stando a quanto descritto qua:
    http://java.sun.com/j2se/1.4.2/docs/api/java/awt/geom/Ellipse2D.Double.html
    e tenendo conto di questi dati:
    private final int c1x = 50 ;
    private final int c1y = 50 ;
    private final int c1Lung = 120 ;
    private final int c1Larg = 120 ;
    ...
    new Ellipse2D.Double(c1x, c1y, c1Lung, c1Larg);
    a.setColor(Color.BLUE);
    Il centro della tua ellisse/cerchio si trova a 50 + (120/2) sia di x che di y.
    Forse ti avrebbe fatto più comodo disegnare l'ellipse con una funzioncina di disegno tipo questa, con raggio e centro vero:

    Ellipse2D.Double cerchio = new Ellipse2D.Double(X - raggio, Y - raggio, 2 * raggio, 2 * raggio);

    o ancora meglio usare la Ovals.

    Dai prova a ricavare il vero centro dell'ellissi (chiamalo vx vy) e calcolane la distanza d rispetto alle xy che dai in input.


    Chip
  • Re: " programmino semplice "

    Non fare caso al rettangolo che ho "disgnato"... ma come cavolo si modifica in questo forum?

    Chip
  • Re: " programmino semplice "

    Oooooooook !!!!!!!!! CI SOOOONOOOOO
  • Re: " programmino semplice "

    FINALMENTE.... ho ritracciato le coordindate e tutto funziona a meraviglia, e mi sono reso conto anke ke sono un rimbambito, perkè la formula ke mi hai consigliato tu per creare i cerki l'avevo usata per creare il cerkietto del mio punto ( e non ci avevo + pensato )
    Cmq adesso finalmente la mia anima inquieta troverà pace e potro' continuare le mie lezioni da auto-didatta (spero non + così burrascose )
    Kiudo ringraziandoti Chip dal profondo del mio cuore (mo sto esagerando.. ), a parte gli skerzi, grazie per il sostegno ma sopratutto per la pazienza , cerkero' di affrontare meglio queste situazioni da oggi in avanti, ma spero ke ci siano sempre persone come te a dare una mano ai "+ bisognosi" come me,
    Grazie ancora, ciaoooo !
  • Re: " programmino semplice "

    FINALMENTE.... ho ritracciato le coordindate e tutto funziona a meraviglia, e mi sono reso conto anke ke sono un rimbambito, perkè la formula ke mi hai consigliato tu per creare i cerki l'avevo usata per creare il cerkietto del mio punto ( e non ci avevo + pensato )
    Cmq adesso finalmente la mia anima inquieta troverà pace e potro' continuare le mie lezioni da auto-didatta (spero non + così burrascose )
    Kiudo ringraziandoti Chip dal profondo del mio cuore (mo sto esagerando.. ), a parte gli skerzi, grazie per il sostegno ma sopratutto per la pazienza , cerkero' di affrontare meglio queste situazioni da oggi in avanti, ma spero ke ci siano sempre persone come te a dare una mano ai "+ bisognosi" come me,
    Grazie ancora, ciaoooo !
  • Re: " programmino semplice "

    Sono contento, beh buono studio!

    Chip
Devi accedere o registrarti per scrivere nel forum
14 risposte