COMPO · 2.00 · LINE SYSTEM

Линия:
обзор и
система ролей

Базовый контракт для всех модулей линии. Линия рассматривается не как «выразительное средство» в абстрактном смысле, а как вычислимый объект: геометрия, направление, толщина, длина, кривизна, контраст, роль и влияние на маршрут чтения.

Что машина считает линией

00 / object model

SEGMENT

Отрезок между двумя точками. Минимальная вычислимая линия.

P0=(x0,y0) P1=(x1,y1) L=|P1-P0| θ=atan2(y1-y0,x1-x0)

POLYLINE

Последовательность сегментов с общей топологией.

P[0..n] segments = n-1 turnAngle[i] closed = false|true

CURVE / PATH

Кривая, у которой направление определяется касательной, а не одной общей осью.

C(t), t∈[0,1] tangent(t)=normalize(C'(t)) curvature κ(t)
Правило: декоративный штрих, ось сетки, стрелочная траектория, граница блока и соединитель — геометрически могут быть одинаковой линией, но их role различается. Роль определяет допустимые пересечения, вес, приоритет и scoring.

Система ролей

01 / line taxonomy
RoleНазначениеТипичное поведениеПриоритет
axisструктурная осьпрямая, длинная, привязана к сетке или объектамstructure
dividerразделение областейпересекает значительную часть поля, не должна выглядеть случайным штрихомstructure
connectorсвязь объектов/узловимеет источник и цель, избегает лишних пересеченийsemantic
trajectoryнаправление взгляда/движенияориентирована, может быть кривой или ломанойflow
frameграница/контейнеробразует enclosure, часто замкнута или почти замкнутаstructure
baselineвыравнивание текста/объектовслужебная линия, чаще невидима в финальном рендереlayout
accentлокальный визуальный ударне обязана соединять объектыvisual
rhythmповтор / тактсерия линий с контролируемыми интерваламиvisual
textureфон, штриховка, вычислительный шумнизкий приоритет, ограниченный контрастbackground
annotationвыноска/подписьведёт от объекта к тексту или маркеруsemantic

role

Стабильная семантическая категория из таблицы выше. Новые локальные модули не создают собственные role-синонимы.

subrole

Уточняет контекст: grid, section, decorative, text, object и т. п.

rigidity

hard | soft | free. Отвечает за допустимость коррекций, а не за семантику линии.

CANONICAL ROLE NORMALIZATION old grid_axis → role="axis", subrole="grid", rigidity="hard" old divider_strict → role="divider", subrole="section", rigidity="hard" old decorative → role="accent", subrole="decorative", rigidity="soft"
HARD CONTRACT: downstream-модули не имеют права вводить новые верхнеуровневые role вроде grid_axis или divider_strict. Для этого существуют subrole и rigidity.

Минимальный набор параметров

02 / canonical schema
P0/P1
endpoints

Начало и конец path. Для polyline/curve это граничные точки всей траектории.

L
path length

Каноническая длина пути в px / shortN / diagN.

tangents

Начальное и конечное направление; для segment совпадает с unit vector.

B
bounds / extent

Пространственный охват path, отдельный от длины пути.

w
stroke width

Толщина как доля min(W,H).

C
contrast

Контраст приходит от своего владельца; здесь только ссылка/вход.

α
opacity

Прозрачность как независимый параметр.

z
layer

Порядок перекрытия относительно объектов и текста.

Line { id: string, role: LineRole, subrole?: string, rigidity: hard | soft | free, geometryType: segment | curve | polyline, geometry: Segment | Curve | Polyline, pathGeometry: LinePathGeometry, widthN: float, opacity: float, dash?: DashPattern, directed: bool, sourceId?: string, targetId?: string, zIndex: int, visibility: visible | construction | hidden, provenance: DERIVED | HEURISTIC | STYLE_PRESET } LinePathGeometry { geometryType: segment | curve | polyline, pathLengthPx: float, pathLengthShortN: float, pathLengthDiagN: float, chordLengthPx: float, boundsN: Rect, spatialExtentX_N: float, spatialExtentY_N: float, spatialExtentShortN: float, startPointN: Vec2, endPointN: Vec2, startTangent: Vec2, endTangent: Vec2 }
Единый интерфейс пути: Compo 2.01, 2.04 и 2.05 строят один и тот же LinePathGeometry. Все последующие line-модули потребляют этот интерфейс и не обязаны знать, segment перед ними, curve или polyline.

Направление ≠ абстракция

03 / movement vector

Вектор линии

v = P1 - P0 u = v / |v| θ = atan2(v.y, v.x) if directed == false: θ_equiv = θ mod 180° else: θ_equiv = θ mod 360°

Линия создаёт предпочтительное направление чтения. Для машины это фиксируется вектором и затем сравнивается с другими направлениями сцены.

Кривая линия

for t in [0..1]: T(t) = normalize(C'(t)) entryDirection = T(0) exitDirection = T(1) meanTurn = mean(Δangle(T))

Кривую нельзя оценивать одним углом. Она задаёт последовательность локальных направлений.

DEFERRED INPUT: реальный eye_flow_score принадлежит будущему модулю движения взгляда. Compo 2.00 только экспортирует геометрические направления, но не объявляет их «хорошими» или «плохими» глобально.

Машинно различимые примеры

04 / visual lab
role = axis
Ось связывает объекты общей координатой. Она структурирует, а не просто украшает.
role = connector
Connector обязан иметь семантические endpoints. Случайная линия без source/target — другой role.
role = accent
Акцент может не соединять ничего. Его задача — добавить локальный контраст и направление.
role = trajectory
Направленная траектория кодирует путь от source к target.
role = rhythm / progressive spacing
Интервалы возрастают последовательно; ритм вычисляется, а не задаётся “на глаз”.
role = texture
Фоновая линия имеет низкий контраст и не конкурирует с доминантой.

Hard и soft правила

05 / constraint classes

HARD CONSTRAINTS

  • length > ε; нулевая линия запрещена.
  • widthN > 0 для видимой линии.
  • connector обязан иметь валидные source/target или явные anchors.
  • Служебная baseline не рендерится, если visibility=construction.
  • Недопустимое пересечение protected-zone должно быть reject или repair, а не игнорирование.

SOFT CONSTRAINTS

  • избегать почти параллельных линий с малым случайным углом;
  • избегать случайных касаний с объектами;
  • ограничивать контраст texture/rhythm-линий;
  • предпочитать осмысленные endpoints;
  • снижать число пересечений connector-линий.
Важно: значения углов, толщин и допустимых дистанций будут детально определяться в Compo 2.01–2.xx. В 2.00 фиксируется архитектура, а не окончательная калибровка.

Последовательность работы

06 / local pipeline
INPUT: scene + requested line roles 1. CLASSIFY PURPOSE определить: axis / divider / connector / trajectory / frame / baseline / accent / rhythm / texture / annotation 2. BUILD GEOMETRY CANDIDATES segment / polyline / curve endpoints, angle, length, width, curvature 3. HARD FILTER удалить degenerate geometry удалить запрещённые protected-zone conflicts проверить semantic endpoints для connector/annotation 4. LOCAL SCORE geometry validity role consistency endpoint quality local collision/tangency local contrast 5. CONTEXT PASS запросить чужие метрики через DEFERRED_INPUT hierarchy / negative space / global balance / eye flow 6. CORRECTIVE PASS move endpoint rotate shorten / extend change width reroute curve/polyline lower contrast 7. PROVIDE CANDIDATES не фиксировать финальный layout передать кандидатов global solver

Metric ownership

07 / no double counting
MetricOwnerCompo 2.00 action
line_visual_weightCompo 2.06DEFERRED
axis_class / diagonal_classCompo 2.02 / 2.03DEFERRED
path geometryCompo 2.01 / 2.04 / 2.05canonical interface only
line_collisionCompo 2.10+geometry export only
rhythm_scorefuture Compo 2.xxDEFERRED
eye_flow_scoreglobal eye-flow moduleDEFERRED
global_balance_scoreglobal balance moduleDEFERRED

Карта Compo 2.xx

08 / canonical decomposition 2.00–2.23

2.01

Геометрия линии: начало, конец, длина и угол.

2.02

Горизонтальные и вертикальные линии.

2.03

Диагональные линии и направление.

2.04

Кривые линии.

2.05

Ломаные и сегментированные линии.

2.06

Толщина линии и визуальный вес.

2.07

Длина пути, пространственный span и роль.

2.08

Линия как направляющая взгляда.

2.09

Линии между объектами.

2.10

Пересечения линий.

2.11

Касания линии и формы.

2.12

Параллельные линии и группы.

2.13

Линии и сетка.

2.14

Линия как граница и разделитель.

2.15

Декоративная и техническая линейная графика.

2.16

Цвет, тон и прозрачность линии.

2.17

Ритм линий и stroke-pattern.

2.18

Кривизна и напряжение линии.

2.19

Автоматический генератор линейной структуры.

2.20

Scoring линейной системы.

2.21

Тест-кейсы линейной системы.

2.22

Линия как маска, crop и визуальный шов.

2.23

Линия в глобальной композиции и context overrides.

DATA FOR LAYOUT ENGINE

09 / contract
{ "module": "Compo 2.00", "name": "line_overview_and_role_system", "version": "2.0", "consumes": [ "Compo0.Scene", "Compo0.Object", "Compo0.Constraint", "Point.anchor?" ], "provides": [ "Line", "LineRole", "LineSubrole", "LineRigidity", "LinePathGeometry", "LineGeometry", "LineCandidate", "LineDirectionDescriptor", "LineSubmoduleMap" ], "roles": [ "axis", "divider", "connector", "trajectory", "frame", "baseline", "accent", "rhythm", "texture", "annotation" ], "hard_constraints": [ "length_gt_epsilon", "positive_visible_width", "connector_has_valid_endpoints", "protected_zone_policy_respected" ], "deferred_inputs": [ "line_visual_weight ← Compo 2.06", "eye_flow_score", "global_balance_score", "negative_space_score", "global_hierarchy_score" ], "pipeline": [ "normalize_role_subrole_rigidity", "build_or_receive_LinePathGeometry", "generate_geometry_candidates", "hard_filter", "local_score", "request_context_metrics", "corrective_pass", "provide_candidates_to_global_solver" ], "rule": "Compo 2.00 never finalizes global composition" }
MIGRATION 2.00–2.07 / pre-2.08: canonical LinePathGeometry, role/subrole/rigidity, metric ownership cleanup, path-length vs spatial-span separation.