Gaz sieciowy

Transkrypt

Gaz sieciowy
Utwórz klasę, która dziedziczy po JApplet. Do apletu dodawany jest przycisk „START” oraz obiekt
wykres klasy Wykres dziedziczącej po klasie JPanel. Wciśnięcie przycisku uruchamia prostą animację
w obiekcie wykres, np.: cykliczne rysowanie kółek w losowo wybranych pozycjach.
Rysowanie w Swingu: https://docs.oracle.com/javase/tutorial/uiswing/painting/step2.html
Wstrzymywanie wątku:
try {
Thread.sleep(100);
// sleep for 10 msec
} catch (InterruptedException t){}
Domyślny zarządca rozkładu w JApplet to BorderLayout.
Ustawianie wielkości komponentu klasy Wykres12 metodą setSize (np. w
konstruktorze: setSize(wielkość,wielkosc)) nie działa. Należy przesłonić metodę
getPreferredSize().
import
import
import
import
public
java.applet.Applet;
java.awt.*;
java.awt.event.*;
javax.swing.*;
class test_swing extends JApplet{
int applet_width=500;
int applet_height=400;
Wykres wykr = new Wykres();
public void init(){
setSize(applet_width,applet_height);
setLayout(new FlowLayout());
add(wykr);
}
}
class Wykres extends JPanel{
boolean rysowac;
int wielkosc=200;
public Wykres(){
setBorder(BorderFactory.createLineBorder(Color.blue));
}
public Dimension getPreferredSize()
{return new Dimension(wielkosc,wielkosc);
}
public void paintComponent(Graphics graf){
super.paintComponent(graf);
for (int i=1;i<40;i++){
graf.fillOval((int)(wielkosc*Math.random()),
(int)(wielkosc*Math.random()), 10, 10);
}
}
}
W klasie Wykres wizualizacja 3 cząstek gazu sieciowego. Periodyczne warunki
brzegowe. Uzupełnij definicję metody step(int ktory). Metoda ta dla cząstki o
indeksie ktory próbuje losowo zmienić jedną ze współrzędnych (o plus minus 1).
Jeżeli docelowe miejsce jest puste to zmiana ta jest akceptowana (jednocześnie
cząstka usuwana jest z dotychczasowego miejsca).
import
import
import
import
public
java.applet.Applet;
java.awt.*;
java.awt.event.*;
javax.swing.*;
class j3particles extends JApplet implements ActionListener {
int applet_width=300;
int applet_height=300;
Wykres wykr = new Wykres();
public void init(){
setSize(applet_width,applet_height);
JButton przycisk = new JButton("START");
przycisk.addActionListener(this);
add(wykr,BorderLayout.CENTER);
add(przycisk,BorderLayout.SOUTH);
}
public void actionPerformed(ActionEvent e){
wykr.rysowac=true;
wykr.repaint();
}
}
class Wykres extends JPanel{
boolean rysowac;
int wielkosc=100;
int [][] siec = new int [wielkosc][wielkosc];
int lczastek=3;
Particle [] walker = new Particle [lczastek];
public Wykres(){rysowac=false;
for (int i=0;i<wielkosc;i++){
for (int j=0;j<wielkosc;j++){
siec[i][j]=0;
}
}
walker[0]=new Particle(wielkosc/2,wielkosc/2);
walker[1]=new Particle(wielkosc/4,wielkosc/4);
walker[2]=new Particle(wielkosc/2,wielkosc/4);
siec[wielkosc/2][wielkosc/2]=1;
siec[wielkosc/4][wielkosc/4]=1;
siec[wielkosc/2][wielkosc/2]=1;
}
public Dimension getPreferredSize()
{return new Dimension(wielkosc,wielkosc);
}
void step (int ktory){
}
public void paintComponent(Graphics graf){
super.paintComponent(graf);
graf.drawLine(0, 0, 0, wielkosc);
graf.drawLine(0, 0, wielkosc,0);
graf.drawLine(0, wielkosc, wielkosc, wielkosc);
graf.drawLine(wielkosc, 0,wielkosc, wielkosc);
if(rysowac){
for (int czastka=0;czastka<lczastek;czastka++){
int indeks=(int)(lczastek*Math.random());
step(indeks);
}
for (int i=0;i<wielkosc;i++){
for (int j=0;j<wielkosc;j++){
if(siec[i][j]==1){graf.drawRect(i,j,1,1);}
}
}
try {
Thread.sleep(10);
// sleep for 10 msec
} catch (InterruptedException t){}
repaint();
}
}
}
class Particle {
private int x,y;
public Particle (int xx, int yy)
{x=xx;y=yy;}
int get_x(){return x;}
int get_y(){return y;}
void set_x(int xx){x=xx;}
void set_y(int yy){y=yy;}
}
Konfiguracja początkowa niech zawiera 10000 cząstek ułożonych w kwadracie 100x100
import
import
import
import
public
java.applet.Applet;
java.awt.*;
java.awt.event.*;
javax.swing.*;
class jparticles extends JApplet implements ActionListener {
int applet_width=800;
int applet_height=800;
Wykres2 wykr = new Wykres2();
public void init(){
setSize(applet_width,applet_height);
JButton przycisk = new JButton("START");
przycisk.addActionListener(this);
add(wykr,BorderLayout.CENTER);
add(przycisk,BorderLayout.SOUTH);
}
public void actionPerformed(ActionEvent e){
wykr.rysowac=true;
wykr.repaint();
}
}
// koniec jparticles
class Wykres2 extends JPanel{
boolean rysowac;
int wielkosc=600;
int [][] siec = new int [wielkosc][wielkosc];
int lsquare=100;
int lczastek=lsquare*lsquare;
public Wykres2(){rysowac=false;
for (int i=0;i<wielkosc;i++){
for (int j=0;j<wielkosc;j++){
siec[i][j]=0;
}
}
}
}
public Dimension getPreferredSize()
{return new Dimension(wielkosc,wielkosc);
}
void step (int ktory){
int x=walker[ktory][0];
int y=walker[ktory][1];
double losowa=Math.random();
if(losowa<0.25) {x=x+1;if (x==wielkosc){x=0;}}
else if(losowa<0.5) {x=x-1;if (x==-1){x=wielkosc-1;}}
else if(losowa<0.75) {y=y+1;if (y==wielkosc){y=0;}}
else {y=y-1;if (y==-1){y=wielkosc-1;}}
if(siec[x][y]==0){
siec[walker[ktory][0]][walker[ktory][1]]=0;
walker[ktory][0]=x;
walker[ktory][1]=y;
siec[x][y]=1;
}
}
public void paintComponent(Graphics graf){
super.paintComponent(graf);
graf.drawLine(0, 0, 0, wielkosc);
graf.drawLine(0, 0, wielkosc,0);
graf.drawLine(0, wielkosc, wielkosc, wielkosc);
graf.drawLine(wielkosc, 0,wielkosc, wielkosc);
if(rysowac){
for (int czastka=0;czastka<lczastek;czastka++){
int indeks=(int)(lczastek*Math.random());
step(indeks);
}
for (int i=0;i<wielkosc;i++){
for (int j=0;j<wielkosc;j++){
if(siec[i][j]==1){graf.drawRect(i,j,1,1);}
}
}
try {
Thread.sleep(20);
// sleep for 10 msec
} catch (InterruptedException t){}
repaint();
}
}
// koniec Wykres2
Dwugatunkowy gaz sieciowy (cząstki czerwone/niebieski poruszają się preferencyjnie
w lewo/prawo). W klasie Wykres2 w konstruktorze utwórz tablicę z cząstkami pole
sieci zajęte jest przez cząstkę z prawdopodobieństwem gestosc. Rodzaj cząstek (1
lub 2) przypisywany jest losowo.
Wprowadź ustawianie szybkości (speed w klasie Wykres2) poprzez suwak JSlider
dodany w pionie do BorderLayout.WEST. Wymagana implementacja ChangeListener.
Obsługa zdarzeń ChangeEvent poprzez anonimową klasę wewnętrzną.
Dodaj pole tekstowe GESTOSC gdzie ustawiana będzie gestosc. Dopiero po zadaniu
przez użytkownika tej wartości niech drukowana będzie konfiguracja początkowa
cząstek i aktywowany będzie przycisk START (oraz suwak).
import
import
import
import
import
public
}
java.applet.Applet;
java.awt.*;
java.awt.event.*;
javax.swing.*;
javax.swing.event.*;
class dwarodzaje extends JApplet implements ActionListener {
int applet_width=500;
int applet_height=500;
Wykres2 wykr = new Wykres2();
JButton przycisk = new JButton("START");
public void init(){
setSize(applet_width,applet_height);
przycisk.addActionListener(this);
add(wykr,BorderLayout.CENTER);
add(przycisk,BorderLayout.SOUTH);
add(wykr.bias_text,BorderLayout.NORTH);
wykr.bias_text.addActionListener(this);
}
public void actionPerformed(ActionEvent e){
}
// koniec dwarodzaje
class Wykres2 extends JPanel{
double bias=0.4;
int speed=1;
JTextField bias_text = new JTextField("0.4");
boolean czystart;
int wielkosc=300;
int [][] siec = new int [wielkosc][wielkosc];
int lczastek_max=wielkosc*wielkosc;
int [][] walker = new int [lczastek_max][2];
int lczastek=0;
double gestosc=0.3;
// prawdopodobieństwo obsady przez cząstkę
public Wykres2(){czystart=false;
setBorder(BorderFactory.createLineBorder(Color.blue));
}
@Override
// adnotacja informująca o przesłanianiu metody
public Dimension getPreferredSize()
{return new Dimension(wielkosc,wielkosc);
}
void step (int ktory){
int x=walker[ktory][0];
int y=walker[ktory][1];
int siecxy=siec[x][y];
double p=0.0;
if(siec[x][y]==1) {p=bias;} else {p=0.5-bias;}
double losowa=Math.random();
if(losowa<p) {x=x+1;if (x==wielkosc){x=0;}}
else if(losowa<0.5) {x=x-1;if (x==-1){x=wielkosc-1;}}
else if(losowa<0.75) {y=y+1;if (y==wielkosc){y=0;}}
else {y=y-1;if (y==-1){y=wielkosc-1;}}
if(siec[x][y]==0){
siec[walker[ktory][0]][walker[ktory][1]]=0;
walker[ktory][0]=x;
walker[ktory][1]=y;
siec[x][y]=siecxy;
}
}
public void paintComponent(Graphics graf){
super.paintComponent(graf);
for (int i=0;i<wielkosc;i++){
for (int j=0;j<wielkosc;j++){
if(siec[i][j]==1){graf.setColor(Color.blue);graf.drawRect(i,j,1,1);}
if(siec[i][j]==2){graf.setColor(Color.red);graf.drawRect(i,j,1,1);}
}
}
for (int czastka=0;czastka<speed*lczastek;czastka++){
int indeks=(int)(lczastek*Math.random());
step(indeks);
}
try {
Thread.sleep(10);
// sleep for 10 msec
} catch (InterruptedException t){}
repaint();
}
}
// koniec Wykres2

Podobne dokumenty