计算动态值
匆忙研究绘制,不是很完善,没有很流畅感觉
姿态仪表是飞机驾驶舱中最重要的仪表之一,用于显示飞机相对于地平线的俯仰角(pitch)和横滚角(roll)。本文将详细解析一个基于React和SVG的姿态仪表实现。
typescriptconst size = 140; // 仪表盘大小
const center = size / 2; // 中心点坐标
const radius = center - 10; // 可视区域半径
typescriptconst clampedPitch = Math.max(-90, Math.min(90, pitch)) || 0; // 限制俯仰角在±90度范围内
const horizonY = (center + (clampedPitch / 90) * radius) || 0; // 计算地平线位置
generateTicks
函数负责生成仪表盘上的刻度标记,这是整个组件的核心功能之一。让我们逐步分析其实现:
typescriptconst calculateTicks = () => {
const baseValue = Math.round(clampedPitch / 5) * 5; // 将当前俯仰角四舍五入到最近的5的倍数
return [-15, -10, -5, 0, 5, 10, 15].map(v => baseValue + v); // 生成相对于基准值的刻度值数组
};
刻度生成的关键步骤:
基准值计算
刻度位置计算
typescriptconst y = center + ((index - 3) * 12); // 12px为刻度间距
const isNegative = y > horizonY; // 判断刻度是否在地平线以下
typescriptticks.push(
<line
key={`line-${value}`}
x1={center - (Math.abs(value) % 10 === 0 ? 15 : 7)} // 10的倍数刻度线更长
y1={y}
x2={center + (Math.abs(value) % 10 === 0 ? 15 : 7)}
y2={y}
stroke="white"
strokeWidth={Math.abs(value) % 10 === 0 ? 2 : 1} // 10的倍数刻度线更粗
/>
);
typescript<g clipPath="url(#circle)" transform={`rotate(${roll || 0} ${center} ${center})`}>
<rect x="0" y="0" width={size} height={horizonY} fill="#4877BD" /> // 天空
<rect x="0" y={horizonY} width={size} height={size - horizonY} fill="#5D9227" /> // 地面
</g>
horizonY
控制天空和地面分界线的位置transform
属性实现整个显示区域的旋转typescriptimport AttitudeIndicator from './AttitudeIndicator';
function App() {
return (
<AttitudeIndicator
pitch={15} // 15度俯仰角
roll={10} // 10度横滚角
/>
);
}
这个姿态仪表实现通过精确的数学计算和SVG绘制,实现了专业的飞行仪表显示效果。主要技术要点包括:
通过这些技术的组合,成功实现了一个专业的飞行姿态显示仪表。
以上内容由claude.ai生成,结合解决思路与相关API,实现代码使用AI润色生成
本文作者:还是夸张一点
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!