常用数学函数详解:从基础运算到图形学应用
常用数学函数详解:从基础运算到图形学应用
在编程开发(尤其是图形学、数值计算领域)中,数学函数是构建复杂逻辑和效果的基础。无论是简单的取整运算,还是复杂的矩阵变换、光照计算,都离不开各类数学函数的支持。本文整理了常用的数学函数分类及详细说明,涵盖基础运算、逻辑判断、插值、比较、指数、对数、三角函数等多个维度,帮助开发者快速查阅和应用。
基本函数
基础数学运算函数,用于处理数值的基本变换和计算。
| 函数名 | 描述 | 参数/范围 | 示例 |
|---|---|---|---|
| round(x) | 对x进行四舍五入 | x为数值 | round(2.3) → 2;round(2.6) → 3 |
| abs(x) | 计算x的绝对值 | x可为正负数值 | abs(-5) → 5;abs(3) → 3 |
| pow(x, y) | 计算x的y次方(x^y) | x、y为数值 | pow(2, 3) → 8;pow(3, 0.5) → √3 ≈1.732 |
| fmod(x, y) | 计算x除以y的余数(浮点数除法余数) | y≠0(否则结果不可预料) | fmod(7, 3) → 1.0;fmod(5.5, 2) →1.5 |
| sqrt(x) | 计算x的平方根 | x必须大于0 | sqrt(4) → 2.0;sqrt(2)≈1.414 |
| rsqrt(x) | 计算x的反平方根(1/√x) | x必须大于0 | rsqrt(4) → 0.5;rsqrt(2)≈0.707 |
| frac(x) | 返回x的小数部分(x - floor(x)) | x为浮点数 | frac(3.14) → 0.14;frac(-2.5)→0.5 |
| ceil(x) | 向上取整(返回不小于x的最小整数) | x为浮点数 | ceil(1.3) → 2.0;ceil(-1.2)→-1.0 |
| floor(x) | 向下取整(返回不大于x的最大整数) | x为浮点数 | floor(1.3) →1.0;floor(-1.2)→-2.0 |
逻辑函数
用于处理布尔值或数组的逻辑判断,类似逻辑运算符的批量运算。
| 函数名 | 描述 | 参数/范围 | 示例 |
|---|---|---|---|
| all(x) | 对x中所有元素进行“与”运算(&&) | x为布尔数组或向量 | all([true, true, false]) → false;all([1,2,3])→true(非0为真) |
| any(x) | 对x中所有元素进行“或”运算(||) | x为布尔数组或向量 | any([false, true, false])→true;any([0,0,0])→false |
插值函数
用于在两个值之间进行平滑过渡,广泛应用于动画、颜色渐变等场景。
| 函数名 | 描述 | 参数/范围 | 示例 |
|---|---|---|---|
| lerp(a, b, f) | 计算a到b的线性插值,公式:(1-f)a + fb 或 a + f*(b-a) | a、b为插值上下限;f为权值(通常0≤f≤1) | lerp(10, 20, 0.5)→15;lerp(0,10,0.3)→3 |
| 若a、b为向量,f必须为标量或等长向量 |
比较函数
用于数值或向量的比较、范围限制等操作,是图形学中颜色、坐标裁剪的常用工具。
| 函数名 | 描述 | 参数/范围 | 示例 |
|---|---|---|---|
| min(a, b) | 返回a和b中的最小值 | a、b为同类型数值或向量 | min(3,5)→3;min(-2,-5)→-5 |
| max(a, b) | 返回a和b中的最大值 | a、b为同类型数值或向量 | max(3,5)→5;max(-2,-5)→-2 |
| clamp(x, a, b) | 将x限制在[a, b]范围内(x<a返回a;x>b返回b;否则返回x) | a≤b;x为待限制值 | clamp(5,1,10)→5;clamp(-3,1,10)→1;clamp(12,1,10)→10 |
| step(a, x) | 阶梯函数(x<a返回0;否则返回1) | a为阈值;x为比较值 | step(5,3)→0;step(5,7)→1;step(2,2)→1 |
| saturate(x) | 将x限制在[0, 1]范围内(同clamp(x, 0, 1)) | x为任意数值 | saturate(-0.5)→0;saturate(0.3)→0.3;saturate(1.2)→1 |
| sign(x) | 符号函数(x>0返回1;x<0返回-1;x=0返回0) | x为任意数值 | sign(5)→1;sign(-3)→-1;sign(0)→0 |
| isfinite(x) | 判断x是否为有限数(非无穷、非NaN) | x为数值 | isfinite(100)→true;isfinite(inf)→false |
| isnan(x) | 判断x是否为非数值(NaN) | x为数值 | isnan(NaN)→true;isnan(0)→false |
| isinf(x) | 判断x是否为无穷大(包括正无穷、负无穷) | x为数值 | isinf(inf)→true;isinf(5)→false |
指数函数
基于指数运算的函数,用于快速计算幂次相关的值。
| 函数名 | 描述 | 参数/范围 | 示例 |
|---|---|---|---|
| exp(x) | 计算自然指数e的x次方(e≈2.71828) | x为数值 | exp(1)≈2.718;exp(0)→1 |
| exp2(x) | 计算2的x次方 | x为数值 | exp2(3)→8;exp2(0)→1 |
| frexp(x, out exp) | 将浮点数x分解为尾数m和指数exp,满足x = m×2^exp(m∈[0.5,1)) | x为浮点数;exp为输出参数 | frexp(8, exp)→m=0.5,exp=4(0.5×2⁴=8) |
| 若x=0,则m=0且exp=0 | frexp(0, exp)→m=0,exp=0 | ||
| ldexp(x, n) | 计算x×2ⁿ的值 | x为数值;n为整数 | ldexp(0.5,4)→0.5×16=8;ldexp(2,3)=2×8=16 |
对数函数
指数函数的逆运算,用于处理对数相关计算。
| 函数名 | 描述 | 参数/范围 | 示例 |
|---|---|---|---|
| log(x) | 计算自然对数ln(x)(以e为底) | x必须大于0 | log(e)→1;log(1)→0 |
| log2(x) | 计算以2为底的对数log₂(x) | x必须大于0 | log2(8)→3;log2(2)→1 |
| log10(x) | 计算以10为底的对数log₁₀(x) | x必须大于0 | log10(100)→2;log10(1)→0 |
三角函数
用于角度与弧度的转换及三角运算,是图形学中旋转、光照计算的核心。
| 函数名 | 描述 | 参数/范围 | 示例 |
|---|---|---|---|
| sin(x) | 计算x的正弦值 | x为弧度值 | sin(π/2)→1;sin(0)→0 |
| cos(x) | 计算x的余弦值 | x为弧度值 | cos(0)→1;cos(π)→-1 |
| tan(x) | 计算x的正切值 | x为弧度值(x≠π/2 + kπ) | tan(π/4)→1;tan(0)→0 |
| asin(x) | 计算x的反正弦值(返回弧度) | x∈[-1,1];返回值∈[-π/2, π/2] | asin(1)→π/2;asin(0)→0 |
| acos(x) | 计算x的反余弦值(返回弧度) | x∈[-1,1];返回值∈[0, π] | acos(1)→0;acos(0)→π/2 |
| atan(x) | 计算x的反正切值(返回弧度) | x∈R;返回值∈[-π/2, π/2] | atan(0)→0;atan(1)→π/4 |
| atan2(y, x) | 计算y/x的反正切值(考虑象限,返回弧度) | y、x为数值 | atan2(1,1)→π/4;atan2(-1,1)→-π/4 |
| sinh(x) | 计算x的双曲正弦值((eˣ - e⁻ˣ)/2) | x为数值 | sinh(0)→0;sinh(1)≈1.175 |
| cosh(x) | 计算x的双曲余弦值((eˣ + e⁻ˣ)/2) | x为数值 | cosh(0)→1;cosh(1)≈1.543 |
| tanh(x) | 计算x的双曲正切值(sinh(x)/cosh(x)) | x为数值 | tanh(0)→0;tanh(1)≈0.761 |
| sincos(float x, out s, out c) | 同时计算x的正弦和余弦值(s=sin(x),c=cos(x)) | x为弧度值;s、c为输出参数 | sincos(π/2, s, c)→s=1,c=0 |
| radians(x) | 将角度值x转换为弧度值(弧度=角度×π/180) | x为角度值 | radians(180)→π;radians(90)→π/2 |
| degrees(x) | 将弧度值x转换为角度值(角度=弧度×180/π) | x为弧度值 | degrees(π)→180;degrees(π/2)→90 |
矢量函数
用于向量的基本运算,是3D图形学中向量计算的基础。
| 函数名 | 描述 | 参数/范围 | 示例 |
|---|---|---|---|
| dot(A, B) | 计算向量A和B的点积(内积) | A、B为同维度向量 | A=(1,2),B=(3,4) → dot(A,B)=1×3+2×4=11 |
| cross(A, B) | 计算三维向量A和B的叉积(外积) | A、B为三维向量 | A=(1,0,0),B=(0,1,0) → cross(A,B)=(0,0,1) |
矩阵函数
用于矩阵的运算和变换,在3D变换(平移、旋转、缩放)中不可或缺。
| 函数名 | 描述 | 参数/范围 | 示例 |
|---|---|---|---|
| determinant(m) | 计算矩阵m的行列式 | m为方阵 | 2x2矩阵[[2,3],[4,5]]的行列式=2×5-3×4=-2 |
| modf(x, out ip) | 将浮点数x分解为整数部分和小数部分(返回小数,整数存ip) | x为浮点数;ip为输出参数(整数部分) | modf(3.14, out ip)→0.14,ip=3.0 |
| mul(M, v) | 计算矩阵M与向量v的乘积(mul(v, M)为向量与矩阵乘积) | M为矩阵;v为向量 | M=[[1,2],[3,4]],v=(5,6) → mul(M,v)=(17,39) |
| transpose(M) | 计算矩阵M的转置(行变列,列变行) | M为任意矩阵 | M=[[1,2],[3,4]] → transpose(M)=[[1,3],[2,4]] |
噪声函数
用于生成具有一定规律性的“伪随机”值,广泛应用于纹理生成、地形模拟等。
| 函数名 | 描述 | 参数/范围 | 示例 |
|---|---|---|---|
| noise(x) | 生成0~1之间的噪声值(输入相同则输出相同,非真随机) | x为数值或向量 | noise(1.2)→0.345(固定输入返回固定值) |
环境光函数
专门用于光照计算的函数,帮助快速计算环境光、散射光和镜面光的贡献。
| 函数名 | 描述 | 参数/范围 | 示例 |
|---|---|---|---|
| lit(NdotL, NdotH, m) | 计算光照贡献,返回四元向量(x,y,z,w): | NdotL:法向量与入射光向量点积; | NdotL=0.8,NdotH=0.6,m=10 → (1.0, 0.8, 0.6¹⁰≈0.006, 1.0) |
| - x:环境光贡献(恒为1.0) | NdotH:法向量与半角向量点积; | 若NdotL=-0.2 → (1.0, 0, 0, 1.0)(散射光和镜面光均为0) | |
| - y:散射光贡献(NdotL<0则为0,否则为NdotL) | m:高光系数 | ||
| - z:镜面光贡献(NdotL<0或NdotH<0则为0,否则为(NdotH)^m) | |||
| - w:恒为1.0 |
总结
以上函数覆盖了从基础数值运算到图形学专用计算的多个场景,无论是简单的取整、比较,还是复杂的矩阵变换、光照计算,都能找到对应的工具函数。在实际开发中,灵活运用这些函数可以大幅简化逻辑,提升效率。不同编程语言(如GLSL、Python、C++)对这些函数的实现可能略有差异,但核心逻辑和用途基本一致,开发者可根据具体场景查阅对应语言的文档进行适配。
