dl
dl_type_create.h
浏览该文件的文档.
1
12#pragma once
13
14#include <cmath>
15#include <string>
16#include <optional>
17
18#include "dl_type_def.h"
19#include "dl_type_convert.h"
20#include "dl_type_op.h"
21#include "base/dl_concept.h"
22
23namespace dl
24{
25
26//------------------------Quad----------------------
32{
33 Size _size; // 原始大小
34 Position _anchor; // 锚点位置
35 float _scaleX = 1.0f;// X缩放比例
36 float _scaleY = 1.0f;// Y缩放比例
37 float _rotate = 0.0f;// 旋转角度
38 bool _filpX = false;// 是否在X轴翻转
39 bool _filpY = false;// 是否在Y轴翻转
40 // 以下覆盖上面的值
41 std::string _exAnchor;// 不为空则计算锚点
42 std::optional<float> _exScale;
43};
44
48inline constexpr Quad createQuad(const Position& p0, const Position& p1, const Position& p2, const Position& p3)
49{
50 return { p0, p1, p2, p3 };
51}
52
58inline constexpr Quad createQuad(const Position& lt, const Position& rb)
59{
60 return { lt, {rb[0], lt[1]}, rb, {lt[0], rb[1]} };
61}
62
63inline constexpr Quad createQuad(const Rect& rect)
64{
65 return createQuad(toPosition(rect[0], rect[1]), toPosition(rect[2], rect[3]));
66}
67
68inline constexpr Quad createQuad(const RectF& rect)
69{
70 return createQuad({ rect[0], rect[1] }, { rect[2], rect[3] });
71}
72
75inline Quad createQuad(const Position& p0, const Position& p1, Float d)
76{
77 Float at = atan2f(p1[1] - p0[1], p1[0] - p0[0]);
78
79 Float dy = d * cosf(at) / 2_f;
80 Float dx = d * sinf(at) / 2_f;
81 return{
82 p0 + Position{dx, -dy},
83 p1 + Position{dx, -dy},
84 p1 + Position{-dx, dy},
85 p0 + Position{-dx, dy} };
86}
87
92template<IsBase T>
93constexpr Quad createQuad(T size, bool center = true)
94{
95 if (center)
96 {
97 Float size_half = (Float)size / 2_f;
98 return { Position{-size_half, -size_half}, Position{ size_half, -size_half },
99 Position{size_half, size_half}, Position{-size_half, size_half} };
100 }
101 else
102 {
103 return { Position{}, Position{(Float)size, 0},
104 Position{(Float)size, (Float)size}, Position{0, (Float)size} };
105 }
106}
107
108
113inline constexpr Quad createQuad(Position size, bool center = true)
114{
115 if (center)
116 {
117 Float w_half = size[0] / 2.0f;
118 Float h_half = size[1] / 2.0f;
119 return { Position{-w_half, -h_half}, Position{ w_half, -h_half }, Position{w_half, h_half}, Position{-w_half, h_half} };
120 }
121 else
122 {
123 return { Position{}, Position{size[0], 0}, Position{size[0], size[1]}, Position{0, size[1]} };
124 }
125}
126
131constexpr Quad createQuad(Size size, bool center = true)
132{
133 return createQuad(toPosition(size), center);
134}
135
141
142//------------------------Rect----------------------
147constexpr Rect createRect(const Size& size)
148{
149 return { 0, 0, (int)size[0], (int)size[1] };
150}
151constexpr Rect createRect(const Position& size)
152{
153 return { 0, 0, (int)size[0], (int)size[1] };
154}
155
160constexpr Rect createRect(const Point& lt, const Size& size)
161{
162 return { lt[0], lt[1], lt[0] + (int)size[0], lt[1] + (int)size[1] };
163}
164
169constexpr Rect createRect(const Point& lt, const Point& rb)
170{
171 return { lt[0], lt[1], rb[0], rb[1] };
172}
173
174//------------------------RectU----------------------
179constexpr RectU createRectU(const Size& size)
180{
181 return { 0, 0, size[0], size[1] };
182}
183
187constexpr RectU createRectU(unsigned size)
188{
189 return { 0, 0, size, size };
190}
191
196constexpr RectU createRectU(const PointU& lt, const Size& size)
197{
198 return { lt[0], lt[1], lt[0] + size[0], lt[1] + size[1] };
199}
200
201//------------------------RectF----------------------
206constexpr RectF createRectF(const Position& size)
207{
208 return { 0, 0, size[0], size[1] };
209}
210
215constexpr RectF createRectF(const Position& lt, const Position& size)
216{
217 return { lt[0], lt[1], lt[0] + size[0], lt[1] + size[1] };
218}
219
225constexpr RectF createRectLTRB(const Position& lt, const Position& rb)
226{
227 return { lt[0], lt[1], rb[0], rb[1] };
228}
229
230}
用于模板限定,更好的报错信息
类型转换
通用类型定义
通用类型运算
Position2 Position
constexpr RectF createRectF(const Position &size)
创建一个RectF,依据大小
constexpr Array< Position::value_type, N > toPosition(const Array< T, N > &a)
转换到Position,已知长度
float Float
constexpr Rect createRect(const Size &size)
创建一个Rect,依据大小
Point2U PointU
constexpr RectU createRectU(const Size &size)
创建一个RectU,依据大小
Position4 RectF
Point4 Rect
Point4U RectU
constexpr Quad createQuad(const Position &p0, const Position &p1, const Position &p2, const Position &p3)
创建一个Quad
Array< Position, 4 > Quad
constexpr RectF createRectLTRB(const Position &lt, const Position &rb)
创建一个RectF,依据左上角和右下角
PointU Size
Point2 Point
四边形参数设置
std::optional< float > _exScale