Primitive = параметры + boundary
3.01 отвечает за shapes, которые можно описать конечным набором canonical параметров и восстановить в local space без эстетической догадки.
Primitive families, canonical params, validation, boundary adapter и conversion в path.
Нет ObjectTransform, silhouette score, visual mass, holes/boolean topology или global composition.
LOCAL PRIMITIVE GEOMETRY ONLY.
Canonical family registry
Набор должен быть достаточно выразительным, но без дублирующих aliases. Circle канонически представлен ellipse с равными радиусами; ring/holed shape уже compound topology и уходит в 3.04.
| Family | Canonical params | Geometry contract |
|---|---|---|
RECT | width, height | axis-aligned canonical rectangle in local space |
ROUNDED_RECT | width, height, cornerRadius | corner radius clamped by min(width,height)/2 |
ELLIPSE | rx, ry | circle is rx=ry; no separate CIRCLE family required |
REGULAR_POLYGON | radius, sides, phase | n≥3; phase is intrinsic boundary parameter, not ObjectTransform rotation |
STAR | outerRadius, innerRadius, points, phase | points≥3; alternating outer/inner vertices |
CAPSULE | length, thickness, axis | canonical stadium/capsule; axis is local intrinsic parameter |
SUPERELLIPSE | rx, ry, exponent | |x/rx|^n + |y/ry|^n = 1; n>0 with implementation range |
CIRCLE → ELLIPSE(rx=r,ry=r). Square → RECT(width=height). Pill → CAPSULE. Alias допустим на input boundary, но после normalization machine contract хранит только canonical family.PrimitiveShapeGeometry
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
Параметры должны иметь один смысл
Canonicalization устраняет aliases и не даёт одинаковой геометрии сериализоваться десятком несовместимых способов.
Boundary equations
3.01 владеет построением границы, но не превращает её площадь/периметр в downstream quality metrics.
Ellipse
Regular polygon
Star
Superellipse
Bounds — геометрический contract, не occupancy
Local bounds нужны для geometry API и transform composition. Они не являются scene occupancy и не дают visual weight.
| Family | Canonical local bounds | Notes |
|---|---|---|
| RECT / ROUNDED_RECT | [-w/2,-h/2,w,h] | corner radius bounds не меняет |
| ELLIPSE | [-rx,-ry,2rx,2ry] | exact |
| REGULAR_POLYGON / STAR | from canonical vertices | phase может менять axis-aligned local bounds |
| CAPSULE | from length/thickness/axis | exact |
| SUPERELLIPSE | [-rx,-ry,2rx,2ry] | exact support box |
Conversion в PathShapeGeometry
Некоторым downstream-модулям нужен единый contour/path interface. Поэтому 3.01 определяет conversion, но ownership исходной primitive geometry сохраняется.
Polygonal families
RECT, REGULAR_POLYGON и STAR могут преобразовываться в точный closed polyline/path без approximation error.
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
}
Degeneracy и invalid params
Нулевая или некорректная форма не маскируется под маленькую валидную форму. Invalid input должен быть диагностирован явно.
| Case | Status | Correction route |
|---|---|---|
| width ≤ 0 / height ≤ 0 | INVALID | bounded parameter request |
| ellipse rx ≤ 0 или ry ≤ 0 | INVALID | caller / generator |
| polygon sides < 3 | INVALID | set integer ≥ 3 |
| star innerRadius ≥ outerRadius | INVALID | reduce inner / increase outer |
| capsule length < thickness | CANONICALIZE / INVALID BY POLICY | normalize or request explicit ellipse |
| superellipse exponent ≤ 0 | INVALID | positive finite exponent |
| NaN / Infinity | HARD INVALID | input owner |
Correction requests
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
}
Визуальная лаборатория
Одинаковая ShapeRole может использовать разные primitive families, а одна primitive family — разные roles. Лаборатория показывает geometry-only различия.
Reference geometry tests
Tests фиксируют canonicalization, validity, invariance и boundary construction. Они не калибруют aesthetic preference.
DATA FOR LAYOUT ENGINE
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"
}