Skip to content

ADR-008: Perimeter/core corner rule

Status: Accepted; superseded in part by ADR-012 (windows on rebuilt walls); extended to footprints with holes in S8.3; perimeter zones keep the footprint vertices since S8.5; several holes checked in S8.6 Date: 2026-10-01 Decisions: D-043; applies D-034, D-039, D-041

Context

Z2 in the research brief (§8) re-zones a floor plate into north, east, south, and west perimeter zones and a core, and admits other perimeter schemes. The roadmap (S3) asks for an inward offset by a perimeter depth, a perimeter split by orientation, a core, a corner rule recorded in this ADR, and a diagnostic, never a silent repair, for plans too narrow for a core.

Near a corner, floor area lies within the perimeter depth of two façades. The rule that assigns it decides:

  • how much floor area, and therefore how much of each source zone's loads and occupancy (area fractions, ADR-007), each perimeter zone receives;
  • whether each perimeter zone spans its whole façade, so that one zone holds all the windows of one orientation (source windows stay in place on the wall that contains them, D-039);
  • which interzone walls appear between perimeter zones.

A perimeter or core zone mixes dwelling units, corridor, and stair, so it also needs a space type.

In S3 the only generator is the rectangular linear plan (S2). Footprints with holes (courtyards) and irregular outlines arrive with the typologies in S8.

Options considered

  1. Bisector trapezoids. Offset every footprint edge inward by the depth with mitred joints. Each edge owns the trapezoid between the edge and its offset edge; neighbouring trapezoids meet on the angle bisector of the corner, the usual perimeter/core convention. The offset ring is the core.
  2. For: symmetric, no tie-breaking; every perimeter zone spans its whole façade, so it holds exactly the windows of its orientation; one formula for any simple outline; the pieces are exact polygons whose tiling can be checked.
  3. Against: diagonal interzone walls at the corners; at a sharp corner the core vertex lies far from the footprint vertex (d / sin(θ/2) for interior angle θ), and on non-convex outlines trapezoids can overlap, so validity must be checked.
  4. Rectangular strips with corner squares assigned to one orientation (for example, corners go to the longer façades).
  5. For: only orthogonal walls; simple for rectangles.
  6. Against: an arbitrary, asymmetric choice that moves d² of floor area per corner between orientations; the zone that receives a corner square also receives a piece of the neighbouring façade, so one perimeter zone holds walls and windows of two orientations; defined only for orthogonal outlines.
  7. Straight skeleton. Partition the footprint by its straight skeleton, which also handles non-convex outlines and holes; for convex outlines its first events coincide with the bisector trapezoids.
  8. For: the general answer for S8 shapes.
  9. Against: needs an algorithm the project does not have (the project uses Clipper2 for Boolean operations only, ADR-002), so a skeleton would have to be written and tested; much more code for no difference on the S3 plans.

Decision

PerimeterCore (Z2) uses bisector trapezoids (option 1):

  1. The perimeter depth d must be positive and finite; otherwise the error InvalidParameter.
  2. Footprints with holes (courts, S8.3) are offset on every ring by the same rule. Until S8.3 they failed with NotSupported.
  3. For a ring v₀ … vₙ₋₁ (the counter-clockwise outer ring or a clockwise hole, so the floor always lies on the ring's left), the core vertex of vᵢ is its mitred inward offset oᵢ = vᵢ + (a + b)·d / (1 + a·b), where a and b are the inward unit normals of the edges entering and leaving vᵢ. oᵢ lies on the bisector of the corner, at distance d from both edges. The offset is computed directly from this formula, not by a general polygon offset, so core vertex i belongs to footprint vertex i (ADR-002 leaves the inward offset to this ADR).
  4. Edge i owns the trapezoid vᵢ, vᵢ₊₁, oᵢ₊₁, oᵢ. The trapezoid is binned by the true azimuth of the edge's outward normal (plan azimuth plus plan orientation) into North [315°, 45°), East [45°, 135°), South [135°, 225°), or West [225°, 315°), the bins used for glazing.
  5. Validity checks, all required. Any failure is the error PlanTooNarrow, and no zones are produced: no repair, no reduced depth.
  6. The offset ring o₀ … oₙ₋₁ is a non-degenerate polygon (at least three distinct points and a non-zero area) and keeps its ring's orientation: counter-clockwise (positive signed area) for the outer ring, clockwise for a hole.
  7. The offset ring is simple: no two non-adjacent offset edges come within Distance (ADR-004) of each other, so the ring neither crosses nor touches itself; adjacent edges share only their common vertex. This catches a part of the footprint not wider than 2d that no single edge spans, such as a neck between two blocks: every offset edge keeps its direction and the signed areas of the trapezoids and the core still add up, but the offset façades of the two sides of the neck cross. The check runs on the outer ring and on every hole.
  8. Every offset edge keeps the direction of its footprint edge (positive dot product). A reversed edge means the depth exceeds what the edge's length and corner angles allow.
  9. The trapezoids and the core tile the footprint: the sum of their areas equals the footprint area within RelativeArea (ADR-004). This catches overlapping trapezoids on non-convex outlines.
  10. With holes (S8.3): the core is the polygon with the offset outer ring as its outer ring and the offset holes as its holes. Clipping the offset holes from the offset outer ring must give one polygon of the core's area within RelativeArea, so every offset hole lies inside the offset outer ring and apart from the other offset holes. Otherwise a wing between the outer and a court façade, or between two courts, is not wider than 2d, the perimeter bands of the two façades overlap, and the area sum of the previous check cannot show it, because the signed areas still add up.
  11. Trapezoids of the same bin are united, and every vertex of the union in the grid cell of a footprint vertex is replaced by that footprint vertex (ADR-002), so the perimeter zones keep the footprint's own vertices instead of vertices rounded to the clipping grid (S8.5); the mitred offset vertices keep their rounding. A bin that unites into one polygon becomes zone P-<Bin> ("Perimeter "); a bin that yields several polygons becomes P-<Bin>-1, P-<Bin>-2, … in union output order, so every zone is one polygon. The trapezoids of the holes' edges, which face into the courts, are united per bin separately and become the court perimeter zones P-Court-<Bin> ("Perimeter Court "), numbered in the same way; with several holes the trapezoids of one bin are united across all holes, so each court gives its own polygon and P-Court-<Bin>-1, -2, … are numbered in union output order (S8.6); the bin is the direction the court façade faces, so the south wing's court façade belongs to P-Court-North. Zones are listed North, East, South, West, then the court zones North, East, South, West, then the core CORE ("Core"), which has a hole for each court.
  12. Perimeter and core zones get space type Mixed. Their programs, including conditioning and setpoints, come only from aggregating the source zones (ADR-005, ADR-007, D-038), never from a preset.
  13. Everything after the footprints is the shared simplification pipeline: surfaces are rebuilt from the target footprints, so walls between merged sources disappear (D-034); the target façades must cover every source façade (D-041); every source window moves unchanged onto the perimeter wall that contains it (D-039); the core has no outdoor walls and no windows.
  14. The depth is recorded in provenance as PerimeterDepth. The Perimeter Core Grasshopper component offers 4.57 m as the default of its Depth input. This default is an input convenience, not a sourced value and not a research rule; experiments set the depth explicitly.

Consequences

  • At a right-angled corner each of the two façades receives a triangle of d²/2. For the canonical 24 m × 18 m linear plan with d = 4.57 m: P-North and P-South 88.7951 m² each, P-East and P-West 61.3751 m² each, and a 14.86 m × 8.86 m core of 131.6596 m².
  • Each corner gets a diagonal interzone wall between two perimeter zones (canonical plan: 4.57 m × √2 = 6.462956 m long, 19.388868 m² at a 3 m storey height). The Z0 plan has no such walls; their effect is part of what Z2 measures.
  • Each footprint edge becomes the outdoor wall of exactly one perimeter zone, so the façade is covered and every source window, which lies on one footprint edge, finds its host wall. On the canonical plan P-South keeps the three south windows at their positions (19.2 m² of glazing).
  • Source zones at corners are split between up to three targets (on the canonical plan the stair maps 8 m² to P-North, 8 m² to P-South, and 56 m² to P-West). Area fractions are normalised per source, so loads stay conserved exactly. Because the stair is unconditioned in the example presets and every perimeter zone also receives conditioned sources, the conditioned floor area grows; validation reports this (D-038).
  • A plan narrower than 2d fails: the canonical plan with d = 10 m returns PlanTooNarrow. The user chooses a smaller depth; the simplifier never chooses one.
  • Non-rectangular plans (S8.2, ADR-006): the bisector rule holds unchanged at re-entrant corners, where the two trapezoids meet on the diagonal of the inside corner, so the comb of the winged band and the U of the open court pass the checks at their default 12 m wing depth with the default 4.57 m depth, and a façade direction with several runs (the court's three south-facing façades) gives numbered zones such as P-South-1. Every wing, plate, and other part of the footprint must be wider than 2d: the open court with 8 m wings fails with PlanTooNarrow, whose message states this precondition and suggests a smaller depth or another simplifier. Supporting narrower wings would need a different partition, such as the straight skeleton (option 3), and a new ADR.
  • Non-convex outlines that pass the checks are supported; those that fail are rejected, not repaired. A bin with two separate façade runs (for example two south-facing steps) becomes two zones. If S8 typologies need more, a straight-skeleton rule would supersede this ADR.
  • Footprints with holes (S8.3, the enclosed court HDHM-TYP-005 of ADR-006): every ring gets bisector trapezoids, so a court façade is zoned like an outer façade, and the core is a ring around the court. The court façades get their own zones because they are different façades from the outer façades of the same bin, facing a court instead of the street; uniting them with the outer zone of their bin would always give two separate polygons (the core lies between them), numbered P-North-1, P-North-2 in an order that says nothing about which is which. For the default enclosed court (48 m × 48 m with a 24 m × 24 m court, 12 m wings) with d = 4.57 m: P-North, P-East, P-South, P-West 198.4751 m² each, P-Court-North … P-Court-West 130.5649 m² each, and a CORE ring of 38.86² − 33.14² = 411.84 m². Every wing between the outer and a court façade must be wider than 2d (D-087): 9 m wings fail with PlanTooNarrow. The bands of the outer and court façades never touch, so no trapezoid of a hole is ever united with one of the outer ring.
  • Footprints with several holes (S8.6, the court cluster SYN-TYP-011 of ADR-006, a row of courts between wings of stair bays) need no change. Every hole is offset by the same rule, and the court trapezoids of each bin are united across all holes; the bands of two courts never touch when the middle wing between them is wider than 2d, so each bin gives one polygon per court, P-Court-North-1, P-Court-North-2, …, numbered in the union's output order. On the canonical plan that order is west to east; on a rotated plan the number is not tied to a court, as for the numbered outer zones. For the default court cluster (84 m × 48 m with two 24 m × 24 m courts, 12 m wings) with d = 4.57 m: P-North and P-South 362.9951 m², P-East and P-West 198.4751 m², eight court zones of 130.5649 m² (as for the enclosed court), and a CORE with two holes of 74.86 × 38.86 − 2 × 33.14² = 712.5404 m². A middle wing not wider than 2d makes the offset holes of its two courts overlap, which the check that clipping the offset holes from the offset outer ring gives one polygon of the core's area rejects (PlanTooNarrow): 9 m wings fail. Naming the court zones by their court instead is left for a later ADR, if a study needs to tell the courts apart.
  • Short façade edges (S8.5, the hub corners of the care hub SYN-TYP-018 of ADR-006): until S8.5 the trapezoids of a bin were united with a plain union, which rounds every vertex to the clipping grid, up to 0.7 µm off. On a rotated plan that turns a footprint edge shorter than about 1 m, such as the 0.8 m of hub façade beside a 14.4 m wing on a 16 m hub, by more than the angular tolerance (ADR-004), so Single Zone per Floor Type and Single Zone Building found that the outline united from the perimeter zones did not cover the short source wall (FacadeNotCovered) at about one rotation in five. Restoring the footprint's vertices after the union puts the rebuilt outline exactly on the source walls. Only footprint vertices are restored: restoring the offset vertices too (a union as tiles) would move the 45° corner walls of the canonical linear plan by less than the grid and flip their facing bin at the North/East boundary, changing results for no gain. No tolerance changed, and every existing result is unchanged.
  • Every Z2 zone reports space type Mixed in Convert2BEM.
  • This ADR changes no equivalence rule: research brief §8 already admits other perimeter schemes, and the aggregation (ADR-005, ADR-007, D-038) and window (D-039) rules are unchanged, so the research documentation needs no edit (GLOBAL.md scientific rule 7).