Una classe LineSegment deve disabilitare approssimativamente gli endpoint nel suo costruttore?

3

Immagina una classe LineSegment che rappresenta un segmento di linea utilizzando due endpoint arbitrari.

Il costruttore dovrebbe lanciare se sono passati due endpoint approssimativamente uguali? Ovviamente ciò richiederebbe un confronto arbitrario a virgola mobile. Ad esempio, prova la distanza euclidea tra gli endpoint è inferiore a ε.

Un vantaggio è che gli utenti non otterranno risposte prive di senso a determinate domande se costruiscono un LineSegment con rumore in virgola mobile o due punti che "dovrebbero" essere uguali ma divergenti a causa dell'errore nei calcoli in virgola mobile. Ad esempio, sarebbe altrimenti pericoloso se l'utente chiedesse la direzione in cui è stato puntato un segmento di linea.

Uno svantaggio è che ora la classe deve cercare di incapsulare e mantenere questo requisito sullo stato dei due endpoint. Spostare un endpoint di LineSegment avrebbe il potenziale per lanciare.

Immagina una classe PolyLine che utilizza questi LineSegment sotto il cofano. Se l'utente vuole inserire un nuovo punto in PolyLine , potrebbe lanciare se quel punto si trova all'interno di ε di un altro punto. Un SafeInsert avrebbe bisogno di cancellare tutti i punti vicini? Gli utenti possono tollerare un SafeInsert che potenzialmente riduce la dimensione della loro polilinea? Anche l'eliminazione di un punto potrebbe generare, perché potrebbe riunire due punti approssimativamente uguali.

L'alternativa al lancio dei costruttori consiste nel saltare la convalida e affidarsi agli utenti per chiamare un Douglas-Peucker o relativo algoritmo se c'è il rischio che i loro dati LineSegment o PolyLine possano fornire risposte irragionevoli. Gli utenti fornirebbero il proprio ε quando usavano questa funzione.

Qualcuno ha familiarità con le implementazioni esistenti di LineSegment o PolyLine classi che preferiscono un approccio all'altro?

    
posta davidvandebunte 14.12.2017 - 03:39
fonte

1 risposta

4

Dipende dal contesto, ma in linea generale, se non conosci le risposte a queste domande, ti suggerirei di cercare di rendere il tuo LineSegment consentire questo caso senza lanciare, e se possibile, anche trovare un modo per consenti al tuo caso PolyLine di funzionare anche senza lanci.

    
risposta data 14.12.2017 - 05:54
fonte

Leggi altre domande sui tag