COMPO · 3.01 · PRIMITIVE / PARAMETRIC SHAPES

Примитивы и
параметрические
формы.

Canonical local geometry для прямоугольников, эллипсов, регулярных многоугольников, звёзд, capsule и superellipse. Модуль определяет параметры, validity, boundary и deterministic conversion в path — без role guessing, visual mass, holes, transform ownership или aesthetic score.

ModuleCompo 3.01
Scopelocal primitive geometry
Ownsparams / boundary
Metricsnone
Topic3 · SHAPE
Next3.02

Primitive = параметры + boundary

00 / module api

3.01 отвечает за shapes, которые можно описать конечным набором canonical параметров и восстановить в local space без эстетической догадки.

SCOPE

Primitive families, canonical params, validation, boundary adapter и conversion в path.

BOUNDARY

Нет ObjectTransform, silhouette score, visual mass, holes/boolean topology или global composition.

FINALITY

LOCAL PRIMITIVE GEOMETRY ONLY.

PARAMETRIC ≠ SEMANTIC. Rectangle не означает panel, circle не означает accent, star не означает decoration. ShapeRole приходит из 3.00/caller.

Canonical family registry

01 / primitive families

Набор должен быть достаточно выразительным, но без дублирующих aliases. Circle канонически представлен ellipse с равными радиусами; ring/holed shape уже compound topology и уходит в 3.04.

FamilyCanonical paramsGeometry contract
RECTwidth, heightaxis-aligned canonical rectangle in local space
ROUNDED_RECTwidth, height, cornerRadiuscorner radius clamped by min(width,height)/2
ELLIPSErx, rycircle is rx=ry; no separate CIRCLE family required
REGULAR_POLYGONradius, sides, phasen≥3; phase is intrinsic boundary parameter, not ObjectTransform rotation
STARouterRadius, innerRadius, points, phasepoints≥3; alternating outer/inner vertices
CAPSULElength, thickness, axiscanonical stadium/capsule; axis is local intrinsic parameter
SUPERELLIPSErx, ry, exponent|x/rx|^n + |y/ry|^n = 1; n>0 with implementation range
Aliases. CIRCLE → ELLIPSE(rx=r,ry=r). Square → RECT(width=height). Pill → CAPSULE. Alias допустим на input boundary, но после normalization machine contract хранит только canonical family.

PrimitiveShapeGeometry

02 / geometry schema

Primitive geometry хранится в собственной локальной системе координат вокруг canonical origin. Position/rotation/scale остаются во внешнем ObjectTransform.

Canonical object

PrimitiveShapeGeometry {
  kind: "PRIMITIVE",
  family: PrimitiveFamily,
  params: CanonicalPrimitiveParams,
  localOrigin: {x:0,y:0},
  localBounds,
  boundaryExactness:
    "EXACT|BOUNDED_APPROXIMATION",
  sourceParamHash,
  version,
  provenance
}

Not stored here

position      // ObjectTransform
rotation      // ObjectTransform
scale         // ObjectTransform
reflection    // ObjectTransform
skew          // ObjectTransform

visualMass    // Topic 4
occupancy     // Topic 4 / grids
freeSpace     // Topic 5
beautyScore   // nowhere

Параметры должны иметь один смысл

03 / canonicalization

Canonicalization устраняет aliases и не даёт одинаковой геометрии сериализоваться десятком несовместимых способов.

normalizePrimitive(input): CIRCLE(r) → ELLIPSE(rx=r, ry=r) SQUARE(size) → RECT(width=size, height=size) ROUNDED_RECT: r = clamp(r, 0, min(width,height)/2) REGULAR_POLYGON: sides = integer >= 3 phase = positiveModulo(phase, 2π) STAR: points >= 3 0 < innerRadius < outerRadius phase = positiveModulo(phase, 2π) CAPSULE: axis ∈ {X,Y} length >= thickness if length == thickness: canonical geometry may normalize to ELLIPSE SUPERELLIPSE: rx>0, ry>0, exponent>0
DETERMINISTIC SERIALIZATION. Одинаковая canonical geometry должна давать одинаковый parameter hash независимо от исходного alias.

Boundary equations

04 / exact geometry

3.01 владеет построением границы, но не превращает её площадь/периметр в downstream quality metrics.

Ellipse

x(t)=rx·cos(2πt) y(t)=ry·sin(2πt) t∈[0,1) localBounds = [-rx,-ry, 2rx,2ry]

Regular polygon

φᵢ = phase + 2πi/n vᵢ = r·(cosφᵢ, sinφᵢ) n ≥ 3 boundary = closed polyline(v₀…vₙ₋₁)

Star

2n vertices rᵢ = outerRadius if i even innerRadius if i odd φᵢ = phase + πi/n

Superellipse

x(φ)=rx·sgn(cosφ)|cosφ|^(2/n) y(φ)=ry·sgn(sinφ)|sinφ|^(2/n) n>0
AREA IS NOT PUBLISHED AS A 3.01 OWNER METRIC. Аналитические формулы могут использоваться в tests/validation, но канонический silhouette-area/occupancy contract принадлежит теме 4.

Bounds — геометрический contract, не occupancy

05 / local bounds

Local bounds нужны для geometry API и transform composition. Они не являются scene occupancy и не дают visual weight.

FamilyCanonical local boundsNotes
RECT / ROUNDED_RECT[-w/2,-h/2,w,h]corner radius bounds не меняет
ELLIPSE[-rx,-ry,2rx,2ry]exact
REGULAR_POLYGON / STARfrom canonical verticesphase может менять axis-aligned local bounds
CAPSULEfrom length/thickness/axisexact
SUPERELLIPSE[-rx,-ry,2rx,2ry]exact support box
localBounds != worldBounds worldBounds = Compo3.05 derive(localGeometry, ObjectTransform) bounds != silhouette area bounds != occupancy bounds != visual mass

Conversion в PathShapeGeometry

06 / primitive → path

Некоторым downstream-модулям нужен единый contour/path interface. Поэтому 3.01 определяет conversion, но ownership исходной primitive geometry сохраняется.

EXACT

Polygonal families

RECT, REGULAR_POLYGON и STAR могут преобразовываться в точный closed polyline/path без approximation error.

CURVED

Analytic families

ELLIPSE, ROUNDED_RECT, CAPSULE и SUPERELLIPSE используют exact curve primitives, если backend их поддерживает; иначе bounded approximation с error provenance.

PrimitiveToPathResult {
  status: "exact|approximate|unsupported",
  sourcePrimitiveRef,
  pathGeometry,
  maxErrorBound?,
  segmentBudget?,
  confidence,
  provenance
}
NO OWNER THEFT. Conversion создаёт derived path representation. Она не делает 3.02 владельцем исходных primitive parameters и не заставляет 3.01 владеть organic path semantics.

Degeneracy и invalid params

07 / validity

Нулевая или некорректная форма не маскируется под маленькую валидную форму. Invalid input должен быть диагностирован явно.

CaseStatusCorrection route
width ≤ 0 / height ≤ 0INVALIDbounded parameter request
ellipse rx ≤ 0 или ry ≤ 0INVALIDcaller / generator
polygon sides < 3INVALIDset integer ≥ 3
star innerRadius ≥ outerRadiusINVALIDreduce inner / increase outer
capsule length < thicknessCANONICALIZE / INVALID BY POLICYnormalize or request explicit ellipse
superellipse exponent ≤ 0INVALIDpositive finite exponent
NaN / InfinityHARD INVALIDinput owner
N/A ≠ INVALID. Если primitive family просто неприменима к semantic request, это generator/scorer applicability. Некорректные параметры уже выбранной primitive geometry — именно INVALID.

Correction requests

08 / no foreign mutation

3.01 может предложить bounded исправление собственных параметров. Любая попытка изменить role, transform или compound topology маршрутизируется владельцу.

Own params

width / radius / sides / phase / exponent

Transform

→ 3.05 / Core ObjectTransform

Organic contour

→ 3.02

Holes / boolean

→ 3.04

PrimitiveGeometryCorrectionRequest {
  sourcePrimitiveId,
  parameter,
  currentValue,
  requestedRange?,
  requestedRelation?,
  reason,
  provenance
}

Визуальная лаборатория

09 / visual lab

Одинаковая ShapeRole может использовать разные primitive families, а одна primitive family — разные roles. Лаборатория показывает geometry-only различия.

RECTROUNDED_RECTELLIPSEREGULAR_POLYGON STARCAPSULESUPERELLIPSE All are LOCAL geometry. No role inferred. No mass score. No global rank.

Reference geometry tests

10 / deterministic tests

Tests фиксируют canonicalization, validity, invariance и boundary construction. Они не калибруют aesthetic preference.

Tests not run yet.

DATA FOR LAYOUT ENGINE

11 / machine contract

Machine-readable contract для 3.01.

{
  "module": "Compo 3.01",
  "name": "primitive_and_parametric_shapes",
  "version": "1.0-canonical",
  "scope": "LOCAL_PRIMITIVE_SHAPE_GEOMETRY_AND_PARAMETERIZATION",
  "consumes": [
    "Compo3.00.Shape",
    "Compo3.00.PrimitiveShapeGeometry interface",
    "Compo0.ObjectTransform? only as external reference; never baked implicitly",
    "GeometryToleranceContext?"
  ],
  "provides": [
    "PrimitiveShapeGeometry",
    "PrimitiveFamily",
    "PrimitiveValidationResult",
    "CanonicalPrimitiveParams",
    "PrimitiveBoundaryAdapter",
    "PrimitiveToPathResult",
    "PrimitiveGeometryCorrectionRequest[]"
  ],
  "owns_contracts": [
    "primitive family enum",
    "family-specific local parameter schemas",
    "parameter canonicalization",
    "primitive local-space validity",
    "exact/controlled primitive boundary construction",
    "primitive-to-path conversion contract"
  ],
  "owns_metrics": [],
  "descriptors_only": [
    "family",
    "canonicalParams",
    "localBounds",
    "boundaryExactness",
    "degeneracyCode",
    "conversionErrorBound",
    "sourceParamHash"
  ],
  "families": {
    "RECT": {
      "params": [
        "width",
        "height"
      ],
      "exactBoundary": true
    },
    "ROUNDED_RECT": {
      "params": [
        "width",
        "height",
        "cornerRadius"
      ],
      "exactBoundary": true
    },
    "ELLIPSE": {
      "params": [
        "rx",
        "ry"
      ],
      "exactBoundary": true
    },
    "REGULAR_POLYGON": {
      "params": [
        "radius",
        "sides",
        "phase"
      ],
      "exactBoundary": true
    },
    "STAR": {
      "params": [
        "outerRadius",
        "innerRadius",
        "points",
        "phase"
      ],
      "exactBoundary": true
    },
    "CAPSULE": {
      "params": [
        "length",
        "thickness",
        "axis"
      ],
      "exactBoundary": true
    },
    "SUPERELLIPSE": {
      "params": [
        "rx",
        "ry",
        "exponent"
      ],
      "exactBoundary": "PARAMETRIC_EXACT_OR_BOUNDED_APPROX_PATH"
    }
  },
  "canonical_parameter_rules": {
    "all_lengths": "finite and >0 unless explicitly resolving to degeneracy",
    "rounded_rect_cornerRadius": "clamp to [0,min(width,height)/2]",
    "regular_polygon_sides": "integer >= 3",
    "star_points": "integer >= 3",
    "star_innerRadius": "0 < innerRadius < outerRadius",
    "phase": "positive modulo 2π",
    "capsule_axis": "X|Y",
    "superellipse_exponent": "finite > 0; reference implementation recommends [0.5,8] as initial bounded range"
  },
  "boundary_interface": {
    "localBounds": "() -> Rect",
    "pointAt": "(t01) -> Point",
    "tangentAt": "(t01) -> Vector | N/A at declared singularities",
    "toPath": "(policy) -> PrimitiveToPathResult",
    "containsLocal": "(point) -> bool|boundary",
    "exactness": "EXACT|BOUNDED_APPROXIMATION"
  },
  "hard_constraints": [
    "local primitive geometry must not include object position/rotation/scale/reflection",
    "invalid or degenerate params must never silently become zero-area valid shapes",
    "primitive family must be explicit; do not infer semantic ShapeRole from family",
    "circle is canonical ELLIPSE rx=ry, not a duplicate top-level primitive family",
    "holes/rings/boolean compounds are not primitive families; route to Compo3.04",
    "visual mass / silhouette area / occupancy are not owned here",
    "scene negative space is not owned here",
    "convexity/concavity quality is not scored here",
    "no beautyScore"
  ],
  "initial_heuristics": {
    "superellipse_exponent_reference_range": {
      "value": [
        0.5,
        8.0
      ],
      "provenance": "IMPLEMENTATION_HEURISTIC"
    },
    "approx_path_max_error_shortN": {
      "value": 0.0005,
      "provenance": "INITIAL_HEURISTIC"
    },
    "approx_path_max_segments": {
      "value": 256,
      "provenance": "IMPLEMENTATION_HEURISTIC"
    }
  },
  "correction_policy": {
    "direct_foreign_transform_mutation": "FORBIDDEN",
    "invalid_param": "return bounded parameter correction request",
    "compound_request": "route to Compo3.04",
    "organic_freeform_request": "route to Compo3.02",
    "semantic_role_change": "route to caller/Compo3.00"
  },
  "deferred_inputs": [
    "Compo3.03 silhouette readability/topology interpretation",
    "Compo3.04 holes/convexity/concavity",
    "Compo3.05 transform-derived world geometry",
    "Compo3.06 candidate scoring",
    "Topic4 visual mass/area/occupancy/density",
    "Topic5 positive/negative space",
    "global balance/hierarchy/eye-flow"
  ],
  "recompute_when": [
    "family changes",
    "any canonical primitive parameter changes",
    "geometry tolerance policy changes",
    "primitive-to-path approximation policy changes"
  ],
  "finality": "LOCAL_PRIMITIVE_GEOMETRY_ONLY"
}
ARCHITECTURE CHECKPOINT · 3.01 OWNS ONLY CANONICAL PRIMITIVE PARAMETERS, VALIDATION AND LOCAL BOUNDARY CONSTRUCTION. ORGANIC PATHS → 3.02. SILHOUETTE READABILITY → 3.03. HOLES/CONVEXITY/BOOLEAN REGION TOPOLOGY → 3.04. OBJECT TRANSFORM → CORE / 3.05 ADAPTER. VISUAL MASS / SILHOUETTE AREA / OCCUPANCY → TOPIC 4. SCENE FREE SPACE → TOPIC 5. NO BEAUTYSCORE.
VISITS / ...