Как разработать алгоритм для генерации случайной, но допустимой схемы расположения железнодорожных путей?

cs.stackexchange https://cs.stackexchange.com/questions/117972

Вопрос

Мне интересно, есть ли у меня количество C изогнутых дорожек и количество S прямых дорожек, как я мог бы разработать алгоритм (с помощью компьютера или нет) для разработки "случайного" макета с использованием всех этих дорожек, чтобы выполнялись следующие правила:

1) Рельсы, когда все они соединены, образуют замкнутый (непрерывный) контур, по которому поезд может двигаться по кругу.

2) Пандусы, изгибы путей, неровности путей, пересечение путей - все это запрещено.

3) C и S оба будут четными числами.Примером может служить C =20 и S = 10.Обратите внимание, что требуется 12 кривых в одинаковой ориентации, чтобы сделать полный круг в 360 градусов, поэтому по крайней мере 12 из этих кривых должны быть ориентированы одинаково, чтобы завершить 360 градусов.Остальные могут двигаться "зигзагом" до тех пор, пока конечный результат не достигнет 360 градусов, так что поезд совершит полную петлю.

Длина прямых дорожек составляет около 10 дюймов (25,4 см), а изогнутых дорожек - около 12,4 дюймов (31,6 см) (по центру, следуя изгибу) и изгибается под углом 30 градусов."Стяжки" на направляющих имеют максимальную ширину 3 5/8 дюйма (9,2 см).Я наложил прямую и изогнутую дорожки друг на друга и измерил, что кривая 12,4 дюйма (31,6 см) имеет 12 дюймов (30,5 см) линейной длины (в том же направлении, что и прямая) и 3 дюйма (7,6 см) изгиба (в перпендикулярном направлении прямой).Круг 12С имеет диаметр 47,5 дюйма (120,6 см) от центра к центру дорожек на противоположных сторонах.

Все измерения являются приблизительными.

Обновить

Я заново измерил дорожки, используя гораздо больше из них, чтобы устранить ошибки, и, к моему некоторому удивлению, длина прямых линий СОСТАВИЛА НЕ 10 дюймов, а около 9,78 дюйма.Это оказывает существенное влияние на соответствие зигзагообразных кривых прямым.Первоначально я думал, что 4 зигзагообразных изгиба = 5 прямых, но это не совсем верно.4 кривых имеют линейное расстояние около 47 дюймов, поэтому 5 прямых по 9,78 дюйма каждая будут на 48,9 дюйма длиннее, почти на 2 дюйма.Итак, фокус в том, чтобы найти LCM (наименьшее общее кратное) из 47 и 9,78.Получается 235.235 = 47*5 и 235/9.78 = 24,028...(достаточно близко).Это означает, что 20 зигзагообразных изгибов практически равны 24 прямым по линейной длине.К счастью, у меня 26 прямых, так что я едва успел.Оставшиеся 2 штуки можно легко разместить в другом месте макета.

Еще одна вещь, которую я обнаружил, это то, что если я проведу зигзагообразно по 2 кривым одинаковой ориентации одновременно (OOCCCCOO), то 8 из них будут иметь линейное расстояние всего 83 дюйма, а не 94 дюйма, как при чередовании кривых (OCCOOCCO).LCM, равный 83 и 9,78, равен примерно 166.Таким образом, 16 из этих кривых имеют ту же линейную длину, что и 17 прямых.Это полезно знать, потому что у меня 44 изгиба и только 26 прямых, но если я сделаю эту замену, я смогу помочь компенсировать это.

Если я сделаю зигзагообразные изгибы по 3 за раз (OOOCCCCCCCOOO) и слегка согну их, я смогу получить точную линейную длину 10 прямых (около 97,8 дюйма).

ОКОНЧАНИЕ ОБНОВЛЕНИЯ

Итак, должна ли компьютерная программа создавать геометрическую модель и запоминать точные положения каждой дорожки или есть какой-то более простой способ закодировать это?Я хочу иметь возможность "нажать кнопку", и компьютер "выплюнет" для меня действительный "новый" макет.

Я хочу дать этот рабочий алгоритм детям, которые пользуются поездами, чтобы они не расстраивались, пытаясь создать макет, который не работает, а затем они пытаются согнуть рельсы, чтобы заставить его работать, или им приходится оставлять несколько фрагментов рельсов, потому что они не подходят.Компьютер может создать действительный макет, используя все дорожки, и, если алгоритм хорош, возможно, за несколько секунд.Это делается для того, чтобы помочь им избежать разочарования.

У меня есть некоторые навыки программирования, но сначала мне нужно знать алгоритм, прежде чем я смогу закодировать что-то значимое (кроме простого тестирования нескольких частей алгоритма-кандидата).

Я думаю о том, что я мог бы попросить компьютер смоделировать треки, используя меньшее (уменьшенное) представление.Я думаю, что тогда можно было бы просто "поместить" треки в макет кандидата и проверить, нет ли столкновений с другими треками, которые уже есть.

Я думаю, что, вероятно, есть лучшие способы сделать это, поэтому я прошу здесь о некоторой помощи / идеях.Я действительно хочу, чтобы это сработало, и у меня здесь есть треки, чтобы я мог использовать их, чтобы помочь проверить, работает ли алгоритм.

Мы можем использовать C = 20 и S = 10 в качестве параметров, чтобы попытаться решить эту проблему, потому что это достаточно небольшое количество дорожек (всего 30).Я предполагаю, что если алгоритм достаточно надежен, значения C и S могут быть изменены по желанию, и он все равно будет работать.Например, в конце концов я хочу попробовать C = 44 и S = 26.

Последнее слово

Спасибо всем вам за ваши комментарии и предложения по этому вопросу.Я тоже многому научился.В детстве я никогда особо не задумывался о железнодорожных путях и о том, как они сочетаются друг с другом, но, став взрослым, я вижу, что это увлекательная геометрическая задача и очень сложная математическая задача подсчета, позволяющая сгенерировать / выяснить, сколько существует различных (уникальных) схем расположения путей.Я надеюсь, вам понравилось это упражнение так же, как и мне.Дети тоже это ценят.

Конец Заключительного слова

Это было полезно?

Решение

Я думал, что предложу решение методом грубой силы.

Идея состоит в том, чтобы опробовать каждый отдельный макет трека по очереди.При построении макета необходимо учитывать только три элемента:кривая для левой руки, кривая для правой руки и прямая.

Вы можете закодировать макет дорожки в виде базового номера 3 с шириной, соответствующей количеству фрагментов в макете.Чтобы перечислить все макеты дорожек, просто посчитайте в базе 3, где кодировка идет 0 = прямая, 1 = левая и 2 = правая.

Следующий этап - проверить, что макет соединяется с обоих концов.Первая проверка заключается в том, чтобы убедиться, что кривых достаточно для прохождения одного полного круга.Если мы выберем направление против часовой стрелки для одного контура, то потребуется 12 левых изгибов.Для каждой дополнительной правой кривой нам нужно добавить дополнительную левую кривую.Итак, чтобы проверить, работает ли конкретный макет, просто добавьте количество левых кривых и вычтите количество правых кривых - это должно равняться 12.

Наконец, нам нужно проверить, что концы действительно сходятся.Мы просто наносим дорожку на декартову сетку.Мы начинаем начало координат с [0,0], и если оно заканчивается на [0,0], то оно соединяется.

Самый простой способ построить дорожку - это ЛОГОТИП Стиль.Другими словами, мы поддерживаем вектор направления, который указывает в направлении последнего уложенного фрагмента дорожки.Если мы окружаем левую кривую, то поворачиваем направление на 30 градусов, а для правой кривой поворачиваем на -30 градусов - прямая не влияет на направление.

Чтобы на самом деле построить кривые и прямые, мы увеличиваем вектор направления на размер фрагмента, т.е.10 единиц измерения для прямой и 12,4 x 12/2 x pi (радиус полной кольцевой колеи) для кривой.

предостережения

Из-за ошибок округления при сложении чисел с плавающей запятой построение графика является неточным.И в реальной жизни мы можем оставить некоторое пространство для маневра, чтобы свести концы с концами, так что об этом нужно позаботиться.

Многие макеты будут одинаковыми, но сдвинутыми на одну позицию.Я не вижу способа исключить дублирующиеся сдвинутые макеты, кроме как сохранить предыдущие и свериться с ними.

Алгоритм не исключает расположения, где фигуры пересекаются.Чтобы сделать это, вам нужно было бы проверить, что каждый фрагмент в макете не пересекает другой фрагмент в макете (это O (n ^ 2)).И должны быть проверки на пересечение кривая-кривая, кривая-прямая и прямая-прямое, и это начинает становиться очень сложным.

Очевидно, что время выполнения алгоритма равно O (3 ^ N), что является экспоненциальным и, вероятно, непрактично для очень больших макетов.

Ниже приведен некоторый код VBA, который вы можете вставить в Excel, чтобы получить подтверждение концепции.Я намеренно постарался сделать код как можно более простым, чтобы облегчить перевод на ваш любимый язык.Пожалуйста, не стесняйтесь задавать любые вопросы.

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

Другие советы

Во-первых, проблема фрейма:

Компьютер может создать правильный макет, используя все дорожки, и, если алгоритм хорош, возможно, за несколько секунд

Вам не нужно, чтобы алгоритм запускался за несколько секунд.Вам нужен результат через несколько секунд.Я не вижу, чтобы что-то мешало вам установить программу обработки макетов методом перебора, работающую на компьютере в углу, и сохранять решения в базе данных, из которой пользовательский интерфейс затем может выбирать случайные макеты.


Что касается генерации, существует ряд полустандартных подходов.Пространство состояний довольно велико, поэтому исчерпывающий поиск может оказаться невозможным.Но, возможно, стоит попробовать любое из следующих действий:

  • Чисто случайная перетасовка списка прямых и равного количества левых и правых кривых с последующим тестом на "добротность".
  • Восхождение на холм:начните со случайной перестановки, а затем протестируйте простые замены, чтобы увидеть, улучшают ли они "качество".Если они это сделают, произведите замену и повторите.
  • Имитированный отжиг:аналогично, но иногда допускает изменения, которые уменьшают "добротность" в надежде добраться до лучшего холма.
  • Генетический алгоритм:генерируйте множество случайных перестановок и многократно смешивайте их, чтобы сохранить наилучшие результаты.Однако не совсем понятно, как их смешивать.
  • Последние три могли бы начинаться с "заведомо хороших" кривых, генерируемых вставками в окружность.
  • Изучите варианты проведения встречи в середине.Например.сгенерируйте все кривые с общим углом + 90 градусов, проиндексируйте их по 2D вектору между конечными точками, и если векторов намного меньше, чем кривых, вы могли бы исчерпывающе рассмотреть их четверки, чтобы найти те, которые образуют замкнутый четырехугольник.

Для тестирования на "добротность", очевидно, должен быть большой штраф, если кривая не замкнута.Также должен быть предусмотрен большой штраф за самонаполнение.Я был бы склонен протестировать те, которые используют четырехугольное дерево, чтобы найти сегменты, которые не являются последовательными, но находятся близко друг к другу, а затем выполнить тесты на пересечение дуги, дуговой линии и линии пересечения линий, чтобы увидеть, перекрывает ли какое-либо ребро, ограничивающее один сегмент, ребро, ограничивающее другой.


Другой стратегией, которая могла бы полностью устранить меньший случай, но не больший, было бы применение алгебраического подхода к общему вектору.Пусть длина прямого отрезка равна $2\элл$ а радиус изогнутой детали равен $2r$.Поскольку все ориентации кратны 30 градусам, вектор между концами прямого отрезка находится в $$(0, \pm 2\ell), (\pm 2\ell, 0), (\pm \ell, \pm \sqrt3 \ell), (\pm \sqrt3 \ell, \pm \ell)$$ и аналогично вектор между концами изогнутой детали находится в $$(\pm r, \pm \sqrt3 r), (\pm \sqrt3 r, \pm r), (\pm (\sqrt3 - 1)r, \pm (\sqrt3 - 1)r))$$

Если только один из $\frac \ell r$, $\frac {\sqrt 3 \ell} r$, или $\frac \ell {\sqrt 3 r}$ является дробью с маленьким числителем и маленьким знаменателем, кривые и прямые независимы, поэтому вы можете найти рабочие наборы кривых (грубой силы достаточно для 20 кривых, из которых 16 в одном направлении и 4 в другом;для 44 кривых с разделением 28-16 вам нужен лучший подход;Я еще не проработал последствия требования $+\sqrt 3$s, чтобы иметь соответствующее количество $-\sqrt 3$s, но они могут допускать некоторую интенсивную фильтрацию), а затем вставлять прямые попарно.Применение этого метода грубой силы для небольшого количества кривых позволило бы вам оценить, сколько макетов вы потенциально теряете при симметричном подходе.

Одно из возможных решений чтобы сделать это как можно более простым и быстро получить работающий алгоритм, было бы следующим.Самая простая схема - это, конечно, 12С (12 изогнутых дорожек, все с одинаковой ориентацией (относительно друг друга) и образующих простой круг.Это будет основой, на которой мы сможем опираться.

Таким образом, основной алгоритм будет заключаться в поддержании схемы непрерывного цикла на 360 градусов на каждом шаге при добавлении дорожек.Мы можем сделать это, проверив, сколько изогнутых дорожек у нас осталось, и добавив их в макет группами, чтобы сохранить свойство 360 градусов.Например, начните с нашего макета 12С (простой круг).Мы знаем, что у нас всего 20С, так что у нас осталось 8С.Самым простым дополнением некоторых из тех, которые поддерживали бы свойство 360 градусов, было бы добавление кривой обратной ориентации и такой же кривой ориентации (такой же, как основной круг, с которого мы начали).Затем мы хотели бы проделать то же самое с противоположной стороной макета.В этом простом примере мы бы добавили еще 4 кривые к макету окружности, чтобы 12С стало 16С (с остатком 4С).Мы будем продолжать размещать кривые до тех пор, пока все 20 (в этом примере) не будут размещены должным образом.Обратите внимание, что этот макет, состоящий из всех кривых, является допустимым макетом с замкнутым контуром.Поезд может использовать эту схему, однако она полностью состоит из изогнутых путей, так что мы еще не закончили.

Затем прямые дорожки будут вставлены таким же образом, за исключением того, что они могут быть добавлены парами (2 дорожки), поскольку они не изменяют свойство 360 градусов.Их можно вставить куда угодно, поэтому я думаю, что было бы лучше сначала разместить ВСЕ изогнутые дорожки, затем вернуться назад и сделать второй проход, чтобы разместить прямые дорожки случайным образом (но симметрично).

Это самый простой алгоритм, который я могу придумать на данный момент.Гарантированно получается замкнутый контур на 360 градусов, симметричная трасса, и если предположить, что количество поворотов кратно 4, а количество прямых кратно 2, то будет использоваться каждая трасса.

Однако следует учитывать одну вещь (при использовании этого алгоритма либо на компьютере, либо просто в уме при создании макета): в одном направлении могут быть большие ограничения по пространству, чем в другом.Например, во внутреннем дворике, который длинный, но не такой широкий.При использовании алгоритма он должен быть больше ориентирован на длинный размер того места, где будет собран макет.

Если кто-то сможет разработать алгоритм формирования асимметричной компоновки с использованием всех дорожек, это было бы еще более впечатляюще.

Разница в сложности между самым простым решением и самым сложным ошеломляет.Начинать с круга (12C) настолько просто, насколько это возможно для этой задачи, и разумно для детей, однако очень интересно проанализировать универсальное решение, которое может создать ЛЮБУЮ допустимую компоновку (включая асимметричную).

На самом деле, некомпьютерный алгоритм состоял бы в том, чтобы просто добавить несколько "крутых" фигур в макет и приблизить его к подключению, затем вернуться назад и точно настроить его так, чтобы он действительно подключался (для замкнутого цикла).Всего 70 треков (44C и 26S) позволяют создать огромную компоновку.Я подсчитал, что в общей сложности протяженность трассы составляет около 67 футов, что составляет около 20 метров.Поезду потребуется около 1 минуты, чтобы один раз обойти весь макет.

Еще одно подходящее решение можно было бы сделать фактические замеры каждой дорожки и запомнить крайний правый край макета.При создании макета вы можете начать с прямой дорожки или с левого изгиба (против часовой стрелки), определяя, насколько далеко находится последняя добавленная дорожка от этого крайнего правого края, а затем при добавлении других дорожек никогда не допускать комбинацию дорожек, которые будут пересекать этот крайний правый край или, возможно, даже не приблизятся к нему.Так, например, начните с прямой дорожки (в этом решении-кандидате нет начального круга 12С), затем случайным образом выберите другой фрагмент дорожки.Обратите внимание, что с самого начала мы БЫ НЕ разрешали поворот направо (по часовой стрелке), поскольку это нарушило бы правило "пересечения" крайнего правого края.После первой прямой нам остается только пройти еще одну прямую или повернуть налево (против часовой стрелки).Еще одно правило, которое следует соблюдать, заключается в том, что после прямой нам не разрешается добавлять более 9 одинаковых поворотов ориентации подряд, в противном случае, скорее всего, будут врезаться / пересекаться какие-то другие трассы, которые уже есть.Это ограничение можно даже уменьшить до 8 для увеличения клиренса, и если это произойдет, следующая трасса ДОЛЖНА быть ориентирована в обратном направлении (поскольку прямая может вызвать проблемы).

Этому алгоритму потребуется некоторая помощь, чтобы заставить его вернуться и подключиться к другой стороне этого первого добавленного фрагмента трека.Мы можем сделать это, настаивая на том, чтобы кривые против часовой стрелки считались + 1, а кривые по часовой стрелке -1, и в сумме они должны составлять 12 на последней добавленной кривой.Мы можем помочь этому, смещая кривые куб. см (против часовой стрелки) в соотношении 4: 1 с кривыми по часовой стрелке, так что, скорее всего, мы получим 16 куб. см и 4 по часовой стрелке, что фактически образует круг на 360 градусов.Если алгоритм пытается добавить кривую CC, но натыкается на существующие дорожки, у нас есть 2 варианта на этом этапе: попробовать кривую противоположной ориентации или отказаться от макета и начать все сначала.Я бы подумал, что на быстром компьютере со временем он получит хорошую компоновку.

Я пока не уверен, даст ли этот метод все те же макеты, что и начинающийся с 12C, но, возможно, его было бы проще реализовать на компьютере, поскольку требуется соблюдать всего несколько правил, и мы создаем макет по одному треку за раз.

На самом деле, я только что подумал о 3-е возможное решение-кандидат это должно сработать, и реализовать это не слишком сложно.Это происходит следующим образом.

Используйте технику, описанную выше, но сделайте только половину макета (используя половину дорожек каждого типа, таким образом, 10 кривых и 5 прямых.Мы заставляем компьютер выбирать случайные треки, но принимаем только те макеты, которые в конечном итоге имеют сетку с поворотом влево на 180 градусов (потому что мы устанавливаем правую границу, которую ни один трек не может коснуться или пересечь.Хорошо, предположим, что компьютер очень быстро находит допустимый "половинный макет".Затем мы просто проводим инвентаризацию количества кривых по часовой стрелке и против часовой стрелки и дублируем это на другой половине дорожки (но не обязательно симметрично).Для прямых мы должны записать, под каким углом они были вставлены, а затем сопоставить их на другой половине трассы, но опять же, не обязательно симметрично.

Давайте попробуем пример, используя S для обозначения прямой, O для обозначения кривой против часовой стрелки и C для обозначения кривой по часовой стрелке.Сначала сконцентрируемся на половинном макете.

Первая прямая трасса будет уходить от нас, и это определяет наш крайний правый край, который нам запрещено пересекать.

SOOSOCSOOSSOOOC - Это допустимый половинный макет, поскольку он имеет 5 прямых и 10 кривых с сеткой из 6 кривых против часовой стрелки (2 из 8 были "отменены" двумя кривыми по часовой стрелке).

Теперь нам нужно "следить" за тем, под каким углом были вставлены прямые, и сопоставлять их с дорожкой под таким же углом (но в противоположном направлении), чтобы "отменить" их.

1:прямые линии под углом 0 градусов
0:прямые линии под углом 30 градусов
2:прямые линии под углом 60 градусов
0:прямые линии под углом 90 градусов
2:прямые линии под углом 120 градусов
0:прямые линии под углом 150 градусов
0:прямые линии под углом 180 градусов

Итак, чтобы "сопоставить" это с другой половиной макета и сделать так, чтобы оно соединялось с единственной начальной прямой трассой, нам просто нужно сопоставить такое же количество Ос и Cs, но также сопоставить такое же количество прямых под углом "возврата" + 180 градусов.Например, для прямой в 60 градусов лучше иметь прямую в 240 градусов где-нибудь на другой стороне макета, не обязательно прямо напротив.Это связано с тем, что прямая под углом 60 градусов будет проходить в основном влево и немного вверх (при использовании этой схемы), а прямая под углом 240 градусов вернет ее вправо и обратно на ту же величину, чтобы эффективно "отменить" вклад этих двух дорожек в отклонение от начального положения дорожки.

Итак, теперь все, что нам нужно сделать, чтобы создать "недостающую половину" макета, - это взять известные трассы, которые нам нужны (и зная, под какими углами должны располагаться прямые), и просто "скремблировать" их в любом порядке.

Возможно, есть способ НЕ сопоставлять точно одну половину макета с "дополнительными" дорожками на другой стороне, но это потребовало бы более сложной математики, и, вероятно, не хватит времени решить эту проблему за то время, пока активна награда.Существует также вероятность того, что не все дорожки будут использоваться таким образом и потребуется небольшой изгиб дорожки.Мы можем проигнорировать это особое свойство для данного вопроса.

На самом деле я сделал асимметричный трек, чтобы посмотреть, сработает ли это, и, похоже, сработало.Используя S для прямой, O для кривой против часовой стрелки и C для кривой по часовой стрелке, плюс угол (в градусах) относительно начальной прямой дорожки, я получил следующее для верхней половины:

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

Для нижней половины трека я получил:

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

На самом деле снимок был сделан не с той стороны, поэтому верхняя и нижняя части перевернуты.Первая проложенная дорожка была прямой рядом с синей мусорной корзиной и приближалась к зрителю на картинке, а вторая дорожка - кривой против часовой стрелки.

enter image description here

Похоже, что эта техника сработала бы для многих четных поворотов и четного количества прямых, включая 44С и 26С, что является моей конечной целью.Это действительно обнадеживает, поскольку электронный компьютер на самом деле не нужен для решения этой проблемы, я могу просто попросить детей построить практически любую форму полукруга, которую они захотят, с половиной дорожек (22C и 13S), затем "скорректировать" их дизайн так, чтобы он был на 180 градусов, затем "подогнать" другую сторону дорожки, не обязательно симметрично.

Вам пришлось бы быть осторожным, если бы вы хотели создать половинчатую разметку на 180 градусов, где начальная дорожка и конечная дорожка расположены очень близко друг к другу.Например, форма верхней части вопросительного знака "?" (без точки), но продолжайте эту верхнюю кривую, чтобы она больше огибала, и прямая, идущая вниз от нее, была бы очень близка к прямой, которая находится выше того места, где была точка.Тогда для нижней половины вы НЕ смогли бы сразу сделать больше поворотов против часовой стрелки, поскольку там есть другие прямые от "верхней половины".Изображение моего макета с замкнутым контуром сработало, потому что у меня не было "узких мест" в "верхней" половине, но, конечно, они возможны, как я только что описал.

"Проблемная" компоновка поезда - это когда одна половина пути имеет форму песочных часов с узкой серединой.В этом случае вам почти придется "зеркально отразить" верхнюю часть, потому что определенные изгибы сделать невозможно, так как дорожки расположены слишком близко друг к другу.Вот один из примеров...

enter image description here

Еще одно интересное наблюдение заключается в том, что 4 зигзагообразно изогнутые трассы - это почти точная замена (с точки зрения линейного расстояния) 5 прямых.Однако слишком большое их количество приведет к существенной разнице в длине.Как указано в ОБНОВЛЕННОМ разделе выше, 20 зигзагообразных кривых почти точно соответствуют (по линейному расстоянию) 24 прямым.

enter image description here

Используя эту технику, можно создать гигантский макет из всех 70 фрагментов трека.Это начиналось бы с круга 12С, затем с одной стороны я мог бы вставить 24 прямых (длиной 240 дюймов).На противоположной длинной стороне макета (чтобы длина прямой стороны почти совпадала) я бы использовал 20 зигзагообразных изгибов (также длиной около 240 дюймов).Они должны почти выровняться, и небольшой изгиб должен заставить это сработать.Остальные дорожки (2 прямые и 12 изогнутых) можно было бы легко разместить, чтобы сохранить компоновку "сбалансированной" (и связанной).

Предположим, что вы начинаете с точки (0, 0), идущей прямо направо.Вам нужно добавлять дорожки до тех пор, пока вы снова не дойдете до точки (0, 0), на этот раз прямо слева.Здесь есть две проблемы:Один из них состоит в том, чтобы достичь точки (0, 0), идущей слева именно так.Другой способ заключается в том, чтобы не было перекрытий.

Чтобы сформировать круг против часовой стрелки, вам понадобится 12 изогнутых деталей, поворачивающихся влево.Они образуют точный круг.Из 0, или 24, или 36 изогнутых фигур у вас получится восьмерка, или два, или три круга, ни один из которых нельзя сделать без пересечения.

И, конечно, вы можете добавлять дополнительные треки, и они должны соответствовать определенным правилам:Вы можете добавлять элементы, изогнутые влево, прямые и правые, парами, начиная с углов x градусов и x + 30 градусов, так что вы вернетесь к 0,0.И количество изогнутых влево фигур после первых 12 должно соответствовать количеству изогнутых вправо фигур, чтобы фигуры совпадали под прямым углом 0,0.

Итак, это те фрагменты, которые вы можете использовать.Вам нужно убедиться, что здесь явно нет пересечений.

Если длины точно совпадают, то, например, комбинация влево / вправо / right / left покрывает точно такое же расстояние, что и четыре или пять прямых, поэтому могут быть разрешены некоторые другие комбинации.

И, конечно же, треки являются бенди, который может дать гораздо больше возможностей.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с cs.stackexchange
scroll top