如何从0-360度数值计算8方位风向(Delphi应用)
Delphi 风向角度转8方位罗盘及箭头显示实现
核心计算逻辑
8个罗盘方位各占45°(360°/8),通过角度偏移+取模+整除的方式直接计算方位索引,替代繁琐的if..then判断:
- 给原始风向角度加上22.5°(每个方位的半宽),让每个方位的中心角度对齐到45°的整数倍
- 对360°取模,确保角度始终落在0-360°范围内
- 将结果除以45°,取整数部分得到0-7的索引,对应预设的方位和箭头数组
Delphi 代码实现
const // 8个罗盘方位定义 CompassDirections: array[0..7] of string = ('N', 'NE', 'E', 'SE', 'S', 'SW', 'W', 'NW'); // 对应Unicode箭头符号(需确保项目支持Unicode) ArrowSymbols: array[0..7] of string = ('↑', '↗', '→', '↘', '↓', '↙', '←', '↖'); function WindDegToDirectionIndex(ADegrees: Double): Integer; begin // 调整角度区间并计算索引 ADegrees := (ADegrees + 22.5) Mod 360; Result := Trunc(ADegrees / 45); end; // 调用示例:更新窗体上的风向显示 procedure TForm1.UpdateWindDisplay(WindDeg: Double); var DirIndex: Integer; begin DirIndex := WindDegToDirectionIndex(WindDeg); // 显示罗盘方位文本 lblCompass.Caption := CompassDirections[DirIndex]; // 显示箭头符号 lblArrow.Caption := ArrowSymbols[DirIndex]; end;
补充说明
- 角度偏移22.5°的作用:让原始角度中337.5°-22.5°的正北区间,转换为0°-45°对应索引0(N);22.5°-67.5°的东北区间转换为45°-90°对应索引1(NE),以此类推
Mod 360可处理API返回的异常角度(如370°或-10°),确保计算有效- 若使用旧版Delphi不支持Unicode箭头,可替换为自定义箭头图片或通过Canvas绘制箭头
内容的提问来源于stack exchange,提问作者Sjubussen
相关产品推荐
相关产品推荐

