25#if (DL_PLATFORM == DL_PLATFORM_WIN32)
44 template<
typename T,
size_t N>
47 for (
size_t i = 0; i <
N; ++i)
49 container[i] = (std::numeric_limits<T>::min)();
52 template<
typename T,
size_t N>
55 for (
size_t i = 0; i <
N; ++i)
57 container[i] = (std::numeric_limits<T>::max)();
79 return x < a || b < x;
105 arr[1] += PI_2 * (std::floor((arr[0] - arr[1]) / PI_2) + 1);
112#if DL_PLATFORM == DL_PLATFORM_WIN32
115 return _byteswap_ulong(x);
120 return __builtin_bswap32(x);
134 for (
T i = 0; i < n; ++i)
140constexpr uint64_t
Pow64(uint64_t x, uint8_t n)
143 for (uint8_t i = 0; i < n; ++i)
149constexpr uint32_t
Pow32(uint32_t x, uint8_t n)
152 for (uint8_t i = 0; i < n; ++i)
163 Pow64(2,0),
Pow64(2,1),
Pow64(2,2),
Pow64(2,3),
Pow64(2,4),
Pow64(2,5),
Pow64(2,6),
Pow64(2,7),
164 Pow64(2,8),
Pow64(2,9),
Pow64(2,10),
Pow64(2,11),
Pow64(2,12),
Pow64(2,13),
Pow64(2,14),
Pow64(2,15),
165 Pow64(2,16),
Pow64(2,17),
Pow64(2,18),
Pow64(2,19),
Pow64(2,20),
Pow64(2,21),
Pow64(2,22),
Pow64(2,23),
166 Pow64(2,24),
Pow64(2,25),
Pow64(2,26),
Pow64(2,27),
Pow64(2,28),
Pow64(2,29),
Pow64(2,30),
Pow64(2,31),
167 Pow64(2,32),
Pow64(2,33),
Pow64(2,34),
Pow64(2,35),
Pow64(2,36),
Pow64(2,37),
Pow64(2,38),
Pow64(2,39),
168 Pow64(2,40),
Pow64(2,41),
Pow64(2,42),
Pow64(2,43),
Pow64(2,44),
Pow64(2,45),
Pow64(2,46),
Pow64(2,47),
169 Pow64(2,48),
Pow64(2,49),
Pow64(2,50),
Pow64(2,51),
Pow64(2,52),
Pow64(2,53),
Pow64(2,54),
Pow64(2,55),
170 Pow64(2,56),
Pow64(2,57),
Pow64(2,58),
Pow64(2,59),
Pow64(2,60),
Pow64(2,61),
Pow64(2,62),
Pow64(2,63) };
172 Pow32(2,0),
Pow32(2,1),
Pow32(2,2),
Pow32(2,3),
Pow32(2,4),
Pow32(2,5),
Pow32(2,6),
Pow32(2,7),
173 Pow32(2,8),
Pow32(2,9),
Pow32(2,10),
Pow32(2,11),
Pow32(2,12),
Pow32(2,13),
Pow32(2,14),
Pow32(2,15),
174 Pow32(2,16),
Pow32(2,17),
Pow32(2,18),
Pow32(2,19),
Pow32(2,20),
Pow32(2,21),
Pow32(2,22),
Pow32(2,23),
175 Pow32(2,24),
Pow32(2,25),
Pow32(2,26),
Pow32(2,27),
Pow32(2,28),
Pow32(2,29),
Pow32(2,30),
Pow32(2,31) };
182#define DND_ARRAY_POW_LINE(index) if (x <= ARRAY_POW2[index])return ARRAY_POW2[index]
194 log(
"数值过大,超过2^63:" + std::to_string(x));
197#define DND_ARRAY_POW_LINE_32(index) if (x <= ARRAY_POW2_32[index])return ARRAY_POW2_32[index]
205 log(
"数值过大,超过2^31:" + std::to_string(x));
216#if (DL_PLATFORM == DL_PLATFORM_WIN32)
217 return std::bit_ceil(x);
234 const float threehalfs = 1.5f;
239 i = 0x5f3759df - (i >> 1);
241 y = y * (threehalfs - (x2 * y * y));
253 for (
size_t i = 0; i <
N; ++i)
255 length += (v[i] * v[i]);
258 length =
RSqrt(length);
259 for (
size_t i = 0; i <
N; ++i)
268template <IsUn
signed T0, IsSigned T1>
274 return nag_b < a ? a - nag_b : 0;
279template <IsUn
signed T0, IsSigned T1,
size_t N>
282 for (
size_t i = 0; i <
N; ++i)
283 a[i] =
AddU(a[i], b[i]);
286template <IsUn
signed T0, IsSigned T1,
size_t N>
291 for (
size_t i = 0; i <
N; ++i)
298template <IsUn
signed T0, IsSigned T1>
312template <IsUn
signed T0, IsSigned T1,
size_t N>
315 for (
size_t i = 0; i <
N; ++i)
325template <IsUn
signed T>
328 return a > b ? a - b : 0;
333template <IsUn
signed T0, IsSigned T1>
338 return SubU(a, (T0)b);
343template <IsUn
signed T,
size_t N>
347 for (
size_t i = 0; i <
N; ++i)
348 ret[i] =
SubU(a[i], b[i]);
354template <IsUn
signed T0, IsSigned T1,
size_t N>
358 for (
size_t i = 0; i <
N; ++i)
359 ret[i] =
SubU(a[i], b[i]);
365template <IsUn
signed T>
368 return a < b ? b - a : a - b;
374template <IsUn
signed T,
size_t N>
378 for (
size_t i = 0; i <
N; ++i)
379 ret[i] =
DisU(a[i], b[i]);
391 return a[0] * a[0] + a[1] * a[1];
397 return a[0] * a[0] + a[1] * a[1] + a[2] * a[2];
403 return a[0] * a[0] + a[1] * a[1] + a[2] * a[2] + a[3] * a[3];
433template <IsUn
signed T>
436 unsigned dx =
DisU(a[0], b[0]);
437 unsigned dy =
DisU(a[1], b[1]);
438 return dx * dx + dy * dy;
444template <IsUn
signed T>
452template <IsSigned T,
size_t N>
456 length = sqrt(length);
461template <IsSigned T,
size_t N>
489constexpr double PI(
unsigned n = 1,
unsigned d = 1)
492 return std::numbers::pi * n / d;
494 return 3.1415926535897932384626433832795 * n / d;
497constexpr float PIF(
unsigned n = 1,
unsigned d = 1)
500 return (
float)std::numbers::pi * n / d;
502 return 3.1415926535897932384626433832795f * n / d;
592template<IsUn
signed T>
610 return x && !(x & (x - 1));
622 return (x + align - 1) & ~(align - 1);
634 return r >= (d >> 1) ? q + 1 : q;
645 return (n + (d >> 1)) / d;
659constexpr float OffsetOrder(
float order,
int u = 1,
int v = 0,
int w = 0)
661 constexpr int NUM_ORDER_DT = 100;
662 float ret = order + (w + v * NUM_ORDER_DT + u * NUM_ORDER_DT * NUM_ORDER_DT)
663 * std::numeric_limits<float>::epsilon();
666 log_(
"order超出范围:{}", ret);
676 return a[0] * b[1] - a[1] * b[0];
682 a[1] * b[2] - b[1] * a[2],
683 a[2] * b[0] - b[2] * a[0],
684 a[0] * b[1] - b[0] * a[1]
691template<
typename T,
size_t N>
695 for (
size_t i = 0; i <
N; ++i)
771 if (list_pos.size() < 3)
773 auto iter_last = list_pos.end();
775 for (
auto iter_0 = list_pos.begin(); iter_0 != iter_last;)
778 auto iter_0_next = iter_0;
782 for (
auto iter_1 = iter_last; iter_1 != iter_0_next; --iter_1)
784 if (func_pass(*iter_0, *iter_1))
786 for (
auto iter = iter_0_next; iter != iter_1;)
787 iter = list_pos.erase(iter);
806 return quad[2] - quad[0];
816 return { quad[0], quad[1], quad[2] };
821 return { quad[0], quad[2], quad[3] };
832 return rect[0] <= rect[2]
833 && rect[1] <= rect[3];
842 return rect[0] == rect[2]
843 && rect[1] == rect[3];
857 && rect[2] <= size[0]
858 && rect[3] <= size[1];
868 return unsigned(xy[0]) < size[0]
869 && unsigned(xy[1]) < size[1];
878 return xy[0] >= rect[0]
889 Position ab = triangle[0] - triangle[1];
890 Position ac = triangle[0] - triangle[2];
910 return t1 * t2 >= 0 &&
949template<
typename T,
typename F>
957 while (rect.top < rect.bottom)
959 bool can_trim =
true;
960 for (
T x = rect.left; x < rect.right; ++x)
962 if (func(x, rect.top))
974 while (rect.bottom - 1 > rect.top)
976 bool can_trim =
true;
977 for (
T x = rect.left; x < rect.right; ++x)
979 if (func(x, rect.bottom - 1))
991 while (rect.left < rect.right)
993 bool can_trim =
true;
994 for (
T y = rect.top; y < rect.bottom; ++y)
996 if (func(rect.left, y))
1008 while (rect.right - 1 > rect.left)
1010 bool can_trim =
true;
1011 for (
T y = rect.top; y < rect.bottom; ++y)
1013 if (func(rect.right - 1, y))
1034 if (rect.left >= min_left + extend)
1035 rect.left -= extend;
1045 if (rect.top >= min_top + extend)
1056 if (rect.right + extend <= max_right)
1057 rect.right += extend;
1067 if (rect.bottom + extend <= max_bottom)
1068 rect.bottom += extend;
1115 return (
unsigned)std::ceil(
PI() * (rad + 1) * (rad + 1));
1127 while (xy.x >= size.w)
1133 if (xy.y < 0 || xy.y >= (
int)size.h)
1137 while (xy.x >= (
int)size.w)
1149 dt.x =
DisU(a.x, b.x);
1150 if (dt.x > size.w / 2)
1151 dt.x = size.w - dt.x;
1152 dt.y =
DisU(a.y, b.y);
1166 dt.x =
DisU(aa.x, bb.x);
1167 if (dt.x > size.w / 2)
1168 dt.x = size.w / 2 - dt.x;
1169 dt.y =
DisU(aa.y, bb.y);
1202 if (xy.x - 1 >= _size.w)
1212 if (xy.x + 1 > _size.w)
1215 if (xy.x + 1 == _size.w)
1227 if (xy.y - 1 >= _size.h)
1236 if (xy.y + 1 >= _size.h)
1267 return xy.x < _size.w && xy.y < _size.h;
1271 return xy.x < _size.w;
1275 return xy.y < _size.h;
1283 using FnDiffusionCb = std::function<void(
unsigned,
const std::list<PointU>& xy)>;
1303 return deg *
PI() / 180.0;
1309 return rad * 180.0f /
PI();
1316 return (year % 4 == 0 && year % 100 != 0)
bool CheckVaildY(const PointU &xy)
bool Left(PointU &xy)
传入越界,但返回合法,也会返回true
void SetSize(const Size &size)
设置大小
bool RightTop(PointU &xy)
bool RightBottom(PointU &xy)
bool CheckVaildX(const PointU &xy)
bool LeftBottom(PointU &xy)
bool CheckVaild(const PointU &xy)
#define DND_ARRAY_POW_LINE_32(index)
#define DND_ARRAY_POW_LINE(index)
向上取2的幂次
constexpr bool Less(const Array< T, N > &a, const Array< T, N > &b)
每个元素都小于返回真
std::function< bool(const PointU &xy)> FnDiffusionCheck
unsigned Distance(const Size &size, const PointU &a, const PointU &b)
返回 距离,x轴为环形
std::vector< PointU > GetCircle(const Size &size, const PointU &xy, unsigned rad)
返回圆形范围的节点,x轴为环形
unsigned DistancePow2NoCheck(const Size &size, const PointU &a, const PointU &b)
返回 距离,x轴为环形
std::vector< PointU > Diffusion(const Size &size, const PointU &xy, unsigned count, FnDiffusionCheck func_valid, FnDiffusionCb func_cb)
扩散遍历
void Clamp(const Size &size, PointU &xy)
限制到大小内
std::function< void(unsigned, const std::list< PointU > &xy)> FnDiffusionCb
T SubU(T a, T b)
无符号类型相减,负数转为0
uint32_t ByteReverse(uint32_t x)
翻转字节序
constexpr unsigned IsPow2(unsigned x)
是否2的幂
int GetSeason(int day, double latitude)
返回季节
std::vector< Point > DrawLineOrth(const Point &p0, const Point &p1)
正交 画线算法
constexpr bool IsXyInRect(const Point &xy, const Rect &rect)
判断 点是否在矩形内
constexpr double RadiansToDegrees(double rad)
将弧度转为角度
constexpr uint64_t Pow64(uint64_t x, uint8_t n)
T DistancePow2U(const Array< T, 2 > &a, const Array< T, 2 > &b)
返回 距离的平方
constexpr float PIF(unsigned n=1, unsigned d=1)
constexpr bool IsOutRange(T x, T a, T b)
判断数值是否越界(前闭后开)
constexpr T Align(T x, T align)
对齐align的倍数
constexpr Float CrossProduct(const Position2 &a, const Position2 &b)
叉乘(四指指向a,弯向b,大拇指指向c)
constexpr bool IsTriangle(const Triangle &triangle)
判断是否三角形
constexpr unsigned AlignPow2(unsigned x, unsigned align)
对齐align的倍数
constexpr Position CreatePositionByRatioGoldW(Float w)
判断点是否在凸四边形内
constexpr double DegreesToRadians(double deg)
将角度转为弧度
constexpr float OffsetOrder(float order, int u=1, int v=0, int w=0)
偏移order
double GetSolarElevation(double latitude, double declination)
计算正午太阳高度角
std::vector< Point > DrawLineLerp(const Point &p0, const Point &p1)
线性插值 画线算法
constexpr bool IsLeapYear(int year)
void MergePathDirect(std::list< Point > &list_pos, F func_pass)
路径合并(网格路径)
T Distance(const Array< T, 2 > &a)
constexpr uint32_t ARRAY_POW2_32[]
constexpr T AlignF(T x, T align)
RGP资源下标转方向
std::vector< PointU > GetCircle(const Size &size, const PointU &xy, unsigned rad)
返回圆形范围的节点,考虑越界
constexpr unsigned div_found(unsigned n, unsigned d)
无符号除法,返回四舍五入结果
constexpr bool IsRectEmpty(const Array< T, 4 > &rect)
判断 矩形 是否空
constexpr bool IsXyInSize(const Point &xy, const Size &size)
判断 点是否在大小内
constexpr T GetQuadSize(const Array< T, 4 > &quad)
返回 Quad 的大小
constexpr uint32_t Pow32(uint32_t x, uint8_t n)
constexpr T Pow(T x, T n)
返回x的n次方
bool AddUCheck(T0 a, T1 b, T0 &ret)
无符号 加 有符号,检查负数
std::vector< Point > DrawLineCover(const Point &p0, const Point &p1)
覆盖 画线算法
void Normalize(Array< T, N > &v)
向量单位化
void ExtendRectRB(const Array< T, 2 > &size, Array< T, 4 > &rect, T extend=1)
向右下拓展矩形
constexpr unsigned div_found_fast(unsigned n, unsigned d)
无符号除法,返回四舍五入结果
unsigned GetCircleNumMax(unsigned rad)
返回圆所占格子数(GetCircle函数使用)
constexpr Array< T, 3 > GetQuadTriangle0(const Array< T, 4 > &quad)
返回 Quad的三角形
Position4 Slerp(const Position4 &q0, const Position4 &q1, const Float &t)
球面线性插值
constexpr double PI(unsigned n=1, unsigned d=1)
返回PI的分数
void MergePath(std::list< Point > &list_pos)
路径合并(网格路径)
float RSqrt(float x)
返回平方根的倒数
void ExtendRectLeft(T min_left, Array< T, 4 > &rect, T extend=1)
向左拓展矩形
constexpr float Radian2Angle(float radin)
弧度转角度
T DisU(T a, T b)
返回无符号类型的差值
constexpr int GetMouthDayNum(int year, int mouth)
void NormalizeFast(Array< float, N > &v)
向量单位化,精度低速度快
void ExtendRectBottom(T max_bottom, Array< T, 4 > &rect, T extend=1)
向下拓展矩形
void GetRectTrim(F func, Array< T, 4 > &rect)
裁切图像、网格
constexpr uint64_t ARRAY_POW2[]
2的整数次幂列表
T DistancePow2(const Array< T, 2 > &a)
返回 向量 距离的平方
constexpr void RangeRadian(std::array< float, 2 > &arr)
void ExtendRectRight(T max_right, Array< T, 4 > &rect, T extend=1)
向右拓展矩形
void ExtendRectTop(T min_top, Array< T, 4 > &rect, T extend=1)
向上拓展矩形
double GetBaseTemperature(double latitude, int day)
基于纬度估算海平面基准温度(℃)
std::vector< Point > DrawLineBresenham(const Point &p0, const Point &p1)
bresenham 画线算法
constexpr auto DistanceDiagonal(const C &p0, const C &p1)
纹理区域转uv
constexpr T DotProduct(const Array< T, N > &a, const Array< T, N > &b)
点乘
void ExtendRect(const Array< T, 4 > &rect_big, Array< T, 4 > &rect, T extend=1)
拓展矩形
constexpr bool IsDotInQuad(const Position &dot, const Quad &quad)
判断点是否在四边形内(包含边)
constexpr uint64_t CeilToPow2(uint64_t &&x)
constexpr Array< T, 3 > GetQuadTriangle1(const Array< T, 4 > &quad)
T DistanceU(const Array< T, 2 > &a, const Array< T, 2 > &b)
返回 距离
constexpr bool IsRectValid(const Array< T, 4 > &rect)
判断 矩形 是否有效
constexpr bool IsRectInSize(const Array< T, 4 > &rect, const Size &size)
判断 矩形 在 大小 内,首先它必须是有效的矩形
constexpr float Angle2Radian(float angle)
角度转弧度
T0 AddU(T0 a, T1 b)
无符号 加 有符号,防止小于0
double GetSolarDeclination(int day)
计算太阳赤纬(太阳直射点纬度)
constexpr bool IsDotInTriangle(const Position &dot, const Triangle &triangle)
判断点是否在三角形内(包含边)
constexpr Float EULER
自然常数
constexpr Float EARTH_fADIUS
地球半径km
constexpr Float GRAVITY
地球重力加速度(赤道最小)
constexpr Float SQRT_2
根号2
constexpr Float RATIO_GOLD
黄金比例
void Min(Array< T, N > &container)
返回的是最小正数(假设有符号)
void Max(Array< T, N > &container)
constexpr auto Max(const C &container)
返回容器最大值
constexpr Array< PointU::value_type, N > toSizeDefault(const Array< T, N > &a)
有符号转无符号,直接转换,负数会直接转为大正数
Array< Float, 2 > Position2
constexpr T is_saturate(const T &x)
是否数值在[0, 1]
Array< Position, 3 > Triangle
void log(std::string_view str, DL_SOURCE_LOCATION)
以当前设置输出
Array< Float, 3 > Position3
Array< Float, 4 > Position4
constexpr T saturate(const T &x)
限制数值到 [0, 1]
Array< Position, 4 > Quad