Domanda

Mi chiedo se ho la quantità C di binari curvi e la quantità S di binari diritti, come potrei ideare un algoritmo (assistito dal computer o meno), per progettare un layout "casuale" utilizzando tutti quei binari, in modo tale che le seguenti regole sono soddisfatti:

1) I binari, quando sono tutti collegati, formano un anello chiuso (continuo) su cui il treno può girare.

2) Non sono consentite rampe, piegamenti dei binari, sobbalzi dei binari, attraversamenti dei binari.

3) C e S saranno entrambi numeri pari.Un esempio potrebbe essere C=20 e S=10.Tieni presente che sono necessarie 12 curve con lo stesso orientamento per realizzare un cerchio completo di 360 gradi, quindi almeno 12 di queste curve devono essere orientate nello stesso modo per completare i 360 gradi.Gli altri possono "zigzagare" purché il risultato netto sia di 360 gradi in modo che il treno compia un giro completo.

I binari diritti sono lunghi circa 10 pollici (25,4 cm) mentre i binari curvi sono lunghi circa 12,4 pollici (31,6 cm) (al centro, seguendo la curva) e curvano di 30 gradi.Le "cravatte" sui binari hanno una larghezza massima di 3 5/8 pollici (9,2 cm).Ho posizionato un binario diritto e uno curvo uno sopra l'altro e ho misurato che la curva da 12,4" (31,6 cm) ha 12" (30,5 cm) di lunghezza lineare (nella stessa direzione del rettilineo) e 3" (7,6 cm) di lunghezza lineare. di curvatura (nella direzione perpendicolare del rettilineo).Un cerchio 12C ha un diametro di 47,5" (120,6 cm) da centro a centro dei binari sui lati opposti.

Tutte le misurazioni sono approssimative.

AGGIORNAMENTO

Ho misurato nuovamente i binari utilizzandone molti di più per eliminare gli errori e, con mia grande sorpresa, la lunghezza dei rettilinei NON è di 10 pollici, sembra essere di circa 9,78 pollici.Ciò ha un impatto significativo sulla corrispondenza delle curve a zigzag con i rettilinei.Inizialmente pensavo che 4 curve a zigzag = 5 rettilinei ma non è del tutto corretto.4 curve hanno circa 47" di distanza lineare, quindi 5 rettilinei da 9,78" ciascuno sarebbero 48,9", quasi 2 pollici più lunghi.Quindi il trucco sta nel trovare il LCM (minimo comune multiplo) di 47 e 9,78.Risulta essere 235.235 = 47*5 e 235/9,78 = 24,028...(abbastanza vicino).Ciò significa che 20 curve a zigzag equivalgono praticamente a 24 rettilinei in lunghezza lineare.Fortunatamente ho 26 scale, quindi ce l'ho fatta a malapena.I 2 rimanenti possono essere facilmente posizionati altrove nel layout.

Un'altra cosa che ho scoperto è che se zigzago le curve 2 con lo stesso orientamento alla volta (OOCCCCOO), allora 8 di queste hanno una distanza lineare di soli 83 pollici, non 94 pollici come se alterno le curve (OCCOOCCO).L'LCM di 83 e 9,78 è di circa 166.Quindi 16 di queste curve hanno la stessa lunghezza lineare di 17 rettilinei.È utile saperlo perché ho 44 curve e solo 26 rettilinei, ma se faccio questa sostituzione posso aiutare a rimediare.

Se zigzago le curve 3 alla volta (OOOCCCCCCOOO) e le piego leggermente, posso ottenere l'esatta lunghezza lineare di 10 rettilinei (circa 97,8 pollici).

FINE AGGIORNAMENTO

Quindi il programma per computer dovrebbe creare un modello geometrico e ricordare le posizioni esatte di ciascuna traccia o esiste un modo più semplice per codificarlo?Voglio essere in grado di "premere un pulsante" e il computer "sputa fuori" un "nuovo" layout valido per me.

Voglio dare questo algoritmo funzionante ai bambini che usano i treni, in modo che non si sentano frustrati nel provare un layout che non funziona e poi provano a piegare i binari per farlo funzionare o devono tralasciare alcuni pezzi di binario perché non si adattano.Un computer può creare un layout valido utilizzando tutte le tracce e, se l'algoritmo è buono, forse in pochi secondi.Questo per aiutare a prevenire la frustrazione per loro.

Ho alcune capacità di programmazione, ma devo conoscere un algoritmo prima di poter codificare qualcosa di significativo (a parte semplicemente testare alcune parti di un algoritmo candidato)

Quello che sto pensando è che potrei fare in modo che il computer modelli le tracce utilizzando una rappresentazione più piccola (ridotta).Penso che potrebbe quindi semplicemente "posizionare" le tracce nel layout candidato e verificare la presenza di collisioni con altre tracce già presenti.

Penso che probabilmente ci siano modi migliori per farlo, ecco perché chiedo qui qualche aiuto/idee.Voglio davvero che funzioni e ho le tracce qui in modo da poterle utilizzare per verificare se l'algoritmo funziona.

Possiamo usare C=20 e S=10 come parametri per provare a risolvere questo problema perché si tratta di un numero di tracce ragionevolmente piccolo (30 in totale).Presumo che se l'algoritmo è sufficientemente robusto, i valori C e S possono essere modificati a piacimento e funzionerà comunque.Ad esempio, eventualmente voglio provare C=44 e S=26.

Parola finale

Grazie a tutti per i vostri commenti e suggerimenti riguardo a questa domanda.Anch'io ho imparato molto.Da bambino non ho mai pensato molto ai binari del treno e al modo in cui si incastrano, ma da adulto capisco che generare/capire quanti diversi (unici) tracciati di binari è un problema geometrico affascinante e un problema di conteggio matematico molto difficile. ci sono.Spero che questo esercizio ti sia piaciuto tanto quanto me.Anche i bambini lo apprezzano.

Fine Parola finale

È stato utile?

Soluzione

Ho pensato che avrei offerto la soluzione di forza bruta.

L'idea è quella di provare ogni singolo layout della traccia a turno. Quando si costruisce un layout, ci sono solo tre pezzi che devono essere presi in considerazione: una curva mancino, una curva a mano destra e una scala.

È possibile codificare il layout della traccia come numero di base 3 con una larghezza corrispondente al numero di pezzi nel layout. Per enumerare tutti i layout della traccia solo contare nella base 3, dove la codifica va 0= dritto, 1= sinistra e 2= destra.

La fase successiva è controllare che il layout si unisce ad entrambe le estremità. Il primo controllo è quello di assicurarsi che ci siano abbastanza curve per andare un circuito completo. Se scegliamo un senso in senso antiorario per un circuito, sono necessarie 12 curve a sinistra. Per ogni curva extra destra, dobbiamo aggiungere la curva extra sinistra. Quindi, per verificare che il layout particolare potrebbe funzionare, basta aggiungere il numero di curve a sinistra e sottrarre il numero di curve corrette: questo deve essere uguale a 12.

Infine, dobbiamo controllare le estremità in realtà. Semplice semplicemente la traccia su una griglia cartesiana. Iniziamo l'origine a [0,0] e se finisce a [0,0], allora si unisce.

Il modo più semplice per tracciare la traccia è logo stile. In altre parole manteniamo un vettore di direzione che punta nella direzione dell'ultimo brano posato. Se vogliamo una curva sinistra, quindi ruotare la direzione di 30 gradi e per una curva destra ruota di -30 gradi - una retta non influisce sulla direzione.

Per tracciare effettivamente le curve e dritto, riduciamo il vettore di direzione per le dimensioni del pezzo, cioè 10 unità per un diritto e 12.4 x 12/2 x PI (raggio di completa traccia circolare) per una curva .

Caveats

A causa degli errori di arrotondamento nell'aggiunta di numeri del punto flottante, il tracciamento non è esatto. E nella vita reale possiamo lasciare un po 'di wiggle room per le estremità da incontrare, quindi questo deve essere soddisfatto.

Molti layout saranno gli stessi, ma spostati da una posizione. Non riesco a vedere un modo per escludere i layout duplicati spostati oltre a mantenere quelli precedenti e controllare contro di loro.

L'algoritmo non esclude i layout dove pezzi croce. Per farlo, dovresti verificare che ogni pezzo in un layout non attraversa un altro pezzo nel layout (questo è o (n ^ 2)). E ci dovrebbero essere assegni per curva curva, curva-dritto e cross-dritto, e che inizia a diventare molto complesso.

Il tempo di esecuzione dell'algoritmo è ovviamente o (3 ^ n) che è esponenziale - e probabilmente impraticabile per layout molto grandi.

Sotto il codice VBA è possibile incollare in Excel per darti la prova del concetto. Ho deliberatamente cercato di mantenere il codice il più semplice possibile per aiutare la conversione alla tua lingua preferita. Qualsiasi domanda, non esitate a chiedere.

Option Explicit

Type Vector
    X As Double
    Y As Double
End Type

Sub GenerateTrackLayout()
    Dim lCounts(40) As Long
    Dim lColumn As Long
    Dim lTrackLength As Long
    Dim lCurveSum As Long
    Dim lIndex As Long
    Dim lIndex2 As Long
    Dim vDirection As Vector
    Dim vBase As Vector
    Dim vTrackPosition As Vector
    Dim fPI As Double
    Dim fCurveRadius As Double
    Dim fStraightLength As Double
    Dim sPath As String
    Dim lOutputRow As Long
    Const TOLERANCE = 0.5 'inch

    lOutputRow = 1

    vBase.X = Sqr(3) / 2 ' 30 degrees
    vBase.Y = 1 / 2 ' 30 degrees

    fPI = 4 * Atn(1)
    fCurveRadius = 12.4 * 12 / (2 * fPI)
    fStraightLength = 10

    lTrackLength = 12 ' initial track length

    Application.ScreenUpdating = False

    Do
        ' Check for closed track
        lCurveSum = 0

        For lIndex = 0 To lTrackLength - 1
            If lCounts(lIndex) = 1 Then
                lCurveSum = lCurveSum + 1
            ElseIf lCounts(lIndex) = 2 Then
                lCurveSum = lCurveSum - 1
            End If
        Next

        If lCurveSum = 12 Then ' one 360 degree rotation anti-clockwise
            vDirection.X = 0
            vDirection.Y = 1
            vTrackPosition.X = 0
            vTrackPosition.Y = 0

            ' Plot the track and ensure that ends meet
            For lIndex = 0 To lTrackLength - 1
                Select Case lCounts(lIndex)
                    Case 0 ' straight
                        vTrackPosition = AddVectors(vTrackPosition, ScaleVector(vDirection, fStraightLength))
                    Case 1 ' left curve
                        vDirection = MultiplyVectors(vDirection, vBase, 1)
                        vTrackPosition = AddVectors(vTrackPosition, ScaleVector(vDirection, fCurveRadius))
                    Case 2 ' right curve
                        vDirection = MultiplyVectors(vDirection, vBase, -1)
                        vTrackPosition = AddVectors(vTrackPosition, ScaleVector(vDirection, fCurveRadius))
                End Select

                ' If ends meet within tolerance then output the track
                If Abs(vTrackPosition.X) < TOLERANCE Then
                    If Abs(vTrackPosition.Y) < TOLERANCE Then
                        If lIndex = (lTrackLength - 1) Then
                            sPath = ""
                            For lIndex2 = 0 To lIndex
                                Select Case lCounts(lIndex2)
                                    Case 0 ' straight
                                        sPath = sPath & "S"
                                    Case 1 ' left
                                        sPath = sPath & "L"
                                    Case 2 ' right
                                        sPath = sPath & "R"
                                End Select
                            Next
                            Application.ScreenUpdating = True
                            Cells(lOutputRow, 1).Value = sPath
                            Application.ScreenUpdating = False
                            lOutputRow = lOutputRow + 1
                        End If
                    End If
                End If
            Next
        End If

        ' Count in base 3 where number width is Track Length
        lColumn = 0
        Do
            lCounts(lColumn) = lCounts(lColumn) + 1
            If lCounts(lColumn) = 3 Then
                lCounts(lColumn) = 0
                lColumn = lColumn + 1
            Else
                Exit Do
            End If
        Loop Until lColumn = lTrackLength

        ' We've tried all tracks of this length, next one up...
        If lColumn = lTrackLength Then
            Erase lCounts ' reset all columns to zero
            lTrackLength = lTrackLength + 1
        End If
        DoEvents
    Loop
End Sub

' Vector maths

Function MultiplyVectors(vVectorA As Vector, vVectorB As Vector, ByVal fConjugate As Double) As Vector
    MultiplyVectors.X = vVectorA.X * vVectorB.X - fConjugate * vVectorA.Y * vVectorB.Y
    MultiplyVectors.Y = vVectorA.Y * vVectorB.X + fConjugate * vVectorA.X * vVectorB.Y
End Function

Function AddVectors(vVectorA As Vector, vVectorB As Vector) As Vector
    AddVectors.X = vVectorA.X + vVectorB.X
    AddVectors.Y = vVectorA.Y + vVectorB.Y
End Function

Function ScaleVector(vVector As Vector, ByVal fScale As Double) As Vector
    ScaleVector.X = vVector.X * fScale
    ScaleVector.Y = vVector.Y * fScale
End Function
.

Altri suggerimenti

In primo luogo, una sfida del frame:

.

Un computer può creare un layout valido utilizzando tutte le tracce e se l'algoritmo è buono, forse in pochi secondi

Non è necessario l'algoritmo da eseguire in pochi secondi. Hai bisogno di un'uscita in pochi secondi. Non vedo che c'è qualcosa che ti fermano dall'impostazione di un cruncher di layout della forza bruta in esecuzione su un computer nell'angolo e memorizzare soluzioni in un database da cui l'UI può quindi selezionare i layout casuali.


.

In termini di generazione, ci sono un certo numero di approcci semi-standard. Lo spazio dello stato è piuttosto grande, quindi una ricerca esauriente potrebbe non essere fattibile. Ma qualcuno dei seguenti potrebbe valere la pena provare:

    .
  • Puro mischia casuale di un elenco di rettilinei e numeri uguali di curve sinistro e destro, seguite da test "bontà".
  • Arrampicata a collina: iniziare con una permutazione casuale, quindi testare semplici swap per vedere se migliorano la "bontà". Se lo fanno, rendono lo swap e la ripetizione.
  • ricottura simulata: simile, ma a volte consente cambiamenti che riducono la "bontà" nella speranza di arrivare a una collina migliore.
  • Algoritmo genetico: genera un sacco di permutazioni casuali e mescoli ripetutamente e mantengono i migliori risultati. Non è completamente chiaro come mescolarli, però.
  • quest'ultimo tre potrebbe iniziare con curve "conosciute buone" generate da inserzioni in un cerchio.
  • Esplora le opzioni per Meet-in-the-Middle. Per esempio. Genera tutte le curve con un angolo totale di +90 °, indicilizzarli del vettore 2D tra gli endpoint, e se ci sono molti meno vettori rispetto alle curve potresti essere in grado di considerare esaurienti i quadruplificati di loro per trovare quelli che formano un quadrilatero chiuso .

Per il test "bontà", ovviamente ha bisogno di essere una grande penalità se la curva non è chiusa. Inoltre è necessario essere una grande penalità per auto-sovrapposizioni. Sarei inclinato a testare quelli usando un quad-tree per trovare segmenti che non sono consecutivi ma sono vicini l'uno all'altro, e poi gli ARC-ARC, le prove di intersezione ARC-ARC, ARC-LINE e Line-Line Intersection Test per vedere se qualsiasi bordo delicato di un segmento si sovrappone a un bordo delimitato un altro.


.

Un'altra strategia che potrebbe essere in grado di forzare completamente bruta il caso più piccolo, ma non il più grande sarebbe quello di prendere un approccio algebrico al vettore totale. Lasciare che la lunghezza del pezzo dritto sia $ 2 \ ell $ e il raggio del pezzo curvo essere $ 2R $ . Poiché gli orientamenti sono tutti multipli di 30 gradi, il vettore tra le estremità di un pezzo dritto è in $$ (0, \ PM 2 \ Ell), (\ PM 2 \ Ell, 0), (\ pm \ ell, \ pm \ sqrt3 \ ell), (\ pm \ sqrt3 \ ell, \ pm \ ell) $$ e allo stesso modo il vettore tra le estremità di un pezzo curvo è in < Span Class="Math-Container"> $$ (\ PM R, \ PM \ SQRT3 R), (\ PM \ SQRT3 R, \ PM R), (\ PM (\ SQRT3 - 1) R, \ PM (\ SQRT3 - 1) r)) $$

A. o $ \ frac \ ell {\ sqrt 3 r} $ è una frazione con un piccolo numeratore e un piccolo denominatore, curve e rettilinei sono indipendenti, Così puoi trovare set di curve di lavoro (la forza bruta è sufficiente per 20 curve di cui 16 sono in una direzione e 4 sono nell'altra; per 44 curve divise 28-16 hai bisogno di un approccio migliore; Non ho lavorato attraverso il Implicazioni di richiedere la $ + \ SQRT 3 $ s Per avere un numero corrispondente di $ - \ sqrt 3 $ s, ma potrebbero consentire un filtraggio pesante) e quindi inserire direttamente in coppia. L'applicazione con la forza bruta per un piccolo numero di curve ti consentirebbe di valutare quanti layout che stai potenzialmente perdendo con l'approccio simmetrico.

Una possibile soluzione per renderlo il più semplice possibile e ottenere rapidamente un algoritmo funzionante sarebbe il seguente.Il layout più semplice è ovviamente 12C (12 binari curvi tutti con lo stesso orientamento (relativo l'uno all'altro) e che formano un cerchio semplice.Questa sarà la base su cui costruiremo.

Quindi l'algoritmo di base sarà quello di mantenere il layout del ciclo continuo a 360 gradi in ogni fase durante l'aggiunta delle tracce.Possiamo farlo esaminando quanti binari curvi ci restano e aggiungendoli al layout in gruppi in modo tale da mantenere la proprietà a 360 gradi.Ad esempio, inizia con il nostro layout 12C (un semplice cerchio).Sappiamo che abbiamo 20C in totale, quindi ci restano 8C.L'aggiunta più semplice tra alcune di quelle che manterrebbero la proprietà a 360 gradi sarebbe quella di aggiungere una curva di orientamento inverso e una stessa curva di orientamento (la stessa del cerchio principale con cui abbiamo iniziato).Dovremmo quindi fare lo stesso sul lato opposto del layout.In questo semplice esempio, avremmo aggiunto altre 4 curve alla disposizione del cerchio in modo che 12C diventi 16C (con 4C rimanenti).Continueremo a posizionare le curve finché tutte e 20 (in questo esempio) non saranno posizionate correttamente.Si noti che questo layout costituito da tutte le curve è un layout a circuito chiuso valido.Il treno può utilizzare questo layout, tuttavia è costituito da tutti i binari curvi, quindi non abbiamo ancora finito.

I binari diritti verrebbero quindi inseriti nello stesso modo, tranne che possono essere aggiunti in coppia (2 binari) poiché non modificano la proprietà a 360 gradi.Possono essere inseriti ovunque quindi penso che sarebbe meglio posizionare prima TUTTI i binari curvi, poi tornare indietro ed effettuare un secondo passaggio per posizionare i rettilinei in modo casuale (ma simmetricamente).

Questo è l'algoritmo più semplice a cui riesco a pensare per ora.È garantito che produca un circuito chiuso a 360 gradi, un tracciato simmetrico e, presupponendo che il numero di curve sia multiplo di 4 e il numero di rettilinei sia multiplo di 2, utilizzerà ogni singolo tracciato.

Una cosa da considerare, tuttavia (quando si utilizza questo algoritmo su un computer o semplicemente nella mente mentre si costruisce il layout), è che potrebbero esserci restrizioni di spazio maggiori in una direzione rispetto all'altra.Ad esempio, su un patio lungo, ma non così largo.Quando si utilizza l'algoritmo, questo dovrebbe essere sbilanciato maggiormente verso la dimensione lunga di dove verrà assemblato il layout.

Se qualcuno riuscisse a trovare un algoritmo per formare un layout asimmetrico utilizzando tutte le tracce, sarebbe ancora più impressionante.

La differenza di complessità tra la soluzione più semplice e quella più complicata è sconcertante.Iniziare con un cerchio (12C) è semplice quanto lo è per questo problema ed è ragionevole per i bambini, tuttavia è molto interessante analizzare una soluzione generica in grado di produrre QUALSIASI layout valido (compresi quelli asimmetrici).

In realtà, un algoritmo non informatico consisterebbe semplicemente nell'aggiungere alcune forme "interessanti" al layout e avvicinarle alla connessione, quindi tornare indietro e regolarle in modo che si connettano effettivamente (per un ciclo chiuso).Con 70 pezzi di binari in totale (44C e 26S), è possibile un layout enorme.Ho calcolato un totale di circa 67 piedi di pista ovvero circa 20 metri.Il treno dovrebbe impiegare circa 1 minuto per percorrere l'intero tracciato una volta.

Un'altra soluzione candidata sarebbe prendere le misure effettive di ogni binario e ricordare il bordo più a destra del tracciato.Quando si costruisce il layout, è possibile iniziare con un binario diritto o con una curva a sinistra (in senso antiorario), accumulando la distanza dell'ultimo binario aggiunto dal bordo più a destra, e poi quando si aggiungono altri binari, non consentendo mai una combinazione di binari che urtare o attraversare il bordo più a destra o magari non avvicinarsi nemmeno.Quindi, ad esempio, inizia con un binario rettilineo (nessun cerchio iniziale 12C su questa soluzione candidata), quindi scegli a caso un altro pezzo di binario.Nota fin dall'inizio NON consentiremo una svolta a destra (in senso orario), poiché ciò infrangerebbe la regola di "attraversare" il bordo più a destra.Dopo il primo rettilineo, le nostre uniche opzioni sono un altro rettilineo o una curva a sinistra (in senso antiorario).Un'altra regola da applicare sarebbe che dopo un rettilineo non è consentito aggiungere più di 9 curve dello stesso orientamento di fila, altrimenti è probabile che si incontrino/attraversino altri binari già esistenti.Questo limite potrebbe anche essere ridotto a 8 per avere più spazio e, se ciò accade, la pista successiva DEVE essere una curva orientata in senso inverso (poiché un rettilineo può causare problemi).

Questo algoritmo avrebbe bisogno di aiuto per tornare indietro e connettersi all'altro lato del primo pezzo di traccia aggiunto.Possiamo farlo insistendo sul fatto che le curve in senso antiorario contano come +1 e le curve in senso orario contano come -1, e queste devono sommarsi fino a 12 sull'ultima curva aggiunta.Possiamo aiutarlo modificando le curve CC (in senso antiorario) con un rapporto 4:1 con le curve in senso orario, in modo che sia probabile che otteniamo 16 CC e 4 in senso orario, il che creerà effettivamente un cerchio di 360 gradi.Se l'algoritmo tenta di aggiungere una curva CC ma urta i binari esistenti, a quel punto abbiamo 2 opzioni: provare una curva con orientamento opposto o abbandonare il layout e ricominciare da capo.Penserei che su un computer veloce, alla fine otterrà un buon layout.

Non sono ancora sicuro che questo metodo produrrebbe tutti gli stessi layout iniziando con 12C, ma forse potrebbe essere più semplice da implementare su un computer poiché ci sono solo poche regole da applicare e stiamo costruendo il layout su una traccia Al tempo.

In realtà, ho appena pensato a a Terza possibile soluzione candidata dovrebbe funzionare e non è troppo difficile da implementare.Funziona come segue.

Usa la tecnica sopra descritta, ma realizza solo un mezzo tracciato (utilizzando metà dei binari di ogni tipologia, quindi 10 curve e 5 rettilinei.Chiediamo al computer di scegliere binari casuali ma accettiamo solo layout che terminano con una curva netta di 180 gradi a sinistra (perché stiamo imponendo un confine destro che nessuna pista può toccare o attraversare.Ok, quindi supponiamo che il computer trovi molto rapidamente un "mezzo layout" valido.Quindi quello che facciamo è semplicemente fare un inventario di quante curve in senso orario e antiorario ci sono, e duplicarle nell'altra metà del tracciato (ma non necessariamente simmetricamente).Per i rettilinei, dobbiamo registrare con quale angolo sono stati inseriti e poi abbinarli nell'altra metà della pista, ma ancora una volta, non necessariamente simmetricamente.

Proviamo un esempio utilizzando S per Straight, O per curva in senso antiorario e C per curva in senso orario.Concentrarsi prima sulla metà del layout.

Il primo binario rettilineo si allontanerà da noi e questo definisce il nostro bordo più a destra che non possiamo attraversare.

SOOSOCSOOSSOOOC - Questo è un mezzo layout valido poiché presenta 5 rettilinei e 10 curve con un totale di 6 curve in senso antiorario (2 delle 8 sono state "annullate da 2 curve in senso orario).

Ora dobbiamo "tenere sotto controllo" l'angolo a cui sono stati inseriti i rettilinei e abbinare quelli con lo stesso angolo (ma direzione opposta) per "annullarli".

1:Rette con angolo di 0 gradi
0:Rettilinee con angolo di 30 gradi
2:Rettilinei con angolo di 60 gradi
0:Rettilinee ad angolo di 90 gradi
2:Rettilinei con angolo di 120 gradi
0:Rettilinee ad angolo di 150 gradi
0:Rettilinee ad angolo di 180 gradi

Quindi, per "abbinarlo" all'altra metà del layout e fare in modo che si colleghi al singolo rettilineo iniziale, dobbiamo solo abbinare lo stesso numero di O e C, ma anche abbinare lo stesso numero di rettilinei al + Angolo di "ritorno" di 180 gradi.Ad esempio, un rettilineo di 60 gradi è meglio avere un rettilineo di 240 gradi da qualche parte sull'altro lato del tracciato, non necessariamente esattamente opposto.Questo perché il rettilineo di 60 gradi andrà principalmente a sinistra e leggermente in alto (usando questo schema) e il rettilineo di 240 gradi lo riporterà a destra e indietro della stessa quantità per "annullare" efficacemente i contributi di quei 2 binari a deviando dalla posizione della traccia iniziale.

Quindi ora tutto ciò che dobbiamo fare per creare la "metà mancante" del layout è prendere i binari conosciuti di cui abbiamo bisogno (e sapere con quali angoli devono essere i rettilinei) e semplicemente "mescolarli" in qualsiasi ordine.

Potrebbe esserci un modo per NON dover far corrispondere esattamente la metà del layout con le tracce "complementari" sull'altro lato, ma ciò comporterebbe calcoli più complessi e probabilmente non c'è abbastanza tempo per risolverlo nel tempo in cui la taglia è attiva per.C'è anche la possibilità che non tutti i binari vengano utilizzati in questo modo e che sarebbe necessaria una leggera curvatura del binario.Possiamo ignorare questa proprietà speciale per questa domanda.

In realtà ho realizzato una traccia asimmetrica per vedere se avrebbe funzionato e sembra che abbia funzionato.Usando S per rettilineo, O per curva in senso antiorario e C per curva in senso orario, più l'angolo (in gradi) relativo al rettilineo iniziale, ho ottenuto quanto segue per la metà superiore:

S0, O30, O60, S60, O90, C60, S60, O90, O120, S120, S120, O150, O180, O210, C180

Per la metà inferiore della traccia ho ottenuto:

O210, O240, S240, C210, O240, S240, O270, O300, S300, S300, O330, O360, O390, C360, S360

In realtà la foto è stata scattata dal lato sbagliato, quindi la parte superiore e quella inferiore sono invertite.Il primo binario tracciato era il rettilineo vicino al bidone della spazzatura blu e veniva verso chi guarda l'immagine, mentre il secondo binario è la curva in senso antiorario.

enter image description here

Sembra che questa tecnica funzionerebbe per molti numeri pari di curve e numeri pari di rettilinei, inclusi 44C e 26S che è il mio obiettivo finale.Questo è davvero incoraggiante dal momento che un computer elettronico non è realmente necessario per risolvere questo problema, posso semplicemente chiedere ai bambini di costruire praticamente qualsiasi forma di semicerchio che desiderano con metà dei binari (22C e 13S), quindi "correggere" il loro design in modo che sia di 180 gradi, quindi "abbina" l'altro lato della pista, non necessariamente simmetricamente.

Dovresti fare attenzione se dovessi creare un mezzo layout a 180 gradi in cui la traccia iniziale e quella finale sono molto vicine tra loro.Ad esempio, la forma della parte superiore di un punto interrogativo "?" (senza il punto) ma continua quella curva superiore in modo che arriva più e un dritto che scende da che sarebbe molto vicino alla dritta che è al di sopra del punto in cui si trovava il punto.Quindi per la metà inferiore, NON potresti fare più curve in senso antiorario subito poiché ci sono altri rettilinei lì dalla "metà superiore".L'immagine del mio layout a circuito chiuso ha funzionato perché non avevo "colli di bottiglia" nella metà "superiore", ma ovviamente ciò è possibile come ho appena descritto.

Il layout "problematico" del treno è quando metà del binario ha una forma a clessidra con una parte centrale stretta.In questo caso bisogna quasi "specchiare" la parte superiore perché certe curve non possono essere fatte perché i binari sono così vicini tra loro.Ecco un esempio...

enter image description here

Un'altra osservazione interessante è che 4 binari curvi a zigzag sostituiscono quasi esattamente (per quanto riguarda la distanza lineare) 5 rettilinei.Tuttavia, troppi di questi creeranno una differenza significativa in termini di lunghezza.Come indicato nella sezione AGGIORNATA sopra, 20 curve a zigzag corrispondono quasi esattamente (per la distanza lineare) a 24 rettilinei.

enter image description here

Usando questa tecnica, è possibile realizzare un layout gigante con tutti i 70 pezzi di binario.Inizierebbe con un cerchio 12c, quindi su un lato, potrei inserire 24 rettilinei (lunghe 240 pollici).Sul lato lungo opposto del layout (per corrispondere quasi alla lunghezza del lato dritto), utilizzerei 20 curve a zigzag (anch'esse lunghe circa 240 pollici).Dovrebbero quasi allinearsi e una leggera piegatura dovrebbe farlo funzionare.I restanti binari (2 diritti e 12 curvi) potrebbero essere facilmente posizionati per mantenere il layout "equilibrato" (e collegato).

Supponiamo che inizi al punto (0, 0) andando dritto a destra. È necessario aggiungere tracce fino a raggiungere il punto (0, 0) di nuovo, questa volta direttamente da sinistra. Ci sono due problemi qui: uno è quello di raggiungere il punto (0, 0) proveniente da sinistra esattamente . L'altro è non avere sovrapposizioni.

Per formare un cerchio antiorario avrai bisogno di 12 pezzi curvi che si girano a sinistra. Questi formano un cerchio esatto. Con 0 o 24 o 36 pezzi curvi avresti una figura otto o due o tre cerchi, nessuno dei quali può essere fatto senza attraversare.

E naturalmente è possibile aggiungere tracce aggiuntive, e queste devono seguire alcune regole: è possibile aggiungere pezzi curvi a sinistra, dritti e a destra in coppie che iniziano da angoli di x gradi e x + 30 gradi, quindi tu Torna a 0,0. E il numero di pezzi curvi a sinistra oltre i primi 12 deve corrispondere al numero di pezzi curvi a destra in modo che i pezzi corrispondano all'angolo destro a 0,0.

Quindi questo è il pezzo che puoi usare. Devi verificare che non ci siano incroci ovviamente.

Se le lunghezze sono esattamente giuste, potrebbe essere che, ad esempio, una combinazione sinistra / destra / destra / sinistra copre la stessa distanza di quattro o cinque rettilinei, quindi potrebbero essere consentite alcune altre combinazioni.

e ovviamente tracce sono Bendy, che possono produrre molte più possibilità.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a cs.stackexchange
scroll top