# Formas

> Círculos, cajas, anillos, líneas, polígonos y estrellas como distancias con signo, combinadas y dibujadas con relleno, trazo y brillo.

Source: https://albakore.github.io/pyzed/es/shading/nodes/shapes/

Cada ejemplo de esta página se ejecuta después de estas dos líneas y termina enviando un color al nodo Salida:

```python
from pyzed import shading

g = shading.Graph("demo")
```

## Formas

Las formas son **distancias con signo** (SDF): cada píxel recibe su distancia al borde de la forma, negativa dentro y positiva fuera. Una distancia todavía no es una imagen: **Relleno**, **Contorno** y **Resplandor** la convierten en una máscara de 0 a 1. Las distancias se pueden combinar (unión, resta, intersección) antes de dibujar, incluso con una unión suave.

### Círculo

*Circle* · `circle` · Formas · `g.circle(...)`

La distancia con signo a un círculo (negativa dentro). Usa Relleno o Contorno para dibujarlo.

Un círculo alrededor de `center` con un `radius` (en unidades de la altura). Dibújalo con Relleno, Contorno o Resplandor.

| Entrada | Tipo | Por defecto |
| --- | --- | --- |
| `p` | `vec2` | *Centrado* (contexto) |
| `center` · centro | `vec2` | `(0, 0)` |
| `radius` · radio | `float` | `0.3` |

| Salida | Tipo |
| --- | --- |
| `distance` · distancia | `float` |

```python title="Ejemplo"
d = g.circle(radius=0.3)
g.output(g.rgba(g.fill(d), 1.0))
```

### Rectángulo

*Box* · `box` · Formas · `g.box(...)`

La distancia con signo a un rectángulo de tamaño size (redondeado por radius).

Un rectángulo de tamaño `size`, con esquinas redondeadas por `radius`: tarjetas, botones, paneles.

| Entrada | Tipo | Por defecto |
| --- | --- | --- |
| `p` | `vec2` | *Centrado* (contexto) |
| `center` · centro | `vec2` | `(0, 0)` |
| `size` · tamaño | `vec2` | `(0.6, 0.4)` |
| `radius` · radio | `float` | `0.05` |

| Salida | Tipo |
| --- | --- |
| `distance` · distancia | `float` |

```python title="Ejemplo"
d = g.box(size=[0.8, 0.5], radius=0.08)
g.output(g.rgba(g.fill(d), 1.0))
```

### Anillo

*Ring* · `ring` · Formas · `g.ring(...)`

La distancia con signo a un anillo de radio radius y grosor thickness.

Un anillo de `radius` y `thickness`: indicadores de carga, dianas, halos.

| Entrada | Tipo | Por defecto |
| --- | --- | --- |
| `p` | `vec2` | *Centrado* (contexto) |
| `center` · centro | `vec2` | `(0, 0)` |
| `radius` · radio | `float` | `0.3` |
| `thickness` · grosor | `float` | `0.05` |

| Salida | Tipo |
| --- | --- |
| `distance` · distancia | `float` |

```python title="Ejemplo"
d = g.ring(radius=0.3, thickness=0.04)
g.output(g.rgba(g.fill(d), 1.0))
```

### Segmento

*Segment* · `segment` · Formas · `g.segment(...)`

La distancia con signo a una línea de a a b, de grosor thickness.

Una línea de `a` a `b` con extremos redondeados y un grosor `thickness`.

| Entrada | Tipo | Por defecto |
| --- | --- | --- |
| `p` | `vec2` | *Centrado* (contexto) |
| `a` | `vec2` | `(-0.3, 0)` |
| `b` | `vec2` | `(0.3, 0)` |
| `thickness` · grosor | `float` | `0.04` |

| Salida | Tipo |
| --- | --- |
| `distance` · distancia | `float` |

```python title="Ejemplo"
d = g.segment(a=[-0.4, -0.2], b=[0.4, 0.2], thickness=0.05)
g.output(g.rgba(g.fill(d), 1.0))
```

### Polígono

*Polygon* · `polygon` · Formas · `g.polygon(...)`

La distancia con signo a un polígono regular (sides esquinas, radius hasta ellas).

Un polígono regular de `sides` esquinas: triángulos, hexágonos, octógonos.

| Entrada | Tipo | Por defecto |
| --- | --- | --- |
| `p` | `vec2` | *Centrado* (contexto) |
| `center` · centro | `vec2` | `(0, 0)` |
| `radius` · radio | `float` | `0.3` |
| `sides` · lados | `float` | `6` |
| `rotation` · rotación | `float` | `0` |

| Salida | Tipo |
| --- | --- |
| `distance` · distancia | `float` |

```python title="Ejemplo"
d = g.polygon(radius=0.35, sides=6.0)
g.output(g.rgba(g.fill(d), 1.0))
```

### Estrella

*Star* · `star` · Formas · `g.star(...)`

La distancia con signo a una estrella (inner es la profundidad de sus valles, de 0 a 1).

Una estrella de `points` puntas; `inner` es la profundidad de los valles entre puntas.

| Entrada | Tipo | Por defecto |
| --- | --- | --- |
| `p` | `vec2` | *Centrado* (contexto) |
| `center` · centro | `vec2` | `(0, 0)` |
| `radius` · radio | `float` | `0.35` |
| `points` · puntas | `float` | `5` |
| `inner` · interior | `float` | `0.45` |
| `rotation` · rotación | `float` | `0` |

| Salida | Tipo |
| --- | --- |
| `distance` · distancia | `float` |

```python title="Ejemplo"
d = g.star(radius=0.4, points=5.0, inner=0.45)
g.output(g.rgba(g.fill(d), 1.0))
```

### Combinar formas

*Combine shapes* · `sdf_op` · Formas · `g.sdf_op(...)`

Une dos formas (unión), recorta b de a (resta) o conserva donde se solapan (intersección); smooth funde la unión.

Combina dos formas antes de dibujarlas: **Unión** las une, **Restar forma** recorta `b` de `a` e **Intersecar** deja la parte común. `smooth` mayor que 0 funde la unión, como dos gotas de agua.

| Entrada | Tipo | Por defecto |
| --- | --- | --- |
| `a` | `float` | `1` |
| `b` | `float` | `1` |
| `smooth` · suavizado | `float` | `0` |

| Salida | Tipo |
| --- | --- |
| `distance` · distancia | `float` |

| Ajuste | Valores | Por defecto |
| --- | --- | --- |
| `op` | `union`, `subtract`, `intersect` | `union` |

**Entradas de la barra lateral**

| Entrada | Qué hace | En Python |
| --- | --- | --- |
| Unión | Une dos formas; smooth las funde. | `g.union(...)` |
| Restar forma | Recorta la forma b de la forma a. | `g.subtract_shape(...)` |
| Intersecar | Conserva donde se solapan dos formas. | `g.intersect(...)` |

```python title="Ejemplo"
a = g.circle(center=[-0.15, 0.0], radius=0.25)
b = g.circle(center=[0.15, 0.0], radius=0.25)
d = g.union(a, b, smooth=0.1)
g.output(g.rgba(g.fill(d), 1.0))
```

### Relleno

*Fill* · `fill` · Formas · `g.fill(...)`

Dibuja una forma: 1 dentro, 0 fuera, con un borde suavizado de softness píxeles.

Dibuja una forma rellena: 1 dentro, 0 fuera, con un borde suavizado de `softness` píxeles. Sube `softness` para un borde difuso.

| Entrada | Tipo | Por defecto |
| --- | --- | --- |
| `distance` · distancia | `float` | `0` |
| `softness` · suavidad | `float` | `1` |

| Salida | Tipo |
| --- | --- |
| `mask` · máscara | `float` |

```python title="Ejemplo"
d = g.box(size=[0.6, 0.6], radius=0.1)
g.output(g.rgba(g.fill(d, softness=8.0), 1.0))
```

### Contorno

*Stroke* · `stroke` · Formas · `g.stroke(...)`

Dibuja el contorno de una forma, de grosor width (en las unidades de la forma).

Dibuja solo el contorno de una forma, de ancho `width`.

| Entrada | Tipo | Por defecto |
| --- | --- | --- |
| `distance` · distancia | `float` | `0` |
| `width` · ancho | `float` | `0.02` |
| `softness` · suavidad | `float` | `1` |

| Salida | Tipo |
| --- | --- |
| `mask` · máscara | `float` |

```python title="Ejemplo"
d = g.star(radius=0.4)
g.output(g.rgba(g.stroke(d, width=0.02), 1.0))
```

### Resplandor

*Glow* · `glow` · Formas · `g.glow(...)`

Una luz suave alrededor de una forma que se desvanece a lo largo de radius.

Una luz suave alrededor de una forma que se desvanece en `radius`: letreros de neón y halos. Súmalo a un Relleno para una forma sólida con brillo.

| Entrada | Tipo | Por defecto |
| --- | --- | --- |
| `distance` · distancia | `float` | `0` |
| `radius` · radio | `float` | `0.08` |
| `intensity` · intensidad | `float` | `1` |

| Salida | Tipo |
| --- | --- |
| `value` · valor | `float` |

```python title="Ejemplo"
d = g.ring(radius=0.3, thickness=0.01)
light = g.glow(d, radius=0.1)
g.output(g.rgba(g.compose(0.1, 0.8, 1.0) * light, 1.0))
```

**Siempre al día:**

Esta página se genera a partir del catálogo de nodos de `pyzed.shading`, así que los puertos, tipos y valores por defecto son siempre los de esta versión. Cada ejemplo se compila al construir la documentación.

**Ver también:** [Primeros pasos](https://albakore.github.io/pyzed/es/shading/getting-started/) · [La vista Shader](https://albakore.github.io/pyzed/es/shading/shader-designer/) · [Recetas](https://albakore.github.io/pyzed/es/shading/recipes/) · [Grafos de shader en Python](https://albakore.github.io/pyzed/es/shading/shader-graphs/)
