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

ajout etape 9 TP5

parent b8ebb911
Branches master
No related tags found
No related merge requests found
...@@ -16,3 +16,4 @@ Nous choisisons les attributs "population" et "altiteude" pour encoder visuellem ...@@ -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. - 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. 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[]; ...@@ -14,13 +14,15 @@ City cities[];
int legendsHeight=100; int legendsHeight=100;
int minPopulationToDisplay=1; int minPopulationToDisplay=1;
int maxPopulationToDisplay=300000;
boolean redrawInProgress=false; boolean redrawInProgress=false;
City lastCitySelected=null; City lastCitySelected=null;
City lastCityClicked=null; City lastCityClicked=null;
float sliderX, sliderY, sliderWidth, sliderHeight; float sliderX, sliderY, sliderWidth, sliderHeight;
float sliderPosition; float sliderPositionMin, sliderPositionMax;
boolean draggingSlider = false; boolean draggingSlider = false;
boolean draggingMin = false;
void setup() { void setup() {
size(900,900); size(900,900);
...@@ -32,7 +34,9 @@ void setup() { ...@@ -32,7 +34,9 @@ void setup() {
sliderY = 50; sliderY = 50;
sliderWidth = width - 100; sliderWidth = width - 100;
sliderHeight = 20; 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() { void draw() {
...@@ -41,7 +45,7 @@ void draw() { ...@@ -41,7 +45,7 @@ void draw() {
fill(0); fill(0);
textSize(20); textSize(20);
textAlign(CENTER, CENTER); 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(); setBasePen();
drawSlider(); drawSlider();
...@@ -63,31 +67,30 @@ void drawSlider() { ...@@ -63,31 +67,30 @@ void drawSlider() {
fill(180); fill(180);
rect(sliderX, sliderY, sliderWidth, sliderHeight); rect(sliderX, sliderY, sliderWidth, sliderHeight);
fill(255, 0, 0); fill(255, 0, 0); // Poignée pour le minimum
ellipse(sliderPosition, sliderY + sliderHeight / 2, 20, 20); 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() { void readData() {
// Début de la mise à jour des données ArrayList<City> filteredCities = new ArrayList<City>();
String[] lines = loadStrings("./villes.tsv"); String[] lines = loadStrings("./villes.tsv");
ArrayList<City> filteredCities = new ArrayList<City>();
if (lines != null && lines.length > 2) { if (lines != null && lines.length > 2) {
parseInfo(lines[0]); parseInfo(lines[0]);
for (int i = 2; i < lines.length; i++) { for (int i = 2; i < lines.length; i++) {
String[] columns = split(lines[i], TAB); String[] columns = split(lines[i], TAB);
float pointX = float(columns[x]); float population = float(columns[5]);
float pointY = float(columns[y]); if (population >= minPopulationToDisplay && population <= maxPopulationToDisplay) {
if (float(columns[5]) > minPopulationToDisplay) { filteredCities.add(new City(columns[0], columns[4], mapX(float(columns[x])), mapY(float(columns[y])), population, float(columns[6]), float(columns[7])));
filteredCities.add(new City(columns[0], columns[4], mapX(pointX), mapY(pointY), float(columns[5]), float(columns[6]), float(columns[7])));
} }
} }
} }
cities = filteredCities.toArray(new City[filteredCities.size()]);
totalCount = filteredCities.size(); totalCount = filteredCities.size();
cities = filteredCities.toArray(new City[totalCount]);
redrawInProgress = false; redrawInProgress = false;
redraw();
} }
void parseInfo(String line) { void parseInfo(String line) {
...@@ -171,55 +174,50 @@ void mouseMoved() { ...@@ -171,55 +174,50 @@ void mouseMoved() {
} }
void mousePressed(){ void mousePressed(){
// Vérifie d'abord si le clic est sur le slider float distMin = dist(mouseX, mouseY, sliderPositionMin, sliderY + sliderHeight / 2);
float distanceToSlider = dist(mouseX, mouseY, sliderPosition, sliderY + sliderHeight / 2); float distMax = dist(mouseX, mouseY, sliderPositionMax, 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
if (distMin < 10) {
draggingSlider = true; draggingSlider = true;
updateSliderPosition(); draggingMin = true;
} else { } else if (distMax < 10) {
// Sinon, vérifie si le clic est sur une ville draggingSlider = true;
City city = pick(mouseX, mouseY); draggingMin = false;
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();
} }
} }
void mouseReleased() {
// Arrête le glissement lorsque le bouton de la souris est relâché
draggingSlider = false;
}
void mouseDragged() { void mouseDragged() {
if (draggingSlider) { if (draggingSlider) {
sliderPosition = constrain(mouseX, sliderX, sliderX + sliderWidth); boolean updateData = false;
int newMinPopulation = int(map(sliderPosition, sliderX, sliderX + sliderWidth, minPopulation, maxPopulation)); if (draggingMin) {
if (newMinPopulation != minPopulationToDisplay) { // Ne mettez à jour les données que si nécessaire float newPos = constrain(mouseX, sliderX, sliderPositionMax);
minPopulationToDisplay = newMinPopulation; if (newPos != sliderPositionMin) {
redrawInProgress = true; sliderPositionMin = newPos;
readData(); // readData devrait désactiver redrawInProgress à la fin 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 mouseReleased() {
void updateSliderPosition() { draggingSlider = false;
sliderPosition = constrain(mouseX, sliderX, sliderX + sliderWidth); redraw(); // Assurez-vous de redessiner une dernière fois à la fin du déplacement
minPopulationToDisplay = int(map(sliderPosition, sliderX, sliderX + sliderWidth, minPopulation, maxPopulation));
readData();
redraw();
} }
City pick(int px, int py) { City pick(int px, int py) {
for (int i = totalCount - 1 ; i >= 0; --i) { for (int i = totalCount - 1 ; i >= 0; --i) {
if (cities[i].contains(px, py)) { if (cities[i].contains(px, py)) {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment