#pragma once #include #include "geo/GeoLocalFrame.hpp" class vtkCubeAxesActor; class vtkRenderer; namespace geopro::render { // 坐标轴显示方式(spec §4 C3–I3)。 // Standard 标准 = vtkCubeAxesActor 包围盒 + 刻度(外侧最近轴显示刻度)。 // Stereo 三维立体 = vtkCubeAxesActor 闭合立方(四周/网格更完整)。语义待 1.0 确认,先合理近似。 // None 不显示 = 不构建(返回 nullptr)。 enum class AxesMode { Standard, Stereo, None }; // 刻度单位(spec §4 D5–I5)。 // None 无刻度 = 隐藏刻度标签。 // Meter 米 = 原值(世界系本就是米)。 // Feet 英尺 = ×3.28084。 // LatLon 经纬度 = 经 GeoLocalFrame 反算 X→经度、Y→纬度(Z 退化为米深度)。 enum class AxesUnit { None, Meter, Feet, LatLon }; // 单轴显示(原型坐标轴设置):是否显示该轴 + 是否用自定义刻度范围(覆盖按单位换算的自动范围)。 struct AxisDisplay { bool visible = true; bool customRange = false; // true=用 min/max 作刻度显示范围(值按当前单位) double min = 0.0; double max = 0.0; }; // 坐标轴构建参数。 struct AxesOptions { AxesMode mode = AxesMode::Standard; AxesUnit unit = AxesUnit::Meter; int fontSize = 12; // 标题/标签字号 // 经纬度刻度需 frame 反算;为空则 LatLon 退化为米。 const geopro::core::GeoLocalFrame* frame = nullptr; AxisDisplay x, y, z; // per-axis 可见性 + 自定义范围 }; // 由数据包围盒 bounds[6]={xmin,xmax,ymin,ymax,zmin,zmax} + 选项构建坐标轴 prop。 // O 点 = 数据包围盒角(待 1.0 确认;spec §13 倾向"数据包围盒角")。 // bounds 退化(min>max 或全 0)或 mode==None → 返回 nullptr。 // camera:vtkCubeAxesActor 需绑定相机(决定外侧刻度轴);可空(测试场景)。 vtkSmartPointer buildAxes(const double bounds[6], const AxesOptions& opts, vtkRenderer* renderer); // 单位换算系数(米→目标单位)。LatLon 不是线性系数(X/Y 分别反算),此处仅供米/英尺; // 暴露为可测纯函数。 double unitScaleFactor(AxesUnit unit); } // namespace geopro::render