Source: https://guthlabs.ai/docs/instruments/2d-collision-solver-oblique/

instrument / verified-clean

# 2D Collision Solver (oblique)

The current ledger marks this instrument verified clean within the source-bound verification corpus.

Status: **VERIFIED_CLEAN**Lifecycle: **verified-clean**

## Inspectable records

[01**Overview**Purpose and lifecycle](<https://guthlabs.ai/docs/instruments/2d-collision-solver-oblique/>)[02**Mechanism**Method and assumptions](<https://guthlabs.ai/docs/instruments/2d-collision-solver-oblique/mechanism/>)[03**Implementation**Binding and validation](<https://guthlabs.ai/docs/instruments/2d-collision-solver-oblique/implementation/>)[04**Qualification**Evidence and errata](<https://guthlabs.ai/docs/instruments/2d-collision-solver-oblique/qualification/>)

## Ledger state

The current ledger marks this instrument verified clean within the source-bound verification corpus.

**Area**: Physics — Kinematics/Projectiles/Orbits, Forces/Energy/Momentum, Rotational Dynamics, Gravitation, Oscillations/Waves, Optics, E&M Fields, Relativity, Quantum, Statistical Thermo

**Tranche**: tranche-4

**Evidence ID**: t4-227

**Ledger rows**: 1

No ledger note is attached.

## Review findings

The honest label 'idealized rigid-body, frictionless contact' is appropriate only if the implementation leaves tangential components unchanged and uses restitution along the line of centers. As written, the component-wise formula description is incorrect and the impact-angle definition is incomplete, so the instrument cannot be approved without correction.

### Formula and scope findings

- For an ideal frictionless collision, the 1D restitution/momentum formulas apply only along the line-of-centers normal component; the tangential components remain unchanged. Applying elastic/inelastic formulas independently to both normal and tangent components is incorrect unless a tangential friction/impulse model is explicitly supplied.

- The impact angle is underdefined: it must specify the orientation of the line-of-centers unit normal relative to the coordinate axes, or the normal vector itself.

- The spec does not state the exact normal-component formulas or the convention for coefficient of restitution e.

- A physically standard model requires positive masses and normally constrains 0 <= e <= 1 for passive elastic/inelastic impacts.

### Unit assumptions

- m1 and m2 are positive masses in the same mass unit.

- All velocity-vector components use the same velocity unit; outputs preserve that unit unless an explicit conversion is specified.

- impact_angle_deg is interpreted as the line-of-centers normal angle measured counterclockwise from the +x axis.

- The tangent unit vector is t = (-sin(theta), cos(theta)).

- For a frictionless contact, tangential velocity components are unchanged and the normal components use v1n' = ((m1 - e*m2)*v1n + (1+e)*m2*v2n)/(m1+m2) and v2n' = ((1+e)*m1*v1n + (m2 - e*m1)*v2n)/(m1+m2).

- The test vectors use the corrected frictionless-contact interpretation rather than applying restitution independently to the tangent component.

## Boundary hardening

**BREAK_CLAIMED** · SELF_FLAGGED

A zero-total-mass input makes the solver's mass denominator vanish, producing undefined post-collision velocities unless the instrument validates and rejects the input. The branch test also exposes a required approaching-versus-separating decision that a solver must implement consistently.

## Errata and corrections

No applied erratum is attached to this unique-name record.

## Inspectable example

4 review vectors are recorded. One source-bound sample is shown below.

````
{
  "inputs": {
    "m1": 1,
    "m2": 1,
    "v1": [
      2,
      1
    ],
    "v2": [
      -1,
      0
    ],
    "impact_angle_deg": 0,
    "line_of_centers_unit": [
      1,
      0
    ],
    "e": 1,
    "velocity_unit": "m/s"
  },
  "expected_outputs": {
    "v1_prime": [
      -1,
      1
    ],
    "v2_prime": [
      2,
      0
    ],
    "velocity_unit": "m/s"
  },
  "working": "n=(1,0), t=(0,1). Normal components: v1n=2, v2n=-1; tangential components: v1t=1, v2t=0. For equal masses and e=1: v1n'=((1-1)*2+(1+1)*1*(-1))/2=-2/2=-1. v2n'=((1+1)*1*2+(1-1)*(-1))/2=4/2=2. Tangential components are unchanged, so v1'=(-1)n+1t=(-1,1) and v2'=2n+0t=(2,0)."
}
````

## Related workflows

[Kinematics & Collisions Tutorfull 2D](<https://guthlabs.ai/docs/instrument-workflows/kinematics-tutor/>)

## Sources and evidence

These pointers bind the page to evidence. They do not grant authority or collapse verification into deployment.

- `VERIFIED_LEDGER.json · VERIFIED_CLEAN`

- `evidence-tranche4/tranche4-results.json`

- `BOUNDARY_HAZARD_CATALOG.json`
