This commit is contained in:
L3o15 2025-05-29 10:39:51 +00:00
parent d50037d464
commit 40e58cde9c
5 changed files with 118 additions and 5 deletions

View file

@ -1,28 +1,51 @@
package it.unibs.arnaldo.rovineperdute; package it.unibs.arnaldo.rovineperdute;
/**
* Classe che rappresenta una coordinata nello spazio tridimensionale.
* Contiene le coordinate x, y e l'altezza.
*/
public class Coordinata { public class Coordinata {
private final int x; private final int x;
private final int y; private final int y;
private final int altezza; private final int altezza;
/**
* Costruttore della classe Coordinata.
* @param x la coordinata x
* @param y la coordinata y
* @param altezza l'altezza della coordinata
*/
public Coordinata(int x, int y, int altezza){ public Coordinata(int x, int y, int altezza){
this.altezza = altezza; this.altezza = altezza;
this.x = x; this.x = x;
this.y = y; this.y = y;
} }
/**
* Getter per la coordinata x
* @return la coordinata x
*/
public int getX() { public int getX() {
return x; return x;
} }
/**
* Getter per la coordinata y
* @return la coordinata y
*/
public int getY() { public int getY() {
return y; return y;
} }
/**
* Getter per l'altezza della coordinata
* @return l'altezza della coordinata
*/
public int getAltezza() { public int getAltezza() {
return altezza; return altezza;
} }
@Override @Override
public String toString() { public String toString() {
return "Coordinata{" + return "Coordinata{" +
@ -32,7 +55,12 @@ public class Coordinata {
'}'; '}';
} }
/**
* Calcola la distanza tra questa coordinata e un'altra coordinata in base al tipo di veicolo.
* @param c la coordinata da confrontare
* @param tipoVeicolo il tipo di veicolo utilizzato per calcolare la distanza
* @return la distanza calcolata, o -1 se il tipo di veicolo non è riconosciuto
*/
public double calcolaDistanza(Coordinata c, TipoVeicolo tipoVeicolo){ public double calcolaDistanza(Coordinata c, TipoVeicolo tipoVeicolo){
if (tipoVeicolo == TipoVeicolo.METZTLI){ if (tipoVeicolo == TipoVeicolo.METZTLI){
return Math.abs(altezza - c.getAltezza()); return Math.abs(altezza - c.getAltezza());

View file

@ -2,24 +2,42 @@ package it.unibs.arnaldo.rovineperdute;
import java.util.*; import java.util.*;
/**
* Classe che rappresenta un grafo di rovine perdute.
* Contiene metodi per aggiungere rovine, calcolare lo spanning tree e ottenere collegamenti tra rovine.
*/
public class Graph { public class Graph {
private final HashMap<RovinaPerduta, List<RovinaPerduta>> graph; private final HashMap<RovinaPerduta, List<RovinaPerduta>> graph;
/**
* Costruttore della classe Graph.
* Inizializza un grafo vuoto.
*/
public Graph(){ public Graph(){
graph = new HashMap<>(); graph = new HashMap<>();
} }
/**
public Graph(HashMap<RovinaPerduta, List<RovinaPerduta>> graph){ * Aggiunge una rovina perduta al grafo con i suoi collegamenti.
this.graph = graph; * @param rp la rovina perduta da aggiungere
} * @param links la lista di rovine perdute collegate a rp
*/
public void add(RovinaPerduta rp, List<RovinaPerduta> links) { public void add(RovinaPerduta rp, List<RovinaPerduta> links) {
graph.put(rp, links); graph.put(rp, links);
} }
/**
* Getter per ottenere il grafo delle rovine perdute.
* @return una mappa che associa ogni rovina perduta a una lista di rovine perdute collegate
*/
public HashMap<RovinaPerduta, List<RovinaPerduta>> getGraph() { public HashMap<RovinaPerduta, List<RovinaPerduta>> getGraph() {
return graph; return graph;
} }
/**
* Getters per ottenere la lista di rovine perdute collegate a una rovina specifica.
* @param rp la rovina perduta di cui si vogliono ottenere i collegamenti
*/
public List<RovinaPerduta> getListaCollegamenti(RovinaPerduta rp){ public List<RovinaPerduta> getListaCollegamenti(RovinaPerduta rp){
return graph.get(rp); return graph.get(rp);
} }
@ -37,6 +55,13 @@ public class Graph {
return ret.toString(); return ret.toString();
} }
/**
* Calcola lo spanning tree del grafo a partire da un punto di partenza specificato.
* Utilizza l'algoritmo di Dijkstra per trovare il percorso minimo verso la rovina perduta.
* @param puntoPartenza il punto di partenza da cui calcolare lo spanning tree
* @param tipo il tipo di veicolo utilizzato per calcolare le distanze
* @return una lista di RovinaPerdutaGrafo che rappresenta lo spanning tree
*/
public List<RovinaPerdutaGrafo> calcolaSpanningTree(RovinaPerduta puntoPartenza, TipoVeicolo tipo){ public List<RovinaPerdutaGrafo> calcolaSpanningTree(RovinaPerduta puntoPartenza, TipoVeicolo tipo){
HashMap<RovinaPerduta, Double> distanze = new HashMap<>(); HashMap<RovinaPerduta, Double> distanze = new HashMap<>();
HashMap<RovinaPerduta, RovinaPerduta> predecessori = new HashMap<>(); HashMap<RovinaPerduta, RovinaPerduta> predecessori = new HashMap<>();

View file

@ -8,8 +8,21 @@ import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
/**
* Classe che gestisce il parsing del file XML delle rovine perdute e la generazione di un file XML con le rotte.
* Contiene metodi per leggere il file XML, costruire il grafo delle rovine e generare un file XML con le rotte.
*/
public class Parser { public class Parser {
/**
* Metodo per leggere un file XML contenente le rovine perdute e costruire un grafo.
* Il file XML deve seguire una struttura specifica in cui ogni rovina è rappresentata da un elemento "city"
* e i collegamenti tra le rovine sono rappresentati da elementi "link".
*
* @param fileName il nome del file XML da leggere
* @return un oggetto Graph che rappresenta il grafo delle rovine perdute
*/
// rovina = città // rovina = città
public static Graph parseRovinePerduteXML(String fileName) { public static Graph parseRovinePerduteXML(String fileName) {
@ -81,9 +94,13 @@ public class Parser {
} }
xmlr.close(); xmlr.close();
// creo il grafo
Graph grafo = new Graph(); Graph grafo = new Graph();
// aggiungo le rovine al grafo
for (Integer idx : mappaCollegamenti.keySet()){ for (Integer idx : mappaCollegamenti.keySet()){
// trasformo gli indici dei collegamenti in RovinaPerduta
List<Integer> listaIndiciCollegamenti = mappaCollegamenti.get(idx); List<Integer> listaIndiciCollegamenti = mappaCollegamenti.get(idx);
List<RovinaPerduta> listaCollegamenti = new ArrayList<>(); List<RovinaPerduta> listaCollegamenti = new ArrayList<>();
RovinaPerduta rp = rovineMap.get(idx); RovinaPerduta rp = rovineMap.get(idx);
@ -103,6 +120,13 @@ public class Parser {
} }
} }
/**
* Metodo per generare un file XML contenente le rotte delle due squadre Tonatiuh e Metztli.
* Il file XML conterrà le informazioni sulle città visitate, il costo totale e il numero di città per ogni squadra.
*
* @param minimumTreeTonatium la lista delle rovine per la squadra Tonatiuh
* @param minimumTreeMetztli la lista delle rovine per la squadra Metztli
*/
public static void generaXML(List<RovinaPerdutaGrafo> minimumTreeTonatium, List<RovinaPerdutaGrafo> minimumTreeMetztli) { public static void generaXML(List<RovinaPerdutaGrafo> minimumTreeTonatium, List<RovinaPerdutaGrafo> minimumTreeMetztli) {
String fileName = "routes.xml"; String fileName = "routes.xml";

View file

@ -1,24 +1,45 @@
package it.unibs.arnaldo.rovineperdute; package it.unibs.arnaldo.rovineperdute;
/**
* Classe che rappresenta una città perduta, ovvero una rovina con le sue coordinate, nome e ID.
*/
public class RovinaPerduta { public class RovinaPerduta {
private final Coordinata coordinata; private final Coordinata coordinata;
private final String nome; private final String nome;
private final int id; private final int id;
/**
* Costruttore della classe RovinaPerduta.
* @param coordinata la coordinata della rovina perduta
* @param nome il nome della rovina perduta
* @param id l'ID della rovina perduta
*/
public RovinaPerduta(Coordinata coordinata, String nome, int id) { public RovinaPerduta(Coordinata coordinata, String nome, int id) {
this.coordinata = coordinata; this.coordinata = coordinata;
this.nome = nome; this.nome = nome;
this.id = id; this.id = id;
} }
/**
* Getter per le coordinate della rovina perduta.
* @return la coordinata della rovina perduta
*/
public Coordinata getCoordinata() { public Coordinata getCoordinata() {
return coordinata; return coordinata;
} }
/**
* Getter per il nome della rovina perduta.
* @return il nome della rovina perduta
*/
public String getNome() { public String getNome() {
return nome; return nome;
} }
/**
* Getter per l'ID della rovina perduta.
* @return l'ID della rovina perduta
*/
public int getId(){ public int getId(){
return id; return id;
} }

View file

@ -1,13 +1,28 @@
package it.unibs.arnaldo.rovineperdute; package it.unibs.arnaldo.rovineperdute;
/**
* Classe che estende RovinaPerduta per rappresentare una rovina perduta con una distanza specifica.
* Questa classe è utilizzata per gestire le rovine perdute in un grafo, dove la distanza rappresenta
*/
public class RovinaPerdutaGrafo extends RovinaPerduta{ public class RovinaPerdutaGrafo extends RovinaPerduta{
private final double distanza; private final double distanza;
/**
* Costruttore della classe RovinaPerdutaGrafo.
* @param coordinata la coordinata della rovina perduta
* @param nome il nome della rovina perduta
* @param id l'ID della rovina perduta
* @param distanza la distanza dalla rovina perduta
*/
public RovinaPerdutaGrafo(Coordinata coordinata, String nome, int id, double distanza) { public RovinaPerdutaGrafo(Coordinata coordinata, String nome, int id, double distanza) {
super(coordinata, nome, id); super(coordinata, nome, id);
this.distanza = distanza; this.distanza = distanza;
} }
/**
* Getter per la distanza della rovina perduta.
* @return la distanza dalla rovina perduta
*/
public double getDistanza() { public double getDistanza() {
return distanza; return distanza;
} }