# Logic

**Логика** (а точнее **условная логика**) позволяет задать действие или набор действий в зависимости от результата проверки. После прохождения проверки выдается логическое значение `True` или `False`, которое можно использовать для управления ходом программы.

### Логические выражения

Числовые переменные могут хранить целый диапазон различных чисел. В логических переменных хранятся только два значения: «Истина» или «Ложь», да или нет, 1 или 0. Из-за ограниченной применимости логические операции можно не так часто встретить в расчетах.

### Условные выражения

Выражение «If» является ключевым для программирования. Если *некое условие* истинно, то происходит *что-то одно*; в противном случае происходит *что-то другое*. Действие, выполняемое после проверки с помощью данного выражения, зависит от логического значения. Существует несколько способов определения выражения If в Dynamo.

| Значок                                                                                                                                                                                            | Имя (синтаксис)           | Входные данные    | Выходные данные |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------- | ----------------- | --------------- |
| ![](https://2422276774-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Frrl0CzV5yPtxYRNkwD4h%2Fuploads%2Fgit-blob-7309f56b92340e49cf9390a21ead106bcb987a0d%2FIf.jpg?alt=media) | If (**If**)               | test, true, false | результат       |
|                                                                                                                                                                                                   | Code Block (**(x?y:z);**) | X, Y, Z           | результат       |

Рассмотрим краткий пример с каждым из этих трех узлов в действии, используя условное выражение If.

На этом изображении в узле *boolean* задано значение *true*. Это означает, что на выходе появится строка *this is the result if true (это результат при истинном значении)*. Три узла, образующие выражение *If*, работают одинаково.

!

Напомним, что узлы работают одинаково. Если для *boolean* изменить значение на *false*, результатом будет число *пи*, как определено в исходном операторе *If*.

!

## Упражнение «Логика и геометрия»

> Скачайте файл с примером, щелкнув ссылку ниже.
>
> Полный список файлов примеров можно найти в приложении.

### Часть I. Фильтрация списка

1. Используем логику, чтобы разделить список чисел на список четных и список нечетных чисел.

!

> a. **Number Range.** Добавление диапазона чисел в рабочую область.
>
> b. **Numbers.** Добавление трех узлов Number в рабочую область. Каждый узел Number должен иметь следующие значения: *0.0* для *start*, *10.0* для *end* и *1.0* для *step*
>
> c. **Output**. На выходе получается список из 11 чисел в диапазоне от 0 до 10.
>
> d. **Modulo (%)**. **Диапазон номеров** в качестве входных данных для *x* и значение *2.0* в качестве входных данных для *y*. При этом рассчитывается остаток каждого числа в списке при делении на 2. На выходе из этого списка будет представлен список чередующихся значений 0 и 1.
>
> e. **Equality Test (==)**. Добавление в рабочую область проверки равенства. Соедините выходные данные *modulo* с входным параметром *x*, а значение *0.0* с входным параметром *y*.
>
> f. **Watch**. В качестве выходных данных проверки равенства будет представлен список значений «Истина» (true) и «Ложь» (false). С помощью этих значений элементы будут разделяться в списке. *0* (или *true*) соответствует четным числам, а *1* (или *false*) — нечетным.
>
> g. **List.FilterByBoolMask.** Этот узел отфильтровывает значения по двум разным спискам в зависимости от вводимого логического выражения. Соедините исходный *диапазон чисел* с входным параметром *list*, а выходной параметр *проверки равенства* с входным параметром *mask*. В выходных данных *in* представлены истинные значения, а в *out* — ложные.
>
> h. **Watch.** В результате мы получили списки четных и нечетных чисел. Итак, с помощью логических операторов мы разделили списки по определенному признаку.

### Часть II. От логики к геометрии

Применим логику из первого упражнения к моделированию.

2\. За основу возьмем предыдущее упражнение с теми же узлами. Помимо изменения формата, единственными исключениями будут следующие.

!

> a. Используйте узел **Sequence** с этими входными значениями.
>
> b. Отсоединен входной параметр list от узла **List.FilterByBoolMask**. Эти узлы пока не нужны, но они потребуются позже.

3\. Начнем с создания отдельной группы Graph, как показано на изображении выше. Эта группа узлов представляет собой параметрическое уравнение для определения линейной кривой. Примечания.

!

> a. Первый регулятор **Number Slider** представляет частоту волны в диапазоне от 1 до 4 с шагом 0,01.
>
> b. Второй регулятор **Number Slider** представляет амплитуду волны в диапазоне от 0 до 1 с шагом 0,01.
>
> c. **PolyCurve.ByPoints.** Если скопировать приведенную выше схему узлов, на видовом экране предварительного просмотра Dynamo будет создана синусоидальная кривая.

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

!

4\. Забежим немного вперед и посмотрим на конечный результат, чтобы представить, каким он должен быть. Первые два шага выполняются отдельно, теперь их нужно соединить. С помощью базовой синусоидальной кривой будет определяться местоположение компонентов молнии, а с помощью логики «истина/ложь» — элементы меньшего или большего размера.

!

> a. **Math.RemapRange.** С помощью последовательности чисел, созданной на шаге 02, сформируем новую последовательность чисел, перенастроив диапазон. Исходные числа из шага 01 имеют диапазон от 0 до 100. С помощью входных параметров *newMin* и *newMax* диапазон значений изменяется на 0–1 соответственно.

5\. Создайте узел **Curve.PointAtParameter**, а затем соедините выходной параметр **Math.RemapRange** из шага 04 с входным параметром *param*.

!

На этом шаге создаются точки вдоль кривой. Диапазон чисел был перенастроен на 0–1, так как входной параметр *param* ищет значения в этом диапазоне. Значение *0* соответствует начальной точке, а значение *1* — конечным точкам. Все промежуточные числа относятся к диапазону *\[0,1]*.

6\. Соедините выходной параметр узла **Curve.PointAtParameter** с узлом **List.FilterByBoolMask**, чтобы разделить список четных и нечетных индексов.

!

> a. **List.FilterByBoolMask.** Соедините узел **Curve.PointAtParameter** из предыдущего шага с входным параметром *list*.
>
> b. **Watch.** Узел Watch для *in* и узел Watch для *out* показывают, что имеется два списка — c четными и нечетными индексами. Тот же самый порядок точек используется в кривой, что демонстрируется на следующем шаге.

7\. Далее используйте результат вывода из узла **List.FilterByBoolMask** на шаге 05 для создания геометрий с размерами в соответствии с индексами.

**Cuboid.ByLength.** Для создания молнии вдоль синусоидальной кривой воспроизведите связи, представленные на изображении выше. В данном случае кубоид — это просто рамка, размер которой определяется в зависимости от точки кривой в центре рамки. Теперь логика деления «четные/нечетные» в модели должна быть понятной.

!

> a. Список кубоидов с четными индексами.
>
> b. Список кубоидов с нечетными индексами.

Готово! Вы только что запрограммировали процесс определения геометрических размеров в соответствии с логической операцией, показанной в этом упражнении.
