Come si implementano solitamente i triangoli rettangoli nella programmazione

1

Quando voglio implementare rettangoli 2d allineati agli assi, passo sempre con {x, y, w, h} , perché questo è l'approccio naturale ad esso. Con i rettangoli allineati sugli assi 3D hai bisogno di {x, y, z, w, h, d(depth)} . Per un triangolo 2d ho bisogno di {x1, y1, x2, y2, x3, y3} . Ma cosa mi serve per triangoli rettangoli allineati sull'asse. Come li conserveresti?

Posso immaginare di andare con gli stessi dati di un rettangolo e poi un numero da 0 a 3 che indica quale punto è opposto all'ipotenusa. Posso anche immaginare di andare con {x, y, w, h} , dove w e h possono essere negativi (opposti ai normali rects).

Qual è l'approccio comune all'implementazione dei triangoli rettangoli?

EDIT:

Bene, alla fine ho deciso di andare con {x, y, w, h, r} , dove w, h > = 0 e r sono i radianti. Quindi in un primo momento posso concentrare r = {0, pi/2, pi, 3pi/2} e se voglio diventare pazzo in seguito, posso farlo senza rompere la mia interfaccia.

    
posta hgiesel 24.01.2017 - 04:36
fonte

3 risposte

6

Non esiste un "approccio comune", perché questo non è un requisito che si verifica così frequentemente da richiedere uno standard speciale. Quindi scegli una soluzione adatta alle tue esigenze come quella che hai suggerito:

{x, y, w, h}, where w and h is allowed to be negative

Questa è in realtà la prima idea che mi è venuta in mente quando ho visto la tua domanda, quindi perché non ci provi?

Notare che se si implementa questo come un tipo di dati astratto o una classe Triangle , questi quattro valori sono necessari solo come rappresentazione di archiviazione interna e non è necessario che l'API della propria classe esponga i suoi interni. Ad esempio, l'API può fornire metodi per interrogare le coordinate dei 3 angoli in modo uniforme, senza che l'utente di quell'API veda che un angolo è memorizzato internamente "diversamente" dagli altri due. Quindi, se successivamente arrivi al punto in cui ritieni che la rappresentazione interna sia stata scelta in modo non ottimale, puoi facilmente modificarla in un secondo momento senza dover modificare il codice che utilizza l'API.

Quindi non pensare troppo alla rappresentazione interna, meglio investire un po 'di tempo nella progettazione della tua API.

    
risposta data 24.01.2017 - 07:59
fonte
3

Un triangolo di solito viene implementato memorizzando 3 coordinate per i 3 angoli. Qualsiasi triangolo, cioè indipendentemente dal fatto che sia 2D o 3D, giusto, acuto, equilatero, ottuso o che abbia qualsiasi proprietà a cui potresti pensare.

Di solito, non c'è alcun reale bisogno di triangoli rettangoli allineati sull'asse del caso speciale, perché non hanno molte proprietà speciali rispetto ad altri triangoli (oltre a essere in grado di interpretarlo come metà di un rettangolo allineato all'asse, ma perché non usi un rettangolo in questo caso?).

Al contrario, ci sono alcuni problemi se permetti solo triangoli rettangoli allineati sull'asse:

  • gli spazi tra i triangoli rettangoli allineati all'asse non possono sempre essere riempiti con altri triangoli rettangoli allineati sull'asse.
  • se vuoi salvare i byte riducendo i dati memorizzati, introduci alcune convenzioni che non sono sempre ovvie e che potrebbero portare a bug in seguito (guarda la tua idea "intelligente" di memorizzare la larghezza o l'altezza negative: potresti facilmente introdurre un bug che calcola i valori delle aree negative!)

Se pensi che il tuo caso d'uso sia abbastanza speciale da trarre profitto da una diversa implementazione interna, potresti sceglierne uno. In tal caso, assicurati di documentare le convenzioni introdotte (e, come sempre, prova a mantenere l'API dalla divulgazione dei dettagli di implementazione, soprattutto nel caso in cui sia necessario cambiare la suddetta implementazione in un secondo momento)

    
risposta data 24.01.2017 - 05:50
fonte
1

Per i rettangoli allineati agli assi , di solito passo con {x1, y1, x2, y2} definendo (o) una delle sue diagonali. Si noti che questo definisce in modo univoco un rettangolo allineato agli assi. E quindi definisce anche due triangoli rettangoli (allineati sull'asse), con diagonale ~ ipotenusa. Per definire univocamente solo uno, applica qualcosa come la "regola della vite a destra", ovvero, mano aperta, palmo rivolto verso l'alto, punta il pollice destro nella direzione da {x1, y1} a < strong> {x2, y2} , quindi le dita puntano verso l'angolo retto.

    
risposta data 24.01.2017 - 12:10
fonte

Leggi altre domande sui tag