Pagina 1 di 1

[Java] Poligono ad alta risoluzione

MessaggioInviato: 10 apr 2012, 20:47
da DarwinNE
Ciao a tutti,
attualmente, all'interno di FidoCadJ, utilizzo un poligono (classe java.awt.Polygon) per memorizzare alcuni risultati intermedi nella primitiva di curva spline cubica che sta venendo fuori per la versione 0.24.
Si tratta di un poligono con molti lati con cui ho bisogno di una certa precisione e lo uso per l'esportazione verso i formati grafici supportati da FidoCadJ (una gran comodità, sebbene sicuramente sub ottimale). Mi sembra che java.awt.Polygon contenga solo una versione con coordinate intere, mentre io avrei bisogno di maggior risoluzione. Quale potrebbe essere un modo comodo per contornare la difficoltà? Derivo una classe Polygon2D da quella standard? Lascio perdere il tutto e mi creo una mia classe per gestire la cosa?

Thanks O_/

Re: [Java] Poligono ad alta risoluzione

MessaggioInviato: 11 apr 2012, 13:12
da angus
Io non so quasi nulla di Java, ma credo che la risposta alla tua domanda sia usare Path2D, come spiegato molto bene qui: http://www.java.net/node/669610
O_/

Re: [Java] Poligono ad alta risoluzione

MessaggioInviato: 12 apr 2012, 3:44
da dadodj
Sarebbe perlopiù sbagliato ereditare la vecchia.. e poi potresti trovarti in qualche errore se la eredi da quella ad interi e la modifichi.. ti converrebbe prenderla e rifarla a scopo copiando la struttura (ma utilizzando dei double a quanto ho capito .. ) ;
comunque il problema si pone dopo perché con i double fare confronti è altamente instabile.. non so se devi fare il controllo se è all'incirca nel raggio di 3,5 hai un sacco di questi altri problemi
potresti però mmm ereditare quella e riscrivere tutto aggiungendo parametri x_decimale e y_decimale interi inizialmente a 0 così almeno puoi fare un controllo sempre sugli interi più rapido veloce Boh..
è solo un'idea :S

comunque credo che la soluzione sia quella Path2 anche se non la conosco

Re: [Java] Poligono ad alta risoluzione

MessaggioInviato: 12 apr 2012, 22:09
da posta10100
Ciao Davide,
come ti è stato già detto, e come tu ben sai, i double sono tanto comodi quanto infidi... l'errore di approssimazione è sempre dietro l'angolo!

Se hai bisogno solo di memorizzare i punti ti conviene fare una semplicissima classe FidoPoint
Codice: Seleziona tutto
public class FidoPoint {
  public double x,y;
}


e poi salvi le coordinate in un vettore
Codice: Seleziona tutto
Vector<FidoPoint> fidoPointVector = new Vector<FidoPoint>();


oppure usi un semplicissimo vettore
Codice: Seleziona tutto
Vector<Double[]> fidoPointVector = new Vector<Double[]>();

Quest'ultimo molto più veloce in fase di esecuzione.

Se invece conosci il numero di punti allora puoi usare un array doppio, così ti togli di torno il vettore e guadagni in prestazioni.

Se i punti sono davvero tanti, incrocia le dita: il garbage collector è un po pigro...

O_/

Re: [Java] Poligono ad alta risoluzione

MessaggioInviato: 12 apr 2012, 22:49
da DarwinNE
Allora, ringrazio quelli che hanno risposto: Foto Utenteangus, Foto Utentedadodj e Foto Utenteposta10100.
Conosco bene la questione degli errori di approssimazione ed il problema di quando considerare identici due valori in virgola mobile (dopotutto, vengo dal calcolo numerico). Il problema è che in qualche caso gli interi sono davvero troppo crudi. Provate FidoCadJ 0.24 alpha, la versione preliminare che ho descritto qui:

viewtopic.php?f=4&t=18347&start=430#p292898

Introducete una bella curva, con la nuova primitiva, e poi provate ad esportare il disegno in pdf, vedrete i contorni della curva scalettati, perché questa è resa con un poligono e la risoluzione non è sufficiente. Ci sono dei metodi più efficienti per fare il rendering di una spline, ma il poligono ha almeno il vantaggio non indifferente di non costringermi a ristudiare tutti i dettagli di tutti i formati grafici (EPS, PDF, SVN e compagnia...).

Alla fine, penso che farò esattamente come ha suggerito Foto Utenteposta10100.