# 邏輯

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

### 布林

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

### 條件陳述式

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

| 圖示                               | 名稱 (語法)                   | 輸入              | 輸出     |
| -------------------------------- | ------------------------- | --------------- | ------ |
| ![](/files/e0htSWZOKrcqObzCq7d0) | 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.奇數索引處的立方體清單。

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


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://primer2.dynamobim.org/zh-tw/5_essential_nodes_and_concepts/5-3_the-building-blocks-of-programs/3-logic.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
