---
title: "P3D: Ejemplos de Repetición"
---

# Estrategias para usar construcción basada en repetición

Recordemos que la estructura básica de un ciclo `for` es:

```java
for( int n=1; n<=10; n++){
// repite este bloque de código 10 veces
// ...
}
```

[[Ciclos while y for]](/notas/ciclos.html)

La clave para construir algo basado en ciclos es identificar el patrón a repetir:

* ¿Qué tienen en común los elementos repetidos?
* ¿Hay algo constante?
* ¿Qué es lo que cambia entre cada elemento?
* ¿Cómo es que cambia?

Ya que lo identifiquemos, es posible aprovechar que las transformaciones (`translate`, `rotate`) se van acumulando. También es posible usar la variable `n` para parametrizarlas. Además, es posible usar una variable como "acumulador".

Veamos cómo se puede hacer una hilera de 10 cubos con estas diferentes opciones.

![](/img/filadecubos.png)

## Transformaciones acumuladas

En esta versión, aprovechamos que mientras no usemos `pushMatrix()` y `popMatrix()`, el origen se va a quedar en el último lugar en el que estábamos.

```java
for(int n=1; n<=10; n++){  
  box(1);
  translate(2, 0, 0);
}
```

Esta versión la podemos leer en lenguaje natural de la siguiente forma:

*repite 10 veces lo siguiente: dibuja un cubo de lado 1, y muévete 2 unidades en x*

## Transformaciones parametrizadas

Otra opción es:

```java
for( int n=0; n<10; n++){
  pushMatrix();
    translate(2*n, 0, 0);
    box(1);
  popMatrix();
}
```

Esta la podemos leer algo así:

*dibuja 10 cubos de la siguiente forma: para el cubo número `n`, muévete `2\*n` unidades en `x`, y dibuja un cubo de lado 1.*

## Transformaciones con parámetro acumulador

Esta es un poco la mezcla de las otras dos. La idea es tener una variable que cambia de valor con cada iteración del ciclo.

Para nuestro ejemplo:

```java
int x = 0;
for(int n=1; n<=10; n++){
  pushMatrix();
    translate(x, 0, 0);
    box(1);
  popMatrix();
  x = x + 2;
}
```

Todas estas opciones son equivalentes, pero puede ser que alguna te acomode más que otra :)

Para este ejemplo básico la primera probablemente es la mejor, pero conviene tener presentes las otras opciones que pueden ser más versátiles en otras ocasiones.

# Ejemplos / Inspiración

Las siguientes son algunas construcciones realizadas gracias al uso de ciclos `for`.

Los ejemplos están ordenados más o menos por orden de dificultad.

## Escalera

![](/img/escalerasLoop.png)

Tal vez el ejemplo más básico y útil a la vez. ¿Qué diferencía a un escalón del siguiente?

Si te cuesta obtener el patrón, puedes intentar construirla manualmente para que notes cuáles son las acciones que estás repitiendo.

## Múltiples pisos / "Jenga"

![](/img/jenga.png)

![](/img/jenga2.png)

Hay varias formas de hacer esta construcción. Dependiendo de cómo lo veas, puedes o no utilizar rotaciones.

Además de las figuras del "jenga", puedes utilizar alguna una otra construcción que ya hayas realizado, y hacer varios pisos al repetirla.

¿Qué es lo que diferencía a un piso del siguiente?

## Múltiples pisos / "Jenga" - con rotación

![](/img/jengaRot.png)

Parecido al anterior, pero incorporando rotaciones en cada piso.

## Pirámide

![](/img/piramide.png)

Esta se parece a la construcción de varios pisos, pero con una diferencia importante. De nuevo: ¿qué es lo que varía entre cada uno de los pisos?

## Círculo de columnas

![](/img/circuloColumnas.png)

Parece sencilla, pero hay que poner atención en el orden en el que se aplican las rotaciones y traslaciones. Lo bueno es que si te "equivocas", puede ser que te salgan otras construcciones interesantes.

## Escalera de caracol

![](/img/escaleraCaracol.png)

Aquí hay un poco de todo: translaciones, rotaciones, y probablemente varios `pushMatrix()` y `popMatrix()`.