# 邏輯

藉由**邏輯**，或者更明確地說，藉由**條件邏輯**，我們可以根據測試指定單一或一組動作。在評估測試時，我們可以使用表示 `True` 或 `False` 的布林值控制程式流程。

### 布林

數值變數可以儲存所有範圍的不同數字。布林變數只能儲存兩個值，稱為 True 或 False、是或否、0 或 1。由於布林值範圍有限，因此很少使用布林值執行計算。

### 條件陳述式

「If」陳述式是程式設計中的關鍵概念：「如果 *這* 是真的，則會發生 *那件事*，否則會發生 *其他事*。」陳述式所產生的動作由布林值驅動。在 Dynamo 中，可以採用多種方式定義「if」陳述式：

| 圖示                                                                                                                                                                                                | 名稱 (語法)                   | 輸入              | 輸出     |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------- | --------------- | ------ |
| ![](https://1226582865-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FmuqshfgEG0ZvIFN5DRfA%2Fuploads%2Fgit-blob-7309f56b92340e49cf9390a21ead106bcb987a0d%2FIf.jpg?alt=media) | If (**If**)               | test、true、false | result |
|                                                                                                                                                                                                   | Code Block (**(x?y:z);**) | x? y, z         | result |

接下來瞭解使用條件「if」陳述式的三種有效節點中每種節點的簡單範例。

在此影像中，*boolean* 設為 *true*，這意味著結果是字串 *「this is the result if true」*。建立 *If* 陳述式的三個節點在這裡的工作方式完全相同。

!

再說一次，節點的工作方式完全相同。若 *boolean* 變更為 *false*，則結果是數字 *Pi*，如原始 *If* 陳述式所定義。

!

## 練習：邏輯和幾何圖形

> 按一下下方的連結下載範例檔案。
>
> 附錄中提供完整的範例檔案清單。

### 第 I 部分：篩選清單

1. 接下來使用邏輯將數字清單分隔為偶數清單與奇數清單。

!

> a.**Number Range -** 在圖元區加入一個數字範圍。
>
> b.**Numbers -** 在圖元區加入三個數字節點。每個數字節點的值應為：*0.0* (*start*)、*10.0* (*end*) 與 *1.0* (*step*)。
>
> c.**輸出** - 輸出是一個 11 個數字 (從 0 到 10) 的清單。
>
> d.**模除 (%)-** 將 **Number Range** 連接至 *x*，將 *2.0* 連接至 *y*。這會計算清單中的每個數字除以 2 產生的餘數。此清單的輸出是 0 與 1 交替顯示的數值清單。
>
> e.**相等性測試 (==) -** 在圖元區加入相等性測試。將 *模除* 輸出插入 *x* 輸入，將 *0.0* 插入 *y* 輸入。
>
> f.**Watch -** 相等性測試的輸出是 true 與 false 交替顯示的清單。這些值用於分隔清單中的項目。*0* (或 *true*) 表示偶數，*1* (或 *false*) 表示奇數。
>
> g.**List.FilterByBoolMask -** 此節點將根據輸入的布林值，將這些值篩選到兩個不同清單中。將原始的 *Number Range* 插入 *list* 輸入，將 *相等性測試* 輸出插入 *mask* 輸入。輸出 *in* 表示 true 值，而輸出 *out* 表示 false 值。
>
> h.**Watch** - 結果是我們現在產生了偶數清單與奇數清單。我們已使用邏輯運算子將清單分隔為多種樣式！

### 第 II 部分：從邏輯到幾何圖形

接下來我們將建置第一個練習中建立的邏輯，將此設置套用到塑型作業中。

2.我們從上一個練習開始，採用相同的節點。唯一的例外 (除了變更格式) 是：

!

> a.使用 **Sequence** 節點搭配這些輸入值。
>
> b.我們取消插入 **List.FilterByBoolMask** 的 list 輸入。暫時將這些節點放在一旁，這在稍後的練習中會有用。

3.我們先為圖表建立不同群組，如以上影像所示。此節點群組表示定義曲線所用的參數式方程式。一些註記如下：

!

> a.第一個 **Number Slider** 表示波浪的頻率，最小值為 1，最大值為 4，步長為 0.01。
>
> b.第二個 **Number Slider** 表示波浪的振幅，最小值為 0，最大值為 1，步長為 0.01。
>
> c.**PolyCurve.ByPoints -** 若複製以上節點圖，在 Dynamo 預覽視埠中的結果將是一條正弦曲線。

此處採用的輸入方式：對比較靜態的性質使用數字節點，對比較彈性的性質使用數字滑棒。我們希望保留在這一步開始時定義的原始數字範圍。但是，我們在此建立的正弦曲線應具有某些彈性。我們可以移動這些滑棒以觀看曲線對其頻率與振幅的更新。

!

4.我們將對定義進行一些調整，因此接下來看一下最終結果，以便可以參考得到的結果。之前，前兩個步驟是分別執行的，現在我們要連接兩者。我們將使用基準正弦曲線以驅動拉鍊元件的位置，並使用 true/false 邏輯實現大小方塊的交替變化。

!

> a.**Math.RemapRange** - 接下來使用步驟 02 中建立的數字序列，透過重新對映範圍建立新的數字系列。步驟 01 的原始數字介於 0-100 之間。這些數字的範圍分別由 *newMin* 與 *newMax* 輸入限制為從 0 到 1。

5.建立 **Curve.PointAtParameter** 節點，然後連接步驟 04 的 **Math.RemapRange** 輸出做為其 *param* 輸入。

!

此步驟將沿曲線建立點。我們將數字重新對映到從 0 至 1 的範圍，因為 *param* 的輸入會尋找此範圍內的值。*0* 值表示起點，*1* 值表示終點。這當中的所有數字都會在 *\[0,1]* 範圍內運算。

6.將 **Curve.PointAtParameter** 的輸出連接至 **List.FilterByBoolMask**，以分隔奇數和偶數索引的清單。

!

> a.**List.FilterByBoolMask** - 將上一步的 **Curve.PointAtParameter** 插入 *list* 輸入。
>
> b.**Watch -** *in* 的 Watch 節點與 *out* 的 Watch 節點顯示我們有兩個分別代表偶數索引與奇數索引的清單。這些點按照在曲線上的位置順序排序，我們將在下一步示範。

7.接下來，我們將使用步驟 05 中 **List.FilterByBoolMask** 的輸出結果，根據其索引產生不同大小的幾何圖形。

**Cuboid.ByLengths -** 重新建立以上影像顯示的連接，以產生一條沿正弦曲線的拉鍊。立方體在這裡只是方塊，我們將根據方塊中心的曲線點定義其大小。現在，模型中應該已清晰呈現偶數/奇數的區分邏輯。

!

> a.偶數索引處的立方體清單。
>
> b.奇數索引處的立方體清單。

瞧！您剛剛根據本練習示範的邏輯作業，以程式設計了定義幾何圖形維度的過程。
