Files
terrain-utilities/src/main/java/pl/wat/ms4ds/terenfunkcje/Kwadrat.java

359 lines
7.9 KiB
Java

package pl.wat.ms4ds.terenfunkcje;
import pl.wat.ms4ds.common.EGeoDirection;
public class Kwadrat {
public static final Kwadrat EMPTY_SQUARE = new Kwadrat(null, 0.0f, 0.0f, 0.0f, 0.0f, 200, 0,
new boolean[8], new boolean[8], new boolean[8]);
float stopienZabudowy;
float stopienZalesienia;
float stopienZawodnienia;
float stopienZabagnienia;
boolean jestDroga[];
boolean jestRow[];
boolean jestPrzeszkodaWodna[];
int roznicaWzniesien;
int wysokoscSrednia;
/**
* The height above the level of the sea.
*/
short elevation;
/**
* 0 - BARE_GROUND
* 1 - GRASS
* 2 - SWAMP
* 3 - WATER
* 4 - SCRUB, BUSHES
* 5 - BUILDINGS
* 6 - FOREST
*/
short terrainType;
/**
* Rodzaj drogi na danym kierunku.
* 0 - no road, 1 - small roads, 2 - minor roads, 3 - major roads
*/
byte[] roads;
/**
* Rodzaj przeszkody wodnej na danym kierunku.
* 0 - no watercourse, 1 - drain, ditch, 2 - canal, stream, 3 - river
*/
byte[] waterWays;
transient RightBigSquare bs;
public float getStopienZabudowy() {
return stopienZabudowy;
}
public float getStopienZalesienia() {
return stopienZalesienia;
}
public float getStopienZawodnienia() {
return stopienZawodnienia;
}
public float getStopienZabagnienia() {
return stopienZabagnienia;
}
public int getRoznicaWzniesien() {
return roznicaWzniesien;
}
public int getWysokoscSrednia() {
return wysokoscSrednia;
}
public boolean[] getJestDroga() {
return jestDroga;
}
public boolean jestOdcinekDrogi() {
for (int i = 0; i < 8; i++) {
if (jestDroga[i])
return true;
}
return false;
}
public boolean getJestDroga(EGeoDirection naKierunku) {
if (naKierunku == EGeoDirection.UNDEFINED) {
return false;
}
return jestDroga[naKierunku.id];
}
public boolean[] getJestRow() {
return jestRow;
}
public boolean[] getJestPrzeszkodaWodna() {
return jestPrzeszkodaWodna;
}
public void setStopienZabudowy(float stopienZabudowy) {
this.stopienZabudowy = stopienZabudowy;
normalizujDanePokrycia();
// try {
// if (null != bs) {
// bs.updateFile(false);
// }
// } catch (IOException e) {
// }
}
public void setStopienZalesienia(float stopienZalesienia) {
this.stopienZalesienia = stopienZalesienia;
normalizujDanePokrycia();
// try {
// if (null != bs) {
// bs.updateFile(false);
// }
// } catch (IOException e) {
// }
}
public void setStopienZawodnienia(float stopienZawodnienia) {
this.stopienZawodnienia = stopienZawodnienia;
normalizujDanePokrycia();
// try {
// if (null != bs) {
// bs.updateFile(false);
// }
// } catch (IOException e) {
// }
}
public void setStopienZabagnienia(float stopienZabagnienia) {
this.stopienZabagnienia = stopienZabagnienia;
normalizujDanePokrycia();
// try {
// if (null != bs) {
// bs.updateFile(false);
// }
// } catch (IOException e) {
// }
}
public void normalizujDanePokrycia() {
float suma = stopienZalesienia + stopienZawodnienia + stopienZabudowy + stopienZabagnienia;
if (suma > 1.0f) {
stopienZalesienia /= suma;
stopienZawodnienia /= suma;
stopienZabudowy /= suma;
stopienZabagnienia = 1.0f - stopienZalesienia - stopienZawodnienia - stopienZabudowy;
}
}
public void setRoznicaWzniesien(int roznicaWzniesien) {
this.roznicaWzniesien = roznicaWzniesien;
// try {
// if (null != bs) {
// bs.updateFile(false);
// }
// } catch (IOException e) {
// }
}
public void setWysokoscSrednia(int wysokoscSrednia) {
this.wysokoscSrednia = wysokoscSrednia;
// try {
// if (null != bs) {
// bs.updateFile(false);
// }
// } catch (IOException e) {
// }
}
public void setJestDroga(boolean[] czyJestDroga) {
this.jestDroga = czyJestDroga;
// try {
// if (null != bs) {
// bs.updateFile(false);
// }
// } catch (IOException e) {
// }
}
public void setJestDroga(EGeoDirection naKierunku, boolean czyJest) {
if (naKierunku == EGeoDirection.UNDEFINED) {
return;
}
this.jestDroga[naKierunku.id] = czyJest;
// try {
// if (null != bs) {
// bs.updateFile(false);
// }
// } catch (IOException e) {
// }
}
public void setJestPrzeszkodaWodna(EGeoDirection naKierunku, boolean czyJest) {
if (naKierunku == EGeoDirection.UNDEFINED) {
return;
}
this.jestPrzeszkodaWodna[naKierunku.id] = czyJest;
// try {
// if (null != bs) {
// bs.updateFile(false);
// }
// } catch (IOException e) {
// }
}
public void setJestRow(EGeoDirection naKierunku, boolean czyJest) {
if (naKierunku == EGeoDirection.UNDEFINED) {
return;
}
this.jestRow[naKierunku.id] = czyJest;
// try {
// if (null != bs) {
// bs.updateFile(false);
// }
// } catch (IOException e) {
// }
}
public void setJestRow(boolean[] czyJestRow) {
this.jestRow = czyJestRow;
// try {
// if (null != bs) {
// bs.updateFile(false);
// }
// } catch (IOException e) {
// }
}
public void setJestPrzeszkodaWodna(boolean[] czyJestPrzeszkodaWodna) {
this.jestPrzeszkodaWodna = czyJestPrzeszkodaWodna;
// try {
// if (null != bs) {
// bs.updateFile(false);
// }
// } catch (IOException e) {
// }
}
public float getStopienPofaldowania() {
// TODO: dodac do normatywow w klasie Teren (parametr kalibracyjny)
float stopienPofaldowania = 0.0f;
if (this.roznicaWzniesien >= 50)
stopienPofaldowania = 1.0f;
else if (this.roznicaWzniesien >= 10)
stopienPofaldowania = 0.6f;
else if (this.roznicaWzniesien >= 5)
stopienPofaldowania = 0.4f;
else if (this.roznicaWzniesien >= 3)
stopienPofaldowania = 0.2f;
return stopienPofaldowania;
}
public Kwadrat() {
jestDroga = new boolean[8];
jestPrzeszkodaWodna = new boolean[8];
jestRow = new boolean[8];
}
public Kwadrat(RightBigSquare _bs, float _stopienZabudowy, float _stopienZalesienia, float _stopienZabagnienia, float _stopienZawodnienia,
int _wysokoscSrednia, int _roznicaWzniesien, boolean _czyJestDroga[], boolean _czyJestRow[], boolean _czyJestPrzeszkodaWodna[]){
bs = _bs;
stopienZabudowy = _stopienZabudowy;
stopienZalesienia = _stopienZalesienia;
stopienZabagnienia = _stopienZabagnienia;
stopienZawodnienia = _stopienZawodnienia;
wysokoscSrednia = _wysokoscSrednia;
roznicaWzniesien = _roznicaWzniesien;
jestDroga = new boolean[8];
jestRow = new boolean[8];
jestPrzeszkodaWodna = new boolean[8];
for (int i = 0; i < _czyJestDroga.length; i++) {
jestDroga[i]=_czyJestDroga[i];
}
for (int i = 0; i < jestRow.length; i++) {
jestRow[i]=_czyJestRow[i];
}
for (int i = 0; i < _czyJestPrzeszkodaWodna.length; i++) {
jestPrzeszkodaWodna[i]=_czyJestPrzeszkodaWodna[i];
}
}
public String toString() {
float f = this.stopienZabudowy * 255.0f;
int hex = (int)f;
String s = String.format("%02X", hex);
String linia = s;
linia += " ";
f = this.stopienZalesienia * 255.0f;
hex = (int)f;
s = String.format("%02X", hex);
linia += s;
linia += " ";
f = this.stopienZabagnienia * 255.0f;
hex = (int)f;
s = String.format("%02X", hex);
linia += s;
linia += " ";
f = this.stopienZawodnienia * 255.0f;
hex = (int)f;
s = String.format("%02X", hex);
linia += s;
linia += " ";
s = String.format("%4d", this.wysokoscSrednia);
linia += s;
linia += " ";
s = String.format("%4d", this.roznicaWzniesien);
linia += s;
linia += " ";
int bity = 0;
int bit_1 = 1;
for (int i = 0; i < this.jestDroga.length; i++) {
if (this.jestDroga[i]) // jest odcinek drogi na tym kierunku
bity += bit_1;
bit_1 = bit_1 << 1;
}
s = String.format("%02X", bity);
linia += s;
linia += " ";
bity = 0;
bit_1 = 1;
for (int i = 0; i < this.jestPrzeszkodaWodna.length; i++) {
if (this.jestPrzeszkodaWodna[i]) // jest przeszkod na tym kierunku
bity += bit_1;
bit_1 = bit_1 << 1;
}
s = String.format("%02X", bity);
linia += s;
linia += " ";
bity = 0;
bit_1 = 1;
for (int i = 0; i < this.jestRow.length; i++) {
if (this.jestRow[i]) // jest row na tym kierunku
bity += bit_1;
bit_1 = bit_1 << 1;
}
s = String.format("%02X", bity);
linia += s;
return linia;
}
}