4. 车道偏离预警可视化

任务目标

在 HUD 画布上绘制左右两条车道线,并根据车辆横向偏移量判断是否偏离:正常时车道线为绿色,偏离时对应车道线变红并显示“车道偏离”警示文字。本案例用纯 HTML + Canvas 实现一个可交互的最小演示,通过滑块模拟车辆横向位置。

实现思路

横向偏移量 offset 判断 |offset| 是否 > 阈值 车道线绿色 车道线红色 + 警示 渲染到 HUD

完整代码

将以下内容保存为 hud_lane.html,用浏览器直接打开即可。拖动滑块改变车辆横向位置,观察车道线颜色与警示文字变化。

<!DOCTYPE html>
<html lang="zh">
<head><meta charset="UTF-8"><title>车道偏离预警</title>
<style>
  body{margin:0;background:#111;display:flex;flex-direction:column;align-items:center;font-family:sans-serif;color:#eee}
  canvas{background:#1a1a2e;border-radius:8px;margin-top:16px}
  .ctrl{margin:12px;display:flex;align-items:center;gap:10px}
  input[type=range]{width:300px}
</style></head>
<body>
<canvas id="hud" width="480" height="320"></canvas>
<div class="ctrl">
  <label>横向偏移</label>
  <input id="offset" type="range" min="-100" max="100" value="0">
  <span id="val">0</span>
</div>
<script>
const cv = document.getElementById('hud');
const ctx = cv.getContext('2d');
const slider = document.getElementById('offset');
const valEl = document.getElementById('val');

const W = cv.width, H = cv.height;
const LANE_LEFT = 120;   // 左车道线 x
const LANE_RIGHT = 360;  // 右车道线 x
const THRESHOLD = 40;    // 偏离阈值(px)

function drawLane(x, color) {
  ctx.strokeStyle = color;
  ctx.lineWidth = 6;
  ctx.setLineDash([24, 16]);
  ctx.beginPath();
  ctx.moveTo(x, H);
  ctx.lineTo(x, 0);
  ctx.stroke();
  ctx.setLineDash([]);
}

function render(offset) {
  ctx.clearRect(0, 0, W, H);

  // 车辆中心随偏移移动
  const carX = W / 2 + offset;
  const deviated = Math.abs(offset) > THRESHOLD;

  // 偏离时对应侧车道线变红
  const leftColor  = (deviated && offset < 0) ? '#e53935' : '#43a047';
  const rightColor = (deviated && offset > 0) ? '#e53935' : '#43a047';

  drawLane(LANE_LEFT, leftColor);
  drawLane(LANE_RIGHT, rightColor);

  // 车辆
  ctx.fillStyle = '#42a5f5';
  ctx.fillRect(carX - 20, H - 70, 40, 60);

  // 警示
  if (deviated) {
    ctx.fillStyle = '#e53935';
    ctx.font = 'bold 22px sans-serif';
    ctx.textAlign = 'center';
    ctx.fillText('⚠ 车道偏离', W / 2, 40);
  }
}

slider.addEventListener('input', () => {
  const v = Number(slider.value);
  valEl.textContent = v;
  render(v);
});

render(0);
</script>
</body></html>

运行与验证

  • 用浏览器打开 hud_lane.html,画布显示两条绿色虚线车道线和一辆蓝色车辆。
  • 拖动滑块使偏移量绝对值 ≤ 40:车道线保持绿色,无警示文字。
  • 拖动滑块使偏移量 > 40(向右偏):右侧车道线变红,顶部出现“⚠ 车道偏离”。
  • 拖动滑块使偏移量 < -40(向左偏):左侧车道线变红,同样出现警示。

通过条件:车道线颜色与警示文字随偏移量跨过阈值 ±40 正确切换,且偏离方向与变红车道线一致。