Files
Renderive/Core/primitive/Point_Set.h
T
2026-08-02 03:43:39 +08:00

106 lines
3.8 KiB
C++

#pragma once
#include <cstddef>
#include <cstdint>
#include <memory_resource>
#include <span>
#include <utility>
#include <vector>
#include "../architecture/Renderable.h"
#include "../Axis/Abs_Axis.h"
#include "../base/Color.h"
#include "../base/Geometry.h"
#include "../base/Memory.h"
#include "../base/Style.h"
namespace renderive {
struct Point_Set_Private;
/// @brief 点集单点绘制形状。
enum class Point_Set_Shape : std::uint8_t {
/// @brief 单像素点。
Pixel,
/// @brief 圆点。
Circle,
/// @brief 方点。
Square,
/// @brief 十字点。
Cross
};
/// @brief 点集构造属性。
struct Point_Set_Prop {
std::weak_ptr<Abs_Axis> domain_axis{};
std::weak_ptr<Abs_Axis> value_axis{};
double size = 2.0;
Pen pen = Pen(Color::white());
Brush brush = Brush(Color::white());
bool antialias = false;
Point_Set_Shape shape = Point_Set_Shape::Pixel;
};
/// @brief 按坐标轴绘制点集的图元。
class LIB_DECL Point_Set : public Renderable {
public:
/// @brief 写入点集坐标。
void update_points(std::span<const PointF> points);
/// @brief 移动写入点集坐标。
void update_points(std::pmr::vector<PointF>&& points);
/// @brief 写入容器中的点集坐标。
template <typename Points>
void update_points(const Points& points) {
update_points(std::span<const PointF>(points.data(), points.size()));
}
/// @brief 用 writer 填充并写入点集坐标。
template <typename Writer>
void write_points(std::size_t count, Writer&& writer) {
std::pmr::vector<PointF> points(memory_resource(Memory_Domain::Point_Set));
points.resize(count);
std::forward<Writer>(writer)(std::span<PointF>(points.data(), points.size()));
update_points(std::move(points));
}
/// @brief 写入带逐点颜色的点集。
void update_colored_points(std::span<const PointF> points, std::span<const Color> colors);
/// @brief 移动写入带逐点颜色的点集。
void update_colored_points(std::pmr::vector<PointF>&& points, std::pmr::vector<Color>&& colors);
/// @brief 写入容器中的带逐点颜色点集。
template <typename Points, typename Colors>
void update_colored_points(const Points& points, const Colors& colors) {
update_colored_points(std::span<const PointF>(points.data(), points.size()), std::span<const Color>(colors.data(), colors.size()));
}
/// @brief 绑定 X 轴。
PROP(std::shared_ptr<Abs_Axis>, domain_axis)
/// @brief 绑定 Y 轴。
PROP(std::shared_ptr<Abs_Axis>, value_axis)
/// @brief 点尺寸。
PROP(double, size)
/// @brief 点边框画笔。
PROP(Pen, pen)
/// @brief 点填充刷。
PROP(Brush, brush)
/// @brief 是否启用抗锯齿。
PROP(bool, antialias)
/// @brief 点形状。
PROP(Point_Set_Shape, shape)
struct Builder;
/// @brief 创建点集图元。
Point_Set();
private:
Point_Set_Private* d();
Render_Object_Owner create_render_data() override;
Render_Object_Owner create_render_state() override;
Render_Object_Owner create_input_data() override;
};
/// @brief 点集构造器。
struct LIB_DECL Point_Set::Builder : Point_Set_Prop {
PROP_B(std::shared_ptr<Renderable>, parent)
PROP_B(std::shared_ptr<Abs_Axis>, domain_axis)
PROP_B(std::shared_ptr<Abs_Axis>, value_axis)
PROP_B(double, size)
PROP_B(Pen, pen)
PROP_B(Brush, brush)
PROP_B(bool, antialias)
PROP_B(Point_Set_Shape, shape)
/// @brief 创建点集构造器。
Builder(std::shared_ptr<Renderable> parent, std::shared_ptr<Abs_Axis> domain_axis, std::shared_ptr<Abs_Axis> value_axis);
/// @brief 构建并返回点集对象。
std::shared_ptr<Point_Set> build();
std::shared_ptr<Renderable> parent{};
};
} // namespace renderive