# Logika

**Logika**, a w szczególności **logika warunkowa**, pozwala określić operację lub zestaw operacji na podstawie testu. Przez oszacowanie testu uzyskamy wartość logiczną reprezentującą prawdę (`True`) lub fałsz (`False`), za pomocą której można sterować przepływem programu.

### Wartości logiczne

Zmienne liczbowe mogą przechowywać liczby z szerokiego zakresu. Zmienne logiczne mogą przechowywać tylko dwie wartości, nazywane Prawda lub Fałsz, Tak lub Nie albo 1 lub 0. Rzadko stosuje się operacje logiczne do wykonywania obliczeń z powodu ich ograniczonego zakresu.

### Instrukcje warunkowe

Instrukcja „If” (jeśli) stanowi kluczowe pojęcie w programowaniu: „Jeśli *to* jest prawdą, wtedy *tak* się stanie, w przeciwnym razie stanie się *coś innego*”. Wynikowa operacja tej instrukcji zależy od wartości logicznej. Istnieje wiele sposobów definiowania instrukcji „If” w dodatku Dynamo:

| Ikona                            | Nazwa (składnia)          | Dane wejściowe      | Dane wyjściowe |
| -------------------------------- | ------------------------- | ------------------- | -------------- |
| ![](/files/29R6znROiYQFr2LZWxXq) | Jeśli (**If**)            | test, prawda, fałsz | wynik          |
|                                  | Code Block (**(x?y:z);**) | x? y, z             | wynik          |

Przeanalizujmy krótki przykład dotyczący działania każdego z tych trzech węzłów z użyciem instrukcji warunkowej „If”.

Na tej ilustracji *wartość logiczna* jest ustawiona na *true*, co oznacza, że wynik jest ciągiem: *„this is the result if true”* (to jest wynik, jeśli prawda). Trzy węzły tworzące instrukcję *If* działają tu w ten sam sposób.

!

Węzły działają identycznie. Jeśli *wartość logiczna* zostanie zmieniona na *false*, wynik będzie liczbą *Pi*, jak to zdefiniowano w oryginalnej instrukcji *If*.

!

## Ćwiczenie: logika i geometria

> Pobierz plik przykładowy, klikając poniższe łącze.
>
> Pełna lista plików przykładowych znajduje się w załączniku.

### Część I: filtrowanie listy

1. Użyjmy logiki, aby rozdzielić listę liczb na listę liczb parzystych i listę liczb nieparzystych.

!

> a. **Number Range —** dodaj zakres liczb do obszaru rysunku.
>
> b. **Number —** dodaj trzy number liczb do obszaru rysunku. Wartość dla każdego węzła number powinna wynosić: *0,0* dla *start*, *10,0* dla *end* i *1,0* dla *step*.
>
> c. **Wyjście** — wynik wyjściowy to lista 11 liczb w zakresie od 0 do 10.
>
> d. **Modulo (%) —** węzeł **Number Range** do *x* i *2,0* do *y*. Spowoduje to obliczenie reszty z dzielenia przez 2 dla każdej liczby na liście. Wynik z tej listy to lista wartości 0 i 1.
>
> e. **Test równości (==) —** dodaj test równości do obszaru rysunku. Podłącz wyjście *modulo* do wejścia *x* i wartość *0,0* do wejścia *y*.
>
> f. **Watch —** wynik testu równości jest listą wartości logicznych true i false. Są to wartości używane do oddzielenia elementów na liście. *0* (lub *true*) reprezentuje liczby parzyste, a *1* (lub *false*) reprezentuje liczby nieparzyste.
>
> g. **List.FilterByBoolMask —** ten węzeł filtruje wartości na dwie różne listy w oparciu o wejściową wartość logiczną. Podłącz oryginalny węzeł *Number Range* do wejścia *list* oraz wyjście *equality test* do wejścia *mask*. Wyjście *in* reprezentuje wartości true, podczas gdy wyjście *out* reprezentuje wartości false.
>
> h. **Watch** — w wyniku tego mamy teraz listę liczb parzystych i listę liczb nieparzystych. Użyliśmy operatorów logicznych do rozdzielenia list na wzory.

### Część II: od logiki do geometrii

Bazując na logice ustanowionej w pierwszym ćwiczeniu, zastosujmy tę konfigurację do operacji modelowania.

2\. Oprzemy się na poprzednim ćwiczeniu z tymi samymi węzłami. Jedyne wyjątki to (oprócz zmiany formatu):

!

> a. Użyj węzła **Sequence** z tymi wartościami wejściowymi.
>
> b. Odłączyliśmy wejście list in od węzła **List.FilterByBoolMask**. Na razie odłożymy te węzły na bok, ale później w tym ćwiczeniu się przydadzą.

3\. Zacznijmy od utworzenia oddzielnej grupy wykresu, jak pokazano na ilustracji powyżej. Ta grupa węzłów reprezentuje równanie parametryczne definiujące krzywą liniową. Kilka uwag:

!

> a. Pierwszy suwak **Number Slider** reprezentuje częstotliwość fali. Powinien mieć wartość min. 1, maks. 4 i krok 0,01.
>
> b. Drugi **Number Slider** reprezentuje amplitudę fali. Powinien mieć wartość min. 0, maks. 1 i krok równy 0,01.
>
> c. **PolyCurve.ByPoints —** jeśli zostanie skopiowany powyższy wykres węzłów, wynikiem będzie krzywa sinusoidalna w rzutni podglądu Dynamo.

Metoda stosowana tutaj dla wejść: użyj węzłów number dla bardziej statycznych właściwości i węzłów Number Slider dla właściwości bardziej elastycznych. Chcemy zachować oryginalny węzeł Number Range definiowany na początku tego kroku. Jednak tworzona tutaj krzywa sinusoidalna powinna mieć pewną elastyczność. Możemy przesunąć te suwaki, aby obserwować, jak aktualizowane są częstotliwość i amplituda krzywej.

!

4\. Będziemy analizować definicję nie po kolei, więc spójrzmy na wynik końcowy, aby móc się odwoływać do tego, do czego dążymy. Pierwsze dwa kroki są wykonywane oddzielnie, chcemy je teraz połączyć. Użyjemy bazowej krzywej sinusoidalnej do sterowania położeniem komponentów zamka, a za pomocą logiki prawdy/fałszu będziemy przełączać się między małymi i większymi kostkami.

!

> a. **Math.RemapRange** — za pomocą sekwencji liczb utworzonej w kroku 02 utwórzmy nową serię liczb poprzez ponowne odwzorowanie zakresu. Oryginalne liczby z zakresu od 0 do 100 z kroku 01. Te liczby mieszczą się w zakresie od 0 do 1 dla odpowiednio wejść *newMin* i *newMax*.

5\. Utwórz węzeł **Curve.PointAtParameter**, a następnie połącz wyjście **Math.RemapRange** z kroku 04 jako wejście *param*.

!

W tym kroku tworzone są punkty wzdłuż krzywej. Ponownie odwzorowaliśmy liczby na wartości od 0 do 1, ponieważ wejście *param* szuka wartości w tym zakresie. Wartość *0* reprezentuje punkt początkowy, a wartość *1* reprezentuje punkty końcowe. Wszystkie liczby między nimi są odwzorowane na wartości z zakresu *\[0,1]*.

6\. Połącz wyjście z węzła **Curve.PointAtParameter** z węzłem **List.FilterByBoolMask**, aby rozdzielić listę indeksów nieparzystych i nieparzystych.

!

> a. **List.FilterByBoolMask** — podłącz węzeł **Curve.PointAtParameter** z poprzedniego kroku do wejścia *list*.
>
> b. **Watch —** węzeł obserwacyjny dla *in* i węzeł obserwacyjny dla *out* pokazują, że mamy dwie listy reprezentujące indeksy parzyste i nieparzyste. Punkty te są uporządkowane w ten sam sposób na krzywej, co przedstawimy w następnym kroku.

7\. Następnie użyjemy wyjścia z węzła **List.FilterByBoolMask** w kroku 05, aby wygenerować geometrie o rozmiarach zgodnych z indeksami.

**Cuboid.ByLengths —** ponownie utwórz połączenia widoczne na ilustracji powyżej, aby uzyskać zamek wzdłuż krzywej sinusoidalnej. Prostopadłościan jest tutaj tylko kostką. Definiujemy jego rozmiar na podstawie punktu krzywej w środku kostki. Logika podziału na wartości parzyste/nieparzyste powinna być teraz czytelna w modelu.

!

> a. Lista prostopadłościanów przy indeksach parzystych.
>
> b. Lista prostopadłościanów przy indeksach nieparzystych.

Gotowe! Właśnie zaprogramowano proces definiowania wymiarów geometrii zgodnie z operacją logiczną przedstawioną w tym ćwiczeniu.


---

# 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/pl/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.
