fogón

← BásicoObjeto 3Dfogon/molino-holandes

Molino holandés

de fogonCC017291 bloques
Molino holandésArrastrá para girarlo
// «Molino holandés» · gpt-6-sol (medium)
// Windmill («Molino holandés»).

// Low, grassy island with a dark earthen edge.
for (let x = 2; x <= 46; x++) {
  for (let y = 4; y <= 44; y++) {
    const d = ((x - 24) / 21) ** 2 + ((y - 24) / 18) ** 2;
    if (d > 1) continue;
    const edge = d > 0.88;
    box(x, y, 0, x, y, edge ? 2 : 3,
      edge ? (rand() < 0.45 ? "#59442d" : "#705339") : "#795936");
    set(x, y, edge ? 3 : 4,
      ["#709747", "#81a956", "#91b761", "#638c42"][Math.floor(rand() * 4)]);
  }
}

// Pale stepping-stone path to the entrance.
for (let y = 5; y <= 15; y += 3) {
  for (let x = 22; x <= 27; x++) {
    if (rand() > 0.12) set(x, y, 5, rand() < 0.35 ? "#c7c3a9" : "#e3dfc8");
  }
}

// Stone foundation and tapered timber tower.
for (let z = 5; z <= 33; z++) {
  const r = z < 13 ? 9 : 9 - (z - 13) * 0.105;
  for (let x = 14; x <= 34; x++) {
    for (let y = 14; y <= 34; y++) {
      const dx = Math.abs(x - 24), dy = Math.abs(y - 24);
      if (Math.max(dx, dy) > r || dx + dy > r * 1.65) continue;
      let color;
      if (z < 12) {
        color = rand() < 0.17 ? "#755c40" : "#8b704d";
      } else {
        color = rand() < 0.13 ? "#735232" : "#86623d";
        if ((x % 3 === 0 || y % 3 === 0) && rand() > 0.12)
          color = z % 7 === 0 ? "#a47b4c" : "#a17749";
      }
      set(x, y, z, color);
    }
  }
}

// Strong vertical staves on the visible faces.
for (const x of [17, 20, 23, 26, 29, 32]) {
  const y = x < 19 || x > 29 ? 18 : 15;
  box(x, y - 1, 14, x, y - 1, 32, x % 2 ? "#b08955" : "#967044");
  for (let z = 16; z <= 31; z += 7)
    set(x, y - 2, z, "#63482f");
}
for (const y of [19, 22, 25, 28]) {
  box(33, y, 14, 33, y, 31, "#a67e4b");
}
for (const z of [12, 20, 30]) {
  box(17, 14, z, 30, 14, z, "#67492e");
}

// Projecting wooden gallery.
box(12, 12, 12, 36, 36, 13, "#715438");
for (let x = 12; x <= 36; x += 3)
  box(x, 11, 13, x + 1, 37, 13, "#a27b4d");
for (let y = 12; y <= 36; y += 3)
  box(11, y, 13, 37, y + 1, 13, "#957149");

const rail = "#e3d5ad";
const railShade = "#bcae8b";
for (let x = 12; x <= 36; x += 4) {
  for (const y of [11, 37]) {
    box(x, y, 14, x, y, 18, railShade);
    set(x, y - 1, 18, rail);
    set(x, y, 19, "#eee1bd");
  }
}
for (let y = 15; y <= 35; y += 4) {
  for (const x of [11, 37]) {
    box(x, y, 14, x, y, 18, railShade);
    set(x, y - 1, 18, rail);
    set(x, y, 19, "#eee1bd");
  }
}
for (const z of [15, 18]) {
  box(12, 11, z, 36, 11, z, rail);
  box(12, 37, z, 36, 37, z, railShade);
  box(11, 13, z, 11, 36, z, rail);
  box(37, 13, z, 37, 36, z, railShade);
}

// Blue-glazed windows with heavy wooden frames.
box(29, 13, 23, 32, 13, 28, "#563e2e");
box(30, 12, 24, 31, 12, 27, "#83b7b2");
set(30, 11, 27, "#c5ded1");
box(29, 11, 23, 32, 11, 23, "#c7a276");
box(32, 20, 22, 32, 24, 27, "#503d2d");
box(33, 21, 23, 33, 23, 26, "#81aaa2");
box(34, 20, 22, 34, 24, 22, "#c29a65");

// Deep red, stepped Dutch windmill cap.
for (let z = 33; z <= 40; z++) {
  const r = [10, 10, 9, 8, 7, 5, 3, 1][z - 33];
  for (let x = 24 - r; x <= 24 + r; x++) {
    for (let y = 24 - r; y <= 24 + r; y++) {
      const dx = Math.abs(x - 24), dy = Math.abs(y - 24);
      if (dx + dy > r * 1.65) continue;
      const front = y < 24;
      set(x, y, z, rand() < 0.19
        ? "#ac4939"
        : front ? "#8d382f" : "#78332b");
    }
  }
}
for (let z = 35; z <= 39; z += 2) {
  const r = z === 35 ? 9 : z === 37 ? 7 : 3;
  box(24 - r + 2, 24 - r - 1, z, 24 + r - 2, 24 - r - 1, z, "#68342b");
}
box(23, 23, 40, 25, 25, 41, "#60432b");
set(24, 24, 42, "#c3a575");

// Ground-floor entrance and little pitched porch.
box(20, 12, 5, 29, 17, 11, "#8b6945");
box(21, 11, 5, 28, 11, 11, "#b29369");
box(22, 10, 5, 27, 10, 10, "#4c6b61");
box(23, 9, 6, 26, 9, 10, "#568579");
box(23, 8, 6, 23, 8, 10, "#b79366");
box(26, 8, 6, 26, 8, 10, "#b79366");
set(25, 8, 8, "#dfbd75");
box(20, 9, 11, 29, 17, 11, "#68513e");
box(21, 8, 12, 28, 17, 12, "#885a45");
box(23, 8, 13, 26, 16, 13, "#a75c47");
box(24, 8, 14, 25, 15, 14, "#704436");

// Plants and bright red tulips.
function tulip(x, y, h, red) {
  box(x, y, 5, x, y, h, "#477841");
  set(x - 1, y, h - 2, "#65984a");
  set(x + 1, y + 1, h - 1, "#548b40");
  box(x, y, h + 1, x, y, h + 2, red);
  set(x - 1, y, h + 2, "#b83f39");
  set(x + 1, y, h + 2, "#d95040");
  set(x, y, h + 3, "#e06649");
}
tulip(13, 9, 8, "#d8483c");
tulip(18, 7, 7, "#c93a36");
tulip(35, 9, 9, "#db4639");
tulip(39, 16, 8, "#c73d38");
for (const [x, y] of [[8, 19], [10, 30], [15, 38], [39, 32], [37, 38]]) {
  box(x, y, 5, x + 1, y + 1, 6, "#527e3e");
  set(x, y, 7, "#76a54d");
}

// Four open, latticed wooden sails on the forward axle.
part("sails", [24, 10, 27]);
box(23, 8, 26, 25, 11, 28, "#674d31");
box(22, 7, 25, 26, 8, 29, "#a87d49");

for (const [ux, uz] of [[1, 1], [-1, 1], [-1, -1], [1, -1]]) {
  const vx = -uz, vz = ux;
  for (let s = 2; s <= 22; s++) {
    const cx = 24 + Math.round(ux * s / Math.SQRT2);
    const cz = 27 + Math.round(uz * s / Math.SQRT2);
    box(cx, 8, cz, cx, 10, cz, "#805f39");

    if (s < 5) continue;
    const width = s < 9 ? 2 : s > 19 ? 2 : 4;
    for (let t = 0; t <= width; t++) {
      const x = 24 + Math.round((ux * s + vx * t) / Math.SQRT2);
      const z = 27 + Math.round((uz * s + vz * t) / Math.SQRT2);
      const edge = t === 0 || t === width;
      const crossbar = s % 4 === 0 || s >= 21;
      if (edge || crossbar) {
        set(x, 7, z, edge ? "#b18b55" : "#d0ab70");
        if (crossbar && t > 0 && t < width) set(x, 8, z, "#9c7848");
      } else if (s % 4 < 3 && t > 0 && t < width && (s + t) % 5 !== 0) {
        set(x, 8, z, "#dcc08c");
      }
    }
  }
}
box(23, 6, 26, 25, 7, 28, "#d6b477");
set(24, 5, 27, "#735434");
animate("sails", { type: "spin", axis: "y", speed: 0.55 });