Skip to content
Snippets Groups Projects
Commit 61d3b9fb authored by Lucas Philippe's avatar Lucas Philippe
Browse files

ajout etape 9 TP5

parent b8ebb911
No related branches found
No related tags found
No related merge requests found
......@@ -16,3 +16,4 @@ Nous choisisons les attributs "population" et "altiteude" pour encoder visuellem
- Altitude : la variable rétinienne associée à l'altitude sera la couleur du marqueur. Par exemple, les villes ayant une altitude plus élevée seront représentées par des marqueurs jaunes à rouge, tandis que les villes ayant une altitude plus basse seront représentées par des marqueurs bleus.
On met en place aussi un histogramme des valeurs de population, c'est-à-dire le nombre de valeurs appartenant à chaque intervalle de l'axe afin d'améliorer la visualisation des données.
\ No newline at end of file
......@@ -14,13 +14,15 @@ City cities[];
int legendsHeight=100;
int minPopulationToDisplay=1;
int maxPopulationToDisplay=300000;
boolean redrawInProgress=false;
City lastCitySelected=null;
City lastCityClicked=null;
float sliderX, sliderY, sliderWidth, sliderHeight;
float sliderPosition;
float sliderPositionMin, sliderPositionMax;
boolean draggingSlider = false;
boolean draggingMin = false;
void setup() {
size(900,900);
......@@ -32,7 +34,9 @@ void setup() {
sliderY = 50;
sliderWidth = width - 100;
sliderHeight = 20;
sliderPosition = map(minPopulationToDisplay, minPopulation, maxPopulation, sliderX, sliderX + sliderWidth);
// Initialise les positions des curseurs sur le slider
sliderPositionMin = map(minPopulationToDisplay, minPopulation, maxPopulation, sliderX, sliderX + sliderWidth);
sliderPositionMax = map(maxPopulationToDisplay, minPopulation, maxPopulation, sliderX, sliderX + sliderWidth);
}
void draw() {
......@@ -41,7 +45,7 @@ void draw() {
fill(0);
textSize(20);
textAlign(CENTER, CENTER);
text("Afficher les populations supérieures à " + minPopulationToDisplay, width/2, 20);
text("Afficher les populations entre " + minPopulationToDisplay + " et " + maxPopulationToDisplay, width/2, 20);
setBasePen();
drawSlider();
......@@ -63,31 +67,30 @@ void drawSlider() {
fill(180);
rect(sliderX, sliderY, sliderWidth, sliderHeight);
fill(255, 0, 0);
ellipse(sliderPosition, sliderY + sliderHeight / 2, 20, 20);
fill(255, 0, 0); // Poignée pour le minimum
ellipse(sliderPositionMin, sliderY + sliderHeight / 2, 20, 20);
fill(0, 255, 0); // Poignée pour le maximum
ellipse(sliderPositionMax, sliderY + sliderHeight / 2, 20, 20);
}
void readData() {
// Début de la mise à jour des données
String[] lines = loadStrings("./villes.tsv");
ArrayList<City> filteredCities = new ArrayList<City>();
String[] lines = loadStrings("./villes.tsv");
if (lines != null && lines.length > 2) {
parseInfo(lines[0]);
for (int i = 2; i < lines.length; i++) {
String[] columns = split(lines[i], TAB);
float pointX = float(columns[x]);
float pointY = float(columns[y]);
if (float(columns[5]) > minPopulationToDisplay) {
filteredCities.add(new City(columns[0], columns[4], mapX(pointX), mapY(pointY), float(columns[5]), float(columns[6]), float(columns[7])));
float population = float(columns[5]);
if (population >= minPopulationToDisplay && population <= maxPopulationToDisplay) {
filteredCities.add(new City(columns[0], columns[4], mapX(float(columns[x])), mapY(float(columns[y])), population, float(columns[6]), float(columns[7])));
}
}
}
cities = filteredCities.toArray(new City[filteredCities.size()]);
totalCount = filteredCities.size();
cities = filteredCities.toArray(new City[totalCount]);
redrawInProgress = false;
redraw();
}
void parseInfo(String line) {
......@@ -171,55 +174,50 @@ void mouseMoved() {
}
void mousePressed(){
// Vérifie d'abord si le clic est sur le slider
float distanceToSlider = dist(mouseX, mouseY, sliderPosition, sliderY + sliderHeight / 2);
if (distanceToSlider < 20) { // Supposons que la poignée du slider a un rayon d'action de 20 pixels pour faciliter l'interaction
float distMin = dist(mouseX, mouseY, sliderPositionMin, sliderY + sliderHeight / 2);
float distMax = dist(mouseX, mouseY, sliderPositionMax, sliderY + sliderHeight / 2);
if (distMin < 10) {
draggingSlider = true;
updateSliderPosition();
} else {
// Sinon, vérifie si le clic est sur une ville
City city = pick(mouseX, mouseY);
if (city != null) {
println("City clicked: " + city.name);
if (lastCityClicked != null) {
lastCityClicked.isClicked = false; // Désélectionnez l'ancienne ville cliquée, si nécessaire
}
lastCityClicked = city;
lastCityClicked.isClicked = true;
} else if (lastCityClicked != null) {
lastCityClicked.isClicked = false;
lastCityClicked = null;
}
redraw();
draggingMin = true;
} else if (distMax < 10) {
draggingSlider = true;
draggingMin = false;
}
}
void mouseReleased() {
// Arrête le glissement lorsque le bouton de la souris est relâché
draggingSlider = false;
}
void mouseDragged() {
if (draggingSlider) {
sliderPosition = constrain(mouseX, sliderX, sliderX + sliderWidth);
int newMinPopulation = int(map(sliderPosition, sliderX, sliderX + sliderWidth, minPopulation, maxPopulation));
if (newMinPopulation != minPopulationToDisplay) { // Ne mettez à jour les données que si nécessaire
minPopulationToDisplay = newMinPopulation;
redrawInProgress = true;
readData(); // readData devrait désactiver redrawInProgress à la fin
boolean updateData = false;
if (draggingMin) {
float newPos = constrain(mouseX, sliderX, sliderPositionMax);
if (newPos != sliderPositionMin) {
sliderPositionMin = newPos;
minPopulationToDisplay = int(map(sliderPositionMin, sliderX, sliderX + sliderWidth, minPopulation, maxPopulation));
updateData = true;
}
} else {
float newPos = constrain(mouseX, sliderPositionMin, sliderX + sliderWidth);
if (newPos != sliderPositionMax) {
sliderPositionMax = newPos;
maxPopulationToDisplay = int(map(sliderPositionMax, sliderX, sliderX + sliderWidth, minPopulation, maxPopulation));
updateData = true;
}
}
if (updateData) {
readData(); // Modifier pour ne lire les données que si nécessaire
redraw(); // Limitez le redessin aux moments nécessaires
}
}
}
void updateSliderPosition() {
sliderPosition = constrain(mouseX, sliderX, sliderX + sliderWidth);
minPopulationToDisplay = int(map(sliderPosition, sliderX, sliderX + sliderWidth, minPopulation, maxPopulation));
readData();
redraw();
void mouseReleased() {
draggingSlider = false;
redraw(); // Assurez-vous de redessiner une dernière fois à la fin du déplacement
}
City pick(int px, int py) {
for (int i = totalCount - 1 ; i >= 0; --i) {
if (cities[i].contains(px, py)) {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment