fogón

← City3D assetfogon/tanque-de-agua

Tanque de agua

by fogonCC013617 blocks
Tanque de aguaDrag to turn it
// «Tanque de agua» · gpt-6-sol (medium)
// A rooftop water tank: a white cylindrical plastic tank with a domed lid on a small metal stand of four legs, with a pipe coming down and a little ladder on one side, as seen on Buenos Aires terraces.

const white = "#f3f3e9", light = "#ffffff", shade = "#d9e1de";
const steel = "#42615c", steelLight = "#66817a", steelDark = "#304943";
const concrete = "#c9c5b7";

// Four concrete feet and the dark green iron stand.
for (const x of [14, 33]) for (const y of [14, 33]) {
  box(x - 2, y - 2, 0, x + 2, y + 2, 1, concrete);
  box(x - 1, y - 1, 2, x + 1, y + 1, 17, steel);
  box(x - 1, y - 1, 2, x, y, 17, steelLight);
}
for (const y of [14, 33]) {
  box(14, y - 1, 15, 33, y + 1, 17, steelDark);
}
for (const x of [14, 33]) {
  box(x - 1, 14, 15, x + 1, 33, 17, steelDark);
}
for (const y of [14, 33]) {
  line(15, y, 5, 24, y, 15, 0, steelLight);
  line(33, y, 5, 24, y, 15, 0, steelLight);
}

// Solid molded plastic tank, with shaded sides and chunky circular ribs.
const cx = 24, cy = 24, radius = 13;
for (let z = 17; z <= 34; z++) {
  for (let x = cx - radius; x <= cx + radius; x++) {
    for (let y = cy - radius; y <= cy + radius; y++) {
      const d = Math.hypot(x - cx, y - cy);
      if (d > radius + 0.15) continue;
      let color = white;
      if (z <= 18 || (x > 30 && y > 22)) color = shade;
      else if (y < 20 && x < 28) color = light;
      if (d > 11.7 && rand() < 0.09) color = shade;
      if (d > 11.7 && [19, 22, 31, 34].includes(z))
        color = z === 19 ? "#b9cbc8" : "#e0e8e4";
      set(x, y, z, color);
    }
  }
}

// Rounded dome rises from the tank's upper rim.
const domeRadii = [13, 12, 11, 10, 8, 6, 4, 2];
for (let i = 0; i < domeRadii.length; i++) {
  const r = domeRadii[i], z = 35 + i;
  for (let x = cx - r; x <= cx + r; x++)
    for (let y = cy - r; y <= cy + r; y++)
      if (Math.hypot(x - cx, y - cy) <= r + 0.1)
        set(x, y, z, y < 21 ? light : (x > 29 ? shade : white));
}
cylinder(24, 24, 42, 3, 1, "#d1dbd7");
cylinder(24, 24, 43, 2, 1, white);

// Modest turquoise maker's badge, following the curved front of the tank.
function frontY(x) {
  return 24 - Math.floor(Math.sqrt(13 * 13 - (x - 24) ** 2)) - 1;
}
for (let x = 26; x <= 32; x++)
  for (let z = 25; z <= 29; z++)
    set(x, frontY(x), z, "#267a79");
for (let x = 27; x <= 31; x++)
  set(x, frontY(x) - 1, 29, "#f4c86b");
set(28, frontY(28) - 1, 27, "#ffffff");
set(29, frontY(29) - 1, 26, "#ffffff");
set(30, frontY(30) - 1, 27, "#ffffff");

// An exposed PVC downpipe and its elbow at the tank wall.
box(36, 20, 23, 40, 21, 24, "#c4d7d6");
box(39, 20, 1, 40, 21, 23, "#dfe8e4");
box(39, 20, 1, 39, 20, 22, "#ffffff");
box(38, 16, 1, 40, 21, 2, "#c4d7d6");
box(37, 15, 1, 39, 17, 2, "#9db9b5");

// Narrow ladder on the viewer-facing side, with visible individual rungs.
for (const x of [17, 23]) {
  box(x, 8, 1, x, 9, 37, steelDark);
  box(x, 8, 2, x, 8, 36, steelLight);
  box(x, 9, 36, x, 13, 37, steelLight);
}
for (let z = 4; z <= 34; z += 3) {
  box(18, 8, z, 22, 9, z, steelLight);
  box(18, 8, z, 22, 8, z, "#9eb1a8");
}
for (const z of [19, 28, 35])
  for (const x of [17, 23])
    box(x, 10, z, x, 13, z, steelDark);