fogón

← AsiáticoObjeto 3Dfogon/puente-arqueado

Puente arqueado

de fogonCC05747 bloques
Puente arqueadoArrastrá para girarlo
// «Puente arqueado» · gpt-6-sol (medium)
// A red arched wooden footbridge over a small pond: a high curved deck with planks, red railings with dark posts, stone feet at both ends and blue water with two lily pads under the arch.

// Pond and irregular pale-stone shoreline.
for (let x = 2; x <= 46; x++) {
  for (let y = 6; y <= 42; y++) {
    const d = ((x - 24) / 21) ** 2 + ((y - 24) / 16) ** 2;
    const wobble = 0.025 * Math.sin(x * 1.7 + y * 0.8);
    if (d > 1.07 + wobble) continue;

    if (d > 0.85 + wobble) {
      set(x, y, 0, "#776f67");
      set(x, y, 1, rand() < 0.35 ? "#f0e9d9" : rand() < 0.55 ? "#bcb8aa" : "#d8d3c4");
      if (rand() < 0.13) set(x, y, 2, "#eee8d9");
    } else {
      set(x, y, 0, "#174d65");
      set(x, y, 1, rand() < 0.12 ? "#429aaf" : rand() < 0.33 ? "#287b98" : "#206c89");
      if (rand() < 0.035) set(x, y, 2, "#77c3c6");
    }
  }
}

// Two lily pads, visible in the water beneath the span.
function lily(cx, cy, flower) {
  for (let x = cx - 3; x <= cx + 3; x++) {
    for (let y = cy - 2; y <= cy + 2; y++) {
      const d = ((x - cx) / 3) ** 2 + ((y - cy) / 2.3) ** 2;
      if (d <= 1 && !(x >= cx + 1 && y === cy)) {
        set(x, y, 2, d > 0.65 ? "#245d3c" : rand() < 0.3 ? "#80b65b" : "#4d914c");
      }
    }
  }
  set(cx, cy, 2, "#a6c66a");
  if (flower) {
    set(cx - 1, cy, 3, "#f6a6b0");
    set(cx + 1, cy, 3, "#f6a6b0");
    set(cx, cy - 1, 3, "#ffd2cf");
    set(cx, cy + 1, 3, "#e77f99");
    set(cx, cy, 3, "#f8d878");
  }
}
lily(16, 13, true);
lily(32, 14, false);

// White-stone bridge feet and their darker masonry joints.
for (const [a, b] of [[5, 10], [38, 43]]) {
  box(a, 17, 0, b, 32, 2, "#aaa9a0");
  box(a, 17, 3, b, 32, 4, "#e0ddd0");
  box(a + 1, 18, 5, b - 1, 31, 5, "#f2ecdf");
  for (let x = a; x <= b; x += 2) {
    set(x, 17, 2, "#777b79");
    set(x, 32, 2, "#777b79");
  }
  box(a, 16, 0, b, 16, 1, "#d3d0c5");
  box(a, 33, 0, b, 33, 1, "#d3d0c5");
}

function arch(x) {
  return Math.round(5 + 9 * (1 - ((x - 24) / 18) ** 2));
}

// Solid curved red deck, with individual transverse planks.
for (let x = 7; x <= 41; x++) {
  const z = arch(x);
  box(x, 18, z - 2, x, 30, z - 1, "#672c27");
  box(x, 18, z, x, 30, z, "#a8322d");

  const seam = (x - 7) % 3 === 0;
  for (let y = 19; y <= 29; y++) {
    set(x, y, z + 1, seam ? "#613028" : rand() < 0.16 ? "#e5734b" : "#c75439");
  }
  set(x, 18, z + 1, "#e3a64f");
  set(x, 30, z + 1, "#e3a64f");

  // The arched side beams remain visible below the railing.
  set(x, 17, z - 1, "#8d2929");
  set(x, 17, z, "#bf3830");
  set(x, 31, z - 1, "#8d2929");
  set(x, 31, z, "#bf3830");
}

// Curved lacquered rails on both sides.
for (const y of [17, 31]) {
  for (let x = 7; x <= 41; x++) {
    const z = arch(x);
    box(x, y, z + 3, x, y, z + 4, "#ac302e");
    box(x, y, z + 7, x, y, z + 8, "#c83e35");
    set(x, y, z + 9, "#e5a84f");
    if (x % 3 === 0) set(x, y, z + 8, "#df6640");
  }

  for (const x of [8, 14, 20, 26, 32, 38, 41]) {
    const z = arch(x);
    box(x, y, z + 1, x + 1, y + 1, z + 8, "#422b29");
    box(x, y, z + 3, x, y, z + 7, "#922d2b");
    box(x, y, z + 9, x + 1, y + 1, z + 9, "#edb755");
    set(x, y, z + 10, "#f5d278");
  }

  // Gold-capped, slightly taller terminal posts.
  for (const x of [7, 40]) {
    const z = arch(x);
    box(x, y, z + 2, x + 1, y + 1, z + 10, "#8f2929");
    box(x, y, z + 11, x + 1, y + 1, z + 11, "#edb755");
    set(x, y, z + 12, "#f6d879");
  }
}

// A few bright ripples at the open front of the pond.
for (const [x, y, n] of [[11, 12, 3], [25, 10, 4], [35, 12, 3], [21, 37, 4]]) {
  for (let i = 0; i < n; i++) {
    if (get(x + i, y, 1)) set(x + i, y, 2, "#73bac0");
  }
}