dl
dl_math.h 文件参考

数学相关的通用算法 更多...

#include <numeric>
#include <list>
#include <version>
#include <functional>
#include "dl_type.h"
#include "io/dl_log.h"
#include "base/dl_concept.h"
#include "dl_algorithm.h"
#include "dl_range.h"
#include "system/dl_platform.h"
#include <numbers>

浏览该文件的源代码.

class  dl::Math::RingX::MapLimit
 地图限制器(x轴为环状) 更多...
 

命名空间

namespace  dl
 
namespace  dl::Numbers
 类似std::numbers的常数
 
namespace  dl::Numeric
 类似numeric头文件的数值操作
 
namespace  dl::Math
 2维装箱算法
 
namespace  dl::Math::RingX
 

宏定义

#define DND_ARRAY_POW_LINE(index)
 向上取2的幂次
 
#define DND_ARRAY_POW_LINE_32(index)
 

类型定义

using dl::Math::RingX::FnDiffusionCheck = std::function<bool(const PointU& xy)>
 
using dl::Math::RingX::FnDiffusionCb = std::function<void(unsigned, const std::list<PointU>& xy)>
 

函数

template<typename T, size_t N>
void dl::Numeric::Min (Array< T, N > &container)
 返回的是最小正数(假设有符号)
 
template<typename T, size_t N>
void dl::Numeric::Max (Array< T, N > &container)
 
template<typename T>
constexpr bool dl::Math::IsOutRange (T x, T a, T b)
 判断数值是否越界(前闭后开)
 
constexpr float dl::Math::Radian2Angle (float radin)
 弧度转角度
 
constexpr float dl::Math::Angle2Radian (float angle)
 角度转弧度
 
constexpr void dl::Math::RangeRadian (std::array< float, 2 > &arr)
 
uint32_t dl::Math::ByteReverse (uint32_t x)
 翻转字节序
 
template<typename T>
constexpr T dl::Math::Pow (T x, T n)
 返回x的n次方
 
constexpr uint64_t dl::Math::Pow64 (uint64_t x, uint8_t n)
 
constexpr uint32_t dl::Math::Pow32 (uint32_t x, uint8_t n)
 
constexpr uint64_t dl::Math::CeilToPow2 (uint64_t &&x)
 
constexpr uint32_t dl::Math::CeilToPow2 (uint32_t &&x)
 
template<typename T>
T dl::Math::CeilToPow2 (const T &x)
 向上取2的幂次
 
float dl::Math::RSqrt (float x)
 返回平方根的倒数
 
template<size_t N>
void dl::Math::NormalizeFast (Array< float, N > &v)
 向量单位化,精度低速度快
 
template<IsUnsigned T0, IsSigned T1>
T0 dl::Math::AddU (T0 a, T1 b)
 无符号 加 有符号,防止小于0
 
template<IsUnsigned T0, IsSigned T1, size_t N>
void dl::Math::AddU (Array< T0, N > &a, const Array< T1, N > &b)
 无符号 加 有符号,负数转为0
 
template<IsUnsigned T0, IsSigned T1, size_t N>
Array< T0, Ndl::Math::AddU (const Array< T0, N > &a, const Array< T1, N > &b)
 
template<IsUnsigned T0, IsSigned T1>
bool dl::Math::AddUCheck (T0 a, T1 b, T0 &ret)
 无符号 加 有符号,检查负数
 
template<IsUnsigned T0, IsSigned T1, size_t N>
bool dl::Math::AddUCheck (const Array< T0, N > &a, const Array< T1, N > &b, const Array< T0, N > &ret)
 无符号 加 有符号,检查负数
 
template<IsUnsigned T>
T dl::Math::SubU (T a, T b)
 无符号类型相减,负数转为0
 
template<IsUnsigned T0, IsSigned T1>
T0 dl::Math::SubU (T0 a, T1 b)
 无符号减有符号,结果负数转为0
 
template<IsUnsigned T, size_t N>
Array< T, Ndl::Math::SubU (const Array< T, N > &a, const Array< T, N > &b)
 无符号类型相减,负数转为0
 
template<IsUnsigned T0, IsSigned T1, size_t N>
Array< T0, Ndl::Math::SubU (const Array< T0, N > &a, const Array< T1, N > &b)
 无符号减有符号,负数转为0
 
template<IsUnsigned T>
T dl::Math::DisU (T a, T b)
 返回无符号类型的差值
 
template<IsUnsigned T, size_t N>
Array< T, Ndl::Math::DisU (const Array< T, N > &a, const Array< T, N > &b)
 返回无符号类型的差值
 
template<typename T>
T dl::Math::DistancePow2 (const Array< T, 2 > &a)
 返回 向量 距离的平方
 
template<typename T>
T dl::Math::DistancePow2 (const Array< T, 3 > &a)
 
template<typename T>
T dl::Math::DistancePow2 (const Array< T, 4 > &a)
 
template<typename T>
T dl::Math::Distance (const Array< T, 2 > &a)
 
template<typename T>
T dl::Math::Distance (const Array< T, 3 > &a)
 
template<typename T>
T dl::Math::Distance (const Array< T, 4 > &a)
 
template<IsSigned T>
T dl::Math::DistancePow2 (const Array< T, 2 > &a, const Array< T, 2 > &b)
 返回 距离的平方
 
template<IsUnsigned T>
T dl::Math::DistancePow2U (const Array< T, 2 > &a, const Array< T, 2 > &b)
 返回 距离的平方
 
template<IsUnsigned T>
T dl::Math::DistanceU (const Array< T, 2 > &a, const Array< T, 2 > &b)
 返回 距离
 
template<IsSigned T, size_t N>
void dl::Math::Normalize (Array< T, N > &v)
 向量单位化
 
template<IsSigned T, size_t N>
Array< T, Ndl::Math::Normalize (const Array< T, N > &v)
 
std::vector< PointUdl::Math::GetCircle (const Size &size, const PointU &xy, unsigned rad)
 返回圆形范围的节点,考虑越界
 
std::vector< Pointdl::Math::GetCircle (const Point &xy, unsigned rad)
 返回圆形范围的节点,不考虑越界
 
constexpr double dl::Math::PI (unsigned n=1, unsigned d=1)
 返回PI的分数
 
constexpr float dl::Math::PIF (unsigned n=1, unsigned d=1)
 
template<IsReal T>
constexpr T dl::Math::AlignF (T x, T align)
 RGP资源下标转方向
 
template<IsUnsigned T>
constexpr T dl::Math::Align (T x, T align)
 对齐align的倍数
 
constexpr unsigned dl::Math::IsPow2 (unsigned x)
 是否2的幂
 
constexpr unsigned dl::Math::AlignPow2 (unsigned x, unsigned align)
 对齐align的倍数
 
constexpr unsigned dl::Math::div_found (unsigned n, unsigned d)
 无符号除法,返回四舍五入结果
 
constexpr unsigned dl::Math::div_found_fast (unsigned n, unsigned d)
 无符号除法,返回四舍五入结果
 
constexpr float dl::Math::OffsetOrder (float order, int u=1, int v=0, int w=0)
 偏移order
 
constexpr Float dl::Math::CrossProduct (const Position2 &a, const Position2 &b)
 叉乘(四指指向a,弯向b,大拇指指向c)
 
constexpr Position3 dl::Math::CrossProduct (const Position3 &a, const Position3 &b)
 
template<typename T, size_t N>
constexpr T dl::Math::DotProduct (const Array< T, N > &a, const Array< T, N > &b)
 点乘
 
Position4 dl::Math::Slerp (const Position4 &q0, const Position4 &q1, const Float &t)
 球面线性插值
 
template<typename C>
constexpr auto dl::Math::DistanceDiagonal (const C &p0, const C &p1)
 纹理区域转uv
 
std::vector< Pointdl::Math::DrawLineLerp (const Point &p0, const Point &p1)
 线性插值 画线算法
 
std::vector< Pointdl::Math::DrawLineBresenham (const Point &p0, const Point &p1)
 bresenham 画线算法
 
std::vector< Pointdl::Math::DrawLineOrth (const Point &p0, const Point &p1)
 正交 画线算法
 
std::vector< Pointdl::Math::DrawLineCover (const Point &p0, const Point &p1)
 覆盖 画线算法
 
void dl::Math::MergePath (std::list< Point > &list_pos)
 路径合并(网格路径)
 
template<typename F>
void dl::Math::MergePathDirect (std::list< Point > &list_pos, F func_pass)
 路径合并(网格路径)
 
template<typename T>
constexpr T dl::Math::GetQuadSize (const Array< T, 4 > &quad)
 返回 Quad 的大小
 
template<typename T>
constexpr Array< T, 3 > dl::Math::GetQuadTriangle0 (const Array< T, 4 > &quad)
 返回 Quad的三角形
 
template<typename T>
constexpr Array< T, 3 > dl::Math::GetQuadTriangle1 (const Array< T, 4 > &quad)
 
template<typename T>
constexpr bool dl::Math::IsRectValid (const Array< T, 4 > &rect)
 判断 矩形 是否有效
 
template<typename T>
constexpr bool dl::Math::IsRectEmpty (const Array< T, 4 > &rect)
 判断 矩形 是否空
 
template<typename T>
constexpr bool dl::Math::IsRectInSize (const Array< T, 4 > &rect, const Size &size)
 判断 矩形 在 大小 内,首先它必须是有效的矩形
 
constexpr bool dl::Math::IsXyInSize (const Point &xy, const Size &size)
 判断 点是否在大小内
 
constexpr bool dl::Math::IsXyInRect (const Point &xy, const Rect &rect)
 判断 点是否在矩形内
 
constexpr bool dl::Math::IsTriangle (const Triangle &triangle)
 判断是否三角形
 
constexpr bool dl::Math::IsDotInTriangle (const Position &dot, const Triangle &triangle)
 判断点是否在三角形内(包含边)
 
constexpr bool dl::Math::IsDotInQuad (const Position &dot, const Quad &quad)
 判断点是否在四边形内(包含边)
 
constexpr Position dl::Math::CreatePositionByRatioGoldW (Float w)
 判断点是否在凸四边形内
 
template<typename T, typename F>
void dl::Math::GetRectTrim (F func, Array< T, 4 > &rect)
 裁切图像、网格
 
template<typename T>
void dl::Math::ExtendRectLeft (T min_left, Array< T, 4 > &rect, T extend=1)
 向左拓展矩形
 
template<typename T>
void dl::Math::ExtendRectTop (T min_top, Array< T, 4 > &rect, T extend=1)
 向上拓展矩形
 
template<typename T>
void dl::Math::ExtendRectRight (T max_right, Array< T, 4 > &rect, T extend=1)
 向右拓展矩形
 
template<typename T>
void dl::Math::ExtendRectBottom (T max_bottom, Array< T, 4 > &rect, T extend=1)
 向下拓展矩形
 
template<typename T>
void dl::Math::ExtendRect (const Array< T, 4 > &rect_big, Array< T, 4 > &rect, T extend=1)
 拓展矩形
 
template<typename T>
void dl::Math::ExtendRect (const Array< T, 2 > &size, Array< T, 4 > &rect, T extend=1)
 拓展矩形
 
template<typename T>
void dl::Math::ExtendRectRB (const Array< T, 2 > &size, Array< T, 4 > &rect, T extend=1)
 向右下拓展矩形
 
unsigned dl::Math::GetCircleNumMax (unsigned rad)
 返回圆所占格子数(GetCircle函数使用)
 
void dl::Math::RingX::Clamp (const Size &size, PointU &xy)
 限制到大小内
 
bool dl::Math::RingX::Clamp (const Size &size, Point xy, PointU &out_xy)
 限制到大小内
 
unsigned dl::Math::RingX::DistancePow2NoCheck (const Size &size, const PointU &a, const PointU &b)
 返回 距离,x轴为环形
 
unsigned dl::Math::RingX::Distance (const Size &size, const PointU &a, const PointU &b)
 返回 距离,x轴为环形
 
std::vector< PointUdl::Math::RingX::GetCircle (const Size &size, const PointU &xy, unsigned rad)
 返回圆形范围的节点,x轴为环形
 
std::vector< PointUdl::Math::RingX::Diffusion (const Size &size, const PointU &xy, unsigned count, FnDiffusionCheck func_valid, FnDiffusionCb func_cb)
 扩散遍历
 
constexpr double dl::Math::DegreesToRadians (double deg)
 将角度转为弧度
 
constexpr double dl::Math::RadiansToDegrees (double rad)
 将弧度转为角度
 
constexpr bool dl::Math::IsLeapYear (int year)
 
constexpr int dl::Math::GetMouthDayNum (int year, int mouth)
 
double dl::Math::GetSolarDeclination (int day)
 计算太阳赤纬(太阳直射点纬度)
 
double dl::Math::GetSolarElevation (double latitude, double declination)
 计算正午太阳高度角
 
int dl::Math::GetSeason (int day, double latitude)
 返回季节
 
double dl::Math::GetBaseTemperature (double latitude, int day)
 基于纬度估算海平面基准温度(℃)
 

变量

constexpr Float dl::Numbers::EARTH_fADIUS = 6371.393_f
 地球半径km
 
constexpr Float dl::Numbers::GRAVITY = 9.8_f
 地球重力加速度(赤道最小)
 
constexpr Float dl::Numbers::EULER = 2.718281828459045_f
 自然常数
 
constexpr Float dl::Numbers::RATIO_GOLD = 0.618033988749894_f
 黄金比例
 
constexpr Float dl::Numbers::SQRT_2 = 1.41421356237_f
 根号2
 
constexpr Float dl::Numbers::PI = 3.1415926536_f
 圆周率
 
constexpr uint64_t dl::Math::ARRAY_POW2 []
 2的整数次幂列表
 
constexpr uint32_t dl::Math::ARRAY_POW2_32 []
 

详细描述

数学相关的通用算法

版本
1.0
作者
lveyou
日期
21-08-15

在文件 dl_math.h 中定义.

宏定义说明

◆ DND_ARRAY_POW_LINE

#define DND_ARRAY_POW_LINE ( index)
值:
if (x <= ARRAY_POW2[index])return ARRAY_POW2[index]

向上取2的幂次

注解
常量表达式

在文件 dl_math.h182 行定义.

◆ DND_ARRAY_POW_LINE_32

#define DND_ARRAY_POW_LINE_32 ( index)
值:
if (x <= ARRAY_POW2_32[index])return ARRAY_POW2_32[index]

在文件 dl_math.h197 行定义.