Come dovrei denominare i campi in una classe che rappresenta le dimensioni 2D e 3D?

5

Sto lavorando su una libreria di visualizzazione che nella maggior parte dei casi funziona su un piano 2D ma ha alcuni componenti che mostrano proiezioni 2D di uno spazio 3D.

Questo dominio ha la nozione di Position , Size , Position3D e Size3D .

Position e Size sono semplici:

data class Position(val x: Int, val y: Int)

data class Size(val width: Int, val height: Int)

ma quando introduco le varianti 3D height non è più auto-esplicativo:

data class Position3D(val x: Int, val y: Int, val z: Int)

data class Size3D(val width: Int, // this is OK
                  val height: Int, // is this the Y or the Z axis?
                  val depth: Int) // is depth universally recognized?

Esiste una best practice per questo problema?

Posso aggirarlo facendo qualcosa del genere:

data class Size3D(val xAmount: Int,
                  val yAmount: Int,
                  val zAmount: Int)

ma sembra un po 'hacky.

Modifica: come dovrei denominare le taglie 2D vs 3D? Dovrei continuare a usare height in 2D (asse y) anche se in 3D height è per asse z ?

Come posso risolvere questo?

    
posta Adam Arold 16.02.2018 - 00:51
fonte

2 risposte

7

Ricorda che le cose possono ruotare. Quindi non esiste un modo definitivo per farlo. Tutto quello che puoi fare è impostare una convenzione.

Un modello popolare accopperebbe questo

conquesto:

Ma non dovresti assumere che quelle parole evocano queste immagini per tutti. In effetti non esiste una convenzione universale per loro.

Alcuni altri insistono anche sul fatto che altezza e profondità sono la stessa cosa e insistono per aggiungere lunghezza (che non mi ha mai aiutato poiché ogni direzione può essere lunga).

Altri ancora scambiano x y e z in giro. Mi piace solo perché mantiene xey vicino a dove erano in 2D.

Alla fine devi impostare la tua convenzione. Metti in chiaro e atteniti ad esso.

Edit: How should I name 2D vs 3D sizes? Should I keep using height in 2D (y axis) even if in 3D height is for z axis?

Semplice, non farlo. Nel momento in cui cambi una delle associazioni precedentemente stabilite in 2D, sei destinato a creare confusione. Non c'è ripararlo. L'altezza 3D non può essere per l'asse z se l'altezza 2D è un'altra cosa.

Ora come ho detto, gli oggetti ruotano all'interno dell'asse. L'altezza non ha nulla a che fare con l'asse z a meno che non si verifichi di ruotare l'oggetto in modo che lo faccia. Se insisti che tutti gli oggetti siano inizializzati in quella rotazione, o che non ruotino mai, allora questa è una sfortunata incoerenza che si risolve più facilmente facendo allineare depth con l'asse z in 3D e gli altri due coerenti con 2D. Il che è esattamente ciò che le immagini che ho postato suggeriscono di fare.

Quello che sospetto che tu stia davvero cercando di fare è comunicare l'associazione che i 3 assi e i 3 parametri di dimensione hanno in quella posizione iniziale. Ci sono alcuni modi per farlo.

Implicitamente, usando la posizione del parametro

Position3D(x, y, z)  
Size3D(w, h, d)

In modo esplicito, commenti sugli usi:

data class Size3D( //Initial alignments: 
    val width: Int, //x axis
    val height: Int, //y axis
    val depth: Int //z axis
) 

Ma in nessun caso consiglierei il nome xAmount . Questo crea solo un diverso tipo di confusione. Se devi andare in questo modo usa il pattern name: xLength , yLength e zLength .

    
risposta data 16.02.2018 - 03:09
fonte
3

Può dipendere dal campo esatto in cui stai lavorando. Certamente nei giochi e nel cinema, ci riferiamo all'elemento di terza dimensione come profondità. Abbiamo persino buffer di profondità che memorizzano la distanza dal visualizzatore a un oggetto o un insieme di oggetti. Penserei che le applicazioni CAD farebbero lo stesso.

    
risposta data 16.02.2018 - 03:09
fonte

Leggi altre domande sui tag