L'obiettivo di questa sfida è quello di produrre un'animazione di un sistema di trasmissione a catena , composto da una serie di ruote dentate collegate tra loro da una catena .
Requisiti generali
Al programma verrà fornito un elenco di ruote dentate , specificate come (x, y, radius)
terzine. Il sistema di trasmissione a catena risultante è composto da questi pignoni, collegati tra loro da una catena tesa chiusa che passa su ciascuno di essi, in ordine . Il tuo obiettivo è produrre un'animazione a ciclo continuo , che mostri il sistema in movimento. Ad esempio, dato l'input
(0, 0, 16), (100, 0, 16), (100, 100, 12), (50, 50, 24), (0, 100, 12)
, l'output dovrebbe essere simile
.
Il sistema di coordinate dovrebbe essere tale che l'asse x sia rivolto verso destra e l'asse y sia rivolto verso l'alto. Si può presumere che i raggi siano numeri pari o maggiori di o uguali a 8 (vedremo perché questo è importante in seguito.) Si può anche presumere che ci siano almeno due ruote dentate e che le ruote dentate non si intersecano tra loro. Le unitàdell'input non sono troppo critici. Tutti gli esempi e i casi di test in questo post usano i pixel come unità di input (quindi, ad esempio, il raggio della ruota dentata centrale nella figura precedente è di 24 pixel;) cerca di non deviare troppo da queste unità. Nel resto della sfida, le quantità spaziali si intendono date nelle stesse unità dell'input: assicurati di mantenere le proporzioni giuste! Le dimensioni dell'output dovrebbero essere leggermente più grandi del rettangolo di selezione di tutti i pignoni, abbastanza grandi da rendere visibile l'intero sistema. In particolare, le posizioni assolute dei pignoni non dovrebbero influire sull'uscita; dovrebbero solo le loro posizioni relative (quindi, per esempio, se spostassimo tutte le ruote dentate nell'esempio sopra della stessa quantità, l'output rimarrebbe lo stesso.)
La catena deve essere tangente ai pignoni su cui passa in tutti i punti di contatto e diritta ovunque. La catena dovrebbe passare sopra i pignoni in modo tale che i segmenti di catena adiacenti (ovvero parti della catena tra due pignoni, che si incontrano sullo stesso pignone) non si intersecano .
.
Ad esempio, mentre il sistema di sinistra sopra è valido, quello di mezzo non lo è, poiché i due segmenti di catena adiacenti che passano sopra il pignone in basso a sinistra si intersecano. Tuttavia, si noti che il sistema giusto è valido, poiché i due segmenti di catena che si intersecano non sono adiacenti (questo sistema è prodotto da un input diverso rispetto agli altri due).
Per semplificare le cose (r), puoi presumere che nessun pignone interseca lo scafo convesso dei suoi due pignoni vicini, o gli scafi convessi di ciascuno dei suoi vicini e dell'altro vicino. In altre parole, il pignone superiore nel diagramma seguente potrebbe non intersecare nessuna delle regioni ombreggiate.
I segmenti di catena possono intersecare i pignoni diversi da quelli su cui passano (come nell'ultimo caso di prova). In questo caso, la catena dovrebbe sempre apparire davanti ai pignoni.
Requisiti visivi
La catena dovrebbe consistere in una serie di maglie di larghezza alternata. La larghezza del collegamento stretto dovrebbe essere di circa 2 e la larghezza del collegamento largo dovrebbe essere di circa 5. La lunghezza di entrambi i tipi di collegamenti dovrebbe essere circa uguale. Il periododella catena, ovvero la lunghezza totale di una coppia larga / stretta di maglie, dovrebbe essere il numero più vicino a 4π che si adatta a un numero intero di volte nella lunghezza della catena. Ad esempio, se la lunghezza della catena è 1.000, allora il suo periodo dovrebbe essere 12,5, che è il numero più vicino a 4π (12,566 ...) che si adatta a un numero intero di volte (80) in 1.000. È importante che il periodo si adatti a un numero intero di volte nella lunghezza della catena, in modo che non vi siano artefatti nel punto in cui la catena si avvolge.
Una ruota dentata di raggio R dovrebbe essere composta da tre parti concentriche: un asse centrale , che dovrebbe essere un cerchio di raggio circa 3; il corpo del pignone , attorno all'asse, che dovrebbe essere un cerchio di raggio intorno a R - 4.5; e il bordo del pignone , attorno al corpo, che dovrebbe essere un cerchio di raggio intorno a
R - 1,5. Il bordo dovrebbe contenere anche i denti del pignone , che dovrebbe avere una larghezza di circa 4; le dimensioni e la spaziatura dei denti devono corrispondere alle dimensioni delle maglie della catena, in modo che si incastrino perfettamente.
Il periodo dei denti del pignone, cioè la distanza tra due denti consecutivi lungo la circonferenza del pignone, dovrebbe corrispondere al periodo della catena. Poiché il periodo è di circa 4π, e poiché il raggio della ruota dentata è garantito pari, il periodo dovrebbe rientrare nella circonferenza della ruota dentata un numero quasi intero di volte, in modo che non vi siano artefatti evidenti nel punto in cui i denti del pignone si avvolgono.
È possibile utilizzare qualsiasi combinazione di colori per la catena, le diverse parti del pignone e lo sfondo, purché siano facilmente distinguibili . Lo sfondo potrebbe essere trasparente. Gli esempi in questo post usano
#202020
per la catena,
#868481
per l'asse e il cerchione
#646361
del pignone e per il corpo del pignone.
Requisiti di animazione
Il primo pignone nell'elenco di input dovrebbe ruotare in senso orario ; il resto dei pignoni dovrebbe ruotare di conseguenza. La catena dovrebbe muoversi ad una velocità di circa 16π (circa 50) unità al secondo; la frequenza dei fotogrammi dipende da te, ma l'animazione dovrebbe apparire abbastanza fluida.
L'animazione dovrebbe essere ripetuta senza interruzioni .
conformità
Alcuni degli attributi visivi e delle proporzioni sono intenzionalmente specificati solo approssimativamente, non è necessario abbinarli esattamente . L'output del tuo programma non deve essere una replica pixel per pixel degli esempi forniti qui, ma dovrebbe apparire simile. In particolare, le proporzioni esatte della catena e dei pignoni e la forma esatta delle maglie della catena e dei denti del pignone sono flessibili.
I punti più importanti da seguire sono questi:
- La catena dovrebbe passare sui pignoni, nell'ordine di immissione, dalla direzione corretta.
- La catena deve essere tangente ai pignoni in tutti i punti di contatto.
- Le maglie della catena e i denti dei pignoni devono essere ben disposti, almeno fino a correggere la spaziatura e la fase.
- La distanza tra le maglie della catena e i denti dei pignoni dovrebbe essere tale che non vi siano artefatti evidenti nel punto in cui si avvolgono.
- I pignoni devono ruotare nella direzione corretta.
- L'animazione dovrebbe essere ripetuta senza interruzioni.
Come nota finale, mentre, tecnicamente, l'obiettivo di questa sfida è quello di scrivere il codice più breve, se hai voglia di diventare creativo e produrre un output più elaborato, provaci!
Sfida
Scrivere un programma o una funzione , prendendo un elenco di ruote dentate e producendo un'animazione del sistema di trasmissione a catena corrispondente, come descritto sopra.
Ingresso e uscita
È possibile accettare l' input tramite la riga di comando , tramite STDIN , come argomenti di funzione o utilizzando un metodo equivalente . Puoi utilizzare qualsiasi formato utile per l'input, ma assicurati di specificarlo nel tuo post.
Come output , puoi visualizzare direttamente l'animazione , produrre un file di animazione (ad es. Una GIF animata) o produrre una sequenza di file di frame (tuttavia, in questo caso c'è una piccola penalità; vedi sotto). Se utilizzi l'output di file, assicurati che il numero di frame sia ragionevole (gli esempi in questo post usano pochissimi frame;) il numero di frame non deve essere minimo, ma non dovresti produrre troppi frame superflui. Se produci una sequenza di fotogrammi, assicurati di specificare la frequenza dei fotogrammi nel tuo post.
Punto
Questo è code-golf . La risposta più breve , in byte, vince.
+ 10% Penalità Se il tuo programma produce una sequenza di fotogrammi come output, invece di visualizzare direttamente l'animazione o produrre un singolo file di animazione, aggiungi il 10% al tuo punteggio.
Casi test
Test 1
(0, 0, 26), (120, 0, 26)
Test 2
(100, 100, 60), (220, 100, 14)
Test 3
(100, 100, 16), (100, 0, 24), (0, 100, 24), (0, 0, 16)
Test 4
(0, 0, 60), (44, 140, 16), (-204, 140, 16), (-160, 0, 60), (-112, 188, 12),
(-190, 300, 30), (30, 300, 30), (-48, 188, 12)
Test 5
(0, 128, 14), (46.17, 63.55, 10), (121.74, 39.55, 14), (74.71, -24.28, 10),
(75.24, -103.55, 14), (0, -78.56, 10), (-75.24, -103.55, 14), (-74.71, -24.28, 10),
(-121.74, 39.55, 14), (-46.17, 63.55, 10)
Test 6
(367, 151, 12), (210, 75, 36), (57, 286, 38), (14, 181, 32), (91, 124, 18),
(298, 366, 38), (141, 3, 52), (80, 179, 26), (313, 32, 26), (146, 280, 10),
(126, 253, 8), (220, 184, 24), (135, 332, 8), (365, 296, 50), (248, 217, 8),
(218, 392, 30)