package solarsim.common; import java.io.BufferedReader; import solarsim.io.MyInputStreamReader; import solarsim.*; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.*; /** * Clasa care descrie starea sistemului la un moment dat. Contine o lista de obiecte {@link Particle} * care specifica masele, pozitiile si vitezele elementelor sistemului. * @author Marius Ion */ public class State { private enum FP_Precision { FLOAT, DOUBLE; }; private List particles; private static final FP_Precision precision = FP_Precision.FLOAT; private State(){} public State(List particles) { this.particles = particles; } /** * Metoda statica ce permite citirea starii dintr-un buffer. Starea a fost * scrisa in buffer de catre programul C. * @param inputStream streamul din care se citeste * @return starea sistemului * @throws IOException cand s-a produs o eroare la citirea din InputStream */ public static State readStateFromBuffer(byte[] data, int offset, int length) throws IOException { ByteArrayInputStream ins = new ByteArrayInputStream(data, offset, length); return readStateFromInputStream(ins); } /** * Metoda statica ce permite citirea starii dintr-un InputStream. Starea a fost * scrisa in stream de catre programul C. * @param inputStream streamul din care se citeste * @return starea sistemului * @throws IOException cand s-a produs o eroare la citirea din InputStream */ public static State readStateFromInputStream(InputStream inputStream) throws IOException { State state = new State(); MyInputStreamReader in = new MyInputStreamReader(inputStream); int n = in.readInt(); if( n == 0 ) return null; state.particles = new ArrayList(n); for( int i = 0; i < n; i++ ) { state.particles.add(new Particle()); } for( int i = 0; i < n; i++ ) { double mass; if( precision == FP_Precision.DOUBLE ) mass = in.readDouble(); else mass = (double)in.readFloat(); state.particles.get(i).mass = mass; } for( int i = 0; i < n; i++ ) { Vector position; if( precision == FP_Precision.DOUBLE ) position = in.readVector(); else position = in.readFloatVector(); state.particles.get(i).position = position; } for( int i = 0; i < n; i++ ) { Vector velocity; if( precision == FP_Precision.DOUBLE ) velocity = in.readVector(); else velocity = in.readFloatVector(); state.particles.get(i).velocity = velocity; } return state; } /** * Getter pentru particule. * @return lista particulelor din sistem. */ public List getParticles() { return particles; } @Override public String toString() { StringBuffer buf = new StringBuffer(); for( int i = 0; i < particles.size(); i++ ) { buf.append("Particle " + i + ":\n"); buf.append("\tmass:" + particles.get(i).mass + "\n"); buf.append("\tposition:" + particles.get(i).position + "\n"); buf.append("\tvelocity:" + particles.get(i).velocity + "\n"); buf.append("\n"); } return buf.toString(); } }