Geo Pacenotes
Measures pacenote corner geometry by fitting circles to driveline points. Calculates corner severity, direction, radius, arc length, and fit quality. Provides debug visualization with 3D arc prisms.
Measures pacenote corner geometry by fitting circles to driveline points. Calculates corner severity, direction, radius, arc length, and fit quality. Provides debug visualization with 3D arc prisms.
Exports
| Function | Signature | Returns | Description |
|---|---|---|---|
M.measurePartition | (pn, focusPoints, skipAuto) | nil | Measures corner geometry, stores in pn.measurements |
M.autoSelectBestIntensityVariation | (pn, focusPoints) | value, fitValue | Auto-selects best split point for two-circle fit |
M.drawPacenoteMeasurement | (center, radius, arcDistance, p1, p2, p3, clr, alpha, prefix, fitQuality, angleDegrees) | nil | Draws 3D arc, radius lines, and measurement text |
M.calculateMiddlePoint | (pn, startPos, endPos, partition) | vec3 | Calculates midpoint using halfpoint or geometry |
M.calculateCircleFromPoints2 | (p1, p2, p3) | center, radius, arcDistance | Fits a 2D circle through 3 points |
M.intensityVariationOptions | table | - | Available split ratios: nil (none), 0.50 (50%) |
How It Works
Measurement Modes
Single circle (default): Fits one circle through CS, halfpoint, and CE positions.
Two circles (intensity variation): Splits the corner at a percentage of total path length, fits separate circles to each segment. Used for compound corners.
Auto-Selection (autoSelectBestIntensityVariation)
- Tests single-circle fit first - if fit quality ≤ 0.009, uses single circle
- Otherwise tests all intensity variation options (none, 50%)
- Selects the option with lowest average fit quality (normalized RMSE)
pn.intensityVariationAutocontrols whether auto-selection runs (default: true)
Circle Fitting
Uses circle2DFrom3Points() from road architect utilities for 2D circle calculation, then calculates:
- Radius/diameter: from center to first point
- Arc distance: angle × radius
- Fit quality: normalized RMSE of all points' distances from the circle (lower = better)
< 0.05= excellent,0.05-0.15= good,> 0.15= poor/compound
Corner Severity
After measurement, calculateAndStoreSeverityDirection():
- Finds nearest severity entry by diameter from text compositor config
- Validates hairpin classification (requires ≥45% of circumference)
- Detects direction via cross product (left/right/straight)
- Calculates diameter change between corners (opening/tightening)
Measurement Data Structure
pn.measurements = {
corner1 = {
center = vec3(...), radius = 25, diameter = 50,
arcDistance = 40, angleDegrees = 92,
straightLineDistance = 35, fitQuality = 0.03,
pointsLength = 42, p1 = vec3(...), p2 = vec3(...), p3 = vec3(...),
severity = { value = 3, ... }, direction = "left"
},
corner2 = { ... }, -- nil for single circle
splitPoint = vec3(...),
totalPointsLength = 80,
diameterChange = { change = 10, changePercent = 20, isOpening = true, isTightening = false }
}Debug Visualization
Draws 3D arc prisms, radius lines, and text labels showing length, diameter, angle, and fit quality using debugDrawer:drawSquarePrism().
local geoPacenotes = require('/lua/ge/extensions/gameplay/rally/snaproad/geoPacenotes')
geoPacenotes.measurePartition(pacenote, focusPoints)
-- Results stored in pacenote.measurementsSee Also
- normals - Snaproad Normal Vector Calculations - Related reference
- Gameplay Systems Guide - Guide
Driveline Recording
Loads a recorded driveline file from a recce run and returns a `PointList`. A driveline is a series of timestamped position/orientation points captured during reconnaissance driving.
Driveline Normals
Calculates forward normal vectors for driveline points using adjacent point positions. Used for waypoint orientation and direction display.