106 lines
3.8 KiB
C++
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
|