/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package isovaleur;
import colormap.PointColor;
import java.util.ArrayList;
import java.util.Iterator;
import projet.DonneesGeo;
/**
*
* @author lotfi
*/
public class Isovaleur {
/**
* Determine le signe de chaque point de data en comparaison avec valeur
* @param data grille
* @param valeur valeur pour laquelle déterminer l'isovaleur
*/
public static void determinerSigne(PointColor[][] data, double valeur){
for(int i = 0; i < data.length; i ++){
for(int j = 0; j < data[i].length; j++){
if(data[i][j].getValeur() < valeur){
data[i][j].setSigne("-");
}
else{
data[i][j].setSigne("+");
}
}
}
}
/**
* retoune la latitude réelle en fonction de l'échelle
* @param i
* @param latMin
* @param delta
* @return
*/
public static double latitudeReelle(int i, double latMin, double delta){
return i * delta + latMin;
}
/**
* Retourne la longitude reelle en fonction de l'echelle
* @param j
* @param lonMin
* @param delta
* @return
*/
public static double longitudeReelle(int j, double lonMin, double delta){
return j * delta + lonMin;
}
public static DonneesGeo determinerCoord(DonneesGeo donnee1, DonneesGeo donnee2, double valeur){
DonneesGeo resultat = new DonneesGeo();
double v1 = donnee1.getConcentration();
double v2 = donnee2.getConcentration();
double x1 = donnee1.getLongitude();
double y1 = donnee1.getLatitude();
double x2 = donnee2.getLongitude();
double y2 = donnee2.getLatitude();
double v = ((valeur - donnee1.getConcentration()) / (donnee2.getConcentration() - donnee1.getConcentration()));
// System.out.println("v1 = " + v1 + "v2 = " + v2);
double longitude = ((v2 - valeur) / (v2 - v1)) * x1 + ((valeur - v1) / (v2 - v1)) * x2;
double latitude = ((v2 - valeur) / (v2 - v1)) * y1 + ((valeur - v1) / (v2 - v1)) * y2;
resultat.setLongitude(longitude);
resultat.setLatitude(latitude);
resultat.setConcentration(valeur);
return resultat;
}
/**
* Génération de la courbe isovaleur pour la valeur valeur
* @param data
* @param latMin
* @param latMax
* @param delta
* @param valeur
* @return
*/
public static ArrayList<Segment> creerSegments(PointColor[][] data, double valeur, double latMin, double lonMin, double delta){
ArrayList<Segment> segments = new ArrayList<>();
ArrayList<DonneesGeo> donneesGeo ;
DonneesGeo d1,d2,d3,d4;
d1 = new DonneesGeo();
d2 = new DonneesGeo();
d3 = new DonneesGeo();
d4 = new DonneesGeo();
for(int i = 0; i < data.length; i++){
for(int j = 0; j < data[i].length; j++){
if((i + 1) < data.length && (j + 1) < data[i].length){
donneesGeo = new ArrayList<>();
d1.setLongitude(longitudeReelle(j, lonMin, delta));
d1.setLatitude(latitudeReelle(i, latMin, delta));
d1.setConcentration(data[i][j].getValeur());
d2.setLongitude(longitudeReelle(j + 1, lonMin, delta));
d2.setLatitude(latitudeReelle(i, latMin, delta));
d2.setConcentration(data[i][j + 1].getValeur());
d3.setLongitude(longitudeReelle(j + 1, lonMin, delta));
d3.setLatitude(latitudeReelle(i + 1, latMin, delta));
d3.setConcentration(data[i + 1][j + 1].getValeur());
d4.setLongitude(longitudeReelle(j, lonMin, delta));
d4.setLatitude(latitudeReelle(i + 1, latMin, delta));
d4.setConcentration(data[i + 1][j].getValeur());
if(!(data[i][j].getSigne()).equals(data[i][j + 1].getSigne()))
donneesGeo.add(determinerCoord(d1, d2, valeur));
if(!(data[i][j + 1].getSigne()).equals(data[i + 1][j + 1].getSigne()))
donneesGeo.add(determinerCoord(d2, d3, valeur));
if(!(data[i + 1][j + 1].getSigne()).equals(data[i + 1][j].getSigne()))
donneesGeo.add(determinerCoord(d3, d4, valeur));
if(!(data[i + 1][j].getSigne()).equals(data[i][j].getSigne()))
donneesGeo.add(determinerCoord(d4, d1, valeur));
if(donneesGeo.size() > 0)
// System.out.println("sss " + donneesGeo.get(0).getLongitude());
if(donneesGeo.size() == 2)
segments.add(new Segment(donneesGeo.get(0).getLongitude(),donneesGeo.get(0).getLatitude() , donneesGeo.get(1).getLongitude(),donneesGeo.get(1).getLatitude()));
else if(donneesGeo.size() == 4){
double moy = (donneesGeo.get(0).getConcentration() + donneesGeo.get(1).getConcentration() + donneesGeo.get(2).getConcentration() + donneesGeo.get(3).getConcentration()) / 4.0;
if(moy >= valeur){
segments.add(new Segment(donneesGeo.get(0).getLongitude(),donneesGeo.get(0).getLatitude() , donneesGeo.get(3).getLongitude(),donneesGeo.get(3).getLatitude()));
segments.add(new Segment(donneesGeo.get(1).getLongitude(),donneesGeo.get(1).getLatitude() , donneesGeo.get(2).getLongitude(),donneesGeo.get(2).getLatitude()));
}
else{
segments.add(new Segment(donneesGeo.get(0).getLongitude(),donneesGeo.get(0).getLatitude() , donneesGeo.get(1).getLongitude(),donneesGeo.get(1).getLatitude()));
segments.add(new Segment(donneesGeo.get(2).getLongitude(),donneesGeo.get(2).getLatitude() , donneesGeo.get(3).getLongitude(),donneesGeo.get(3).getLatitude()));
}
}
}
}
}
return segments;
}
public static void afficherSegments(ArrayList<Segment> segs){
Iterator<Segment> it = segs.iterator();
while(it.hasNext()){
Segment s = it.next();
System.out.println(s.getX1() + " ; " + s.getY1() + " | " + s.getX2() + " ; " + s.getY2());
}
}
}