From 61d3b9fb0731618341219a0a465fd6480853c0ee Mon Sep 17 00:00:00 2001 From: Lucas Philippe <lucasphilippe@MacBook-Air-de-Lucas.local> Date: Thu, 2 May 2024 22:30:35 +0200 Subject: [PATCH] ajout etape 9 TP5 --- TP5/README.md | 1 + TP5/sketch_240321a/sketch_240321a.pde | 98 +++++++++++++-------------- 2 files changed, 49 insertions(+), 50 deletions(-) diff --git a/TP5/README.md b/TP5/README.md index f829a09..cfbdde3 100644 --- a/TP5/README.md +++ b/TP5/README.md @@ -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 diff --git a/TP5/sketch_240321a/sketch_240321a.pde b/TP5/sketch_240321a/sketch_240321a.pde index 5135446..5730006 100644 --- a/TP5/sketch_240321a/sketch_240321a.pde +++ b/TP5/sketch_240321a/sketch_240321a.pde @@ -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)) { -- GitLab