Files
Aethera/render_2D/render_2D/axis/Abs_Axis.hpp
T
2026-08-21 10:16:16 +08:00

63 lines
3.9 KiB
C++

#pragma once
#include "Axis_Types.hpp"
#include "../base/Renderable_2D.hpp"
#include <renderable.hpp>
#include <string>
namespace aethera::render_2d {
struct Abs_Axis;
/* 最终轴 Private 的完整计算能力契约;所有结果直接来自当前 Prop。 */
template <typename T>
concept Axis_Object = Renderable_Object<T> && std::derived_from<T, Abs_Axis> && requires(
const typename T::Private& private_data,
const T* object,
Axis_Range coordinate_range,
Axis_Coordinate tick
) {
{ private_data.coordinate_range(object) } -> std::same_as<Axis_Range>;
{ private_data.tick_step(object, coordinate_range) } -> std::same_as<Axis_Coordinate>;
{ private_data.tick_label(object, tick) } -> std::same_as<std::string>;
{ private_data.sub_tick_count(object, tick) } -> std::same_as<Axis_Tick_Count>;
};
/* 所有二维坐标轴共享的定义层;最终通过 Impl<Derived_Axis> 创建运行时对象。 */
struct Abs_Axis : Def<Abs_Axis, Renderable_2D<>> {
struct Prop : Prev_Prop {
Point_F position{}; /* 坐标轴起点在画布中的二维像素位置。 */
Size canvas_size{}; /* 颜色缓存与裁剪区域使用的画布像素尺寸。 */
Axis_Pixel_Length pixel_length{}; /* 从坐标起点到终点的轴向像素跨度;为 0 时反算返回坐标起点。 */
Axis_Orientation orientation{Axis_Orientation::horizontal}; /* 从二维点取轴向分量时使用的方向。 */
Axis_Tick_Length tick_length{10.0}; /* 主刻度线长度,单位为像素。 */
Axis_Tick_Length sub_tick_length{5.0}; /* 次刻度线长度,单位为像素。 */
Pen axis_pen{Color::white()}; /* 轴线、主刻度和次刻度的描边样式。 */
std::string unit_text{}; /* 坐标轴末端显示的单位文本;空值表示不绘制。 */
Font unit_text_font{}; /* 刻度标签和单位文本使用的字体。 */
Pen unit_text_pen{Color::white()}; /* 刻度标签和单位文本使用的前景样式。 */
Brush unit_text_background_brush{}; /* 单位文本背景填充;none 表示不填充。 */
Axis_Label_Rotation label_rotation_degrees{}; /* 刻度标签顺时针旋转角度,单位为度。 */
bool operator==(const Prop&) const;
};
/* 坐标轴当前没有额外发布状态。 */
struct State : Prev_State {
bool operator==(const State&) const;
};
/* 完整声明及派生轴 CRTP 能力契约见 Abs_Axis.ipp。 */
struct Private;
/* 返回由最终轴 Prop 计算得到的当前有向坐标区间。 */
[[nodiscard]] Axis_Range coordinate_range() const;
/* 将坐标值映射到当前轴向像素位置。 */
[[nodiscard]] Axis_Pixel_Position coordinate_to_pixel(Axis_Coordinate coordinate) const;
/* 将当前轴向像素位置反算为坐标值。 */
[[nodiscard]] Axis_Coordinate pixel_to_coordinate(Axis_Pixel_Position pixel) const;
/* 按轴方向从二维像素点取值并反算为坐标。 */
[[nodiscard]] Axis_Coordinate point_to_coordinate(Point_F point) const;
/* 返回给定坐标区间覆盖的整数像素样本数量。 */
[[nodiscard]] Axis_Pixel_Sample_Count pixel_sample_count(Axis_Range coordinate_range) const;
/* 返回给定坐标区间使用的主刻度步长。 */
[[nodiscard]] Axis_Coordinate tick_step(Axis_Range coordinate_range) const;
/* 返回指定主刻度的显示文本。 */
[[nodiscard]] std::string tick_label(Axis_Coordinate tick) const;
/* 返回相邻主刻度之间的次刻度数量。 */
[[nodiscard]] Axis_Tick_Count sub_tick_count(Axis_Coordinate major_step) const;
};
}
#include "Abs_Axis.ipp"