Skip to content

junction corners: curved approaches produce colliding corner geometry (straight-ray solver) #356

Description

@JArmandoAnaya

From the 2026-07 field triage (item 4, screenshot 3). Diagnosed against main @ 950939c.

Where a curved road meets a junction, the corner geometry collides/overlaps in the render — boundary interpenetration near the curve.

Root cause — straight-ray corner solver. corner_faces() samples each approach arm at a single end station and treats its outer edge as an infinite straight ray (core/src/mesh/junction_corner_detail.cpp:130-186, ray at :148-149); solve_corner() intersects those straight rays (:203-211); append_corner_fillets extends straight edge strips (core/src/mesh/junction_surface.cpp:143-188). When the approach curves near the mouth, the true pavement edge diverges from the ray and the fillet/strip/wedge geometry interpenetrates the road's own footprint. Connecting-road footprints, by contrast, sample per station and are curvature-safe (core/src/mesh/fill_backend.hpp:109-138).

Not the p4-s5 escape-valve artifact class: surface spans arbitrate elevation/samples inside a fixed union and can never move the boundary (junction.hpp:132-137; the realignment doc rules out new triangulation algorithms for spans). This is a generation bug in merged p4-s1/s2-era code.

Scope

  • Corner solving samples the true curved pavement edge near the junction mouth instead of a single-station straight ray: corner_faces / solve_corner (core/src/mesh/junction_corner_detail.cpp:130-273) and the straight edge strips + wedge apex in append_corner_fillets (core/src/mesh/junction_surface.cpp:143-188).
  • The Corner tool handles follow automatically (junction_corners() drives them from the same solver, core/src/road/junction_corners.cpp:48).

Refactorings

  • None planned; keep the solver shared between mesher and query (byte-identity guards: verbatim arc sampling junction_corner_detail.cpp:311-337, arms≥2 round-trip rule :132-137).

Acceptance

  • Screenshot-3 reproduction: a curved road meeting a junction of sidewalked roads → no interpenetrating corner geometry; boundary edges follow the curved pavement edge.
  • Straight-approach junctions unchanged (byte-identical output or visually identical + tests green) before/after.
  • Regression surface green: p4-s1 corner edits (radius/extents ops operations.cpp:3782,3821), p4-s2 wedges/noses (junction_surface.cpp:752-844), p4-s5 spans (junction_surface_spans.cpp), p4-s4 lock/regen record-carry, p4-s6 maneuver-shaped connecting roads. Sanitizer run mandatory (P4 discovery risk note), covering the editor tests too.

Out of scope

Supersedes

(none — successor of the #103/#105 T-junction-quality lineage.)

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingpillar:P4Road to Parity pillar P4

    Type

    No type

    Projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions