# SeExpr 表达式参考¶

## Variables (变量)¶

\$u, \$v

\$w, \$h

### Local Variables (局部变量)¶

```\$a = noise(\$P);
\$b = noise(\$a * 1);
pow(\$a, 0.5) + \$b
```

```\$P = \$P * 10; # 提高噪声频率
fbm(vnoise(\$P) + \$P/4)
```

```\$A::a = \$u * 10;
```

## Control Structures (控制结构)¶

SeExpr 提供了常见的 if 条件结构:

```if (\$ u > 0.5) {
\$color = [0, 0, 1];
}
else {
\$color = [1, 0, 0];
}

\$color
```

```\$u = \$i < .5 ? 0.0 : 10.0
```

```\$color = \$u < .5 ? (\$v < 0.5 ? [0, 0, 1] : [1, 0, 0]) : [0, 1, 0];
\$color
```

```if (\$ u > 0.5) {
if (\$v < 0.5) {
\$color = [0, 0, 1];
}
else {
\$color = [1, 0, 0];
}
}
else {
\$color = [1, 0, 0];
}

\$color
```

## Operators (运算符/按递减顺序排列)¶

[a,b,c]

vector constructor (矢量构造函数)

\$P[ n ]

vector component access (矢量分量访问)

`n` 必须是 0、1 或者 2，例如:

```\$P[0]
```
^

exponentiation (取幂、乘方)

`pow` 函数相同。

!

logical NOT (逻辑非)

~

inversion (求逆/反相)

```~\$A
```

```1 - \$A
```
*/ %

`%``fmod` 函数相同。

+-

<> <= >=

== !=

&&

logical AND (逻辑与)

||

logical OR (逻辑或)

?:

ternary `if` operator (三元 `if` 运算符)

```\$u < .5 ? 0 : 1
```
->

apply (应用)：将箭头右边的函数应用到箭头左边的表达式。

```\$Cs->contrast(.7) -> clamp(0.2,0.8)
\$u->hsi(20,1.2,1,\$Cs->gamma(1.2))
```

## Assignment Operators (赋值运算符)¶

```\$foo = \$bar
```

```\$foo += \$bar;
```

```\$foo = \$foo + \$bar;
```

• `+=`

• `-=`

• `/=`

• `%=`

• `*=`

• `^=`

`\$var0` 作为整数变量，范围在 0 - 10 (含):

```\$var0 = 0; # 0, 10
```

`\$var1` 作为浮点变量，范围和前者一样:

```\$var1 = 0; # 0.000, 10.000
```

`\$var2` 作为矢量变量，范围和前者一样:

```\$var2 = [0, 0, 0] # 0.000, 10.000
```

```# 输出颜色为暗红色
\$color = [0.5, 0, 0] # 0.000, 1.000
```

## Logging Functions (日志函数)¶

float printf ( string format, [param0, param1, …] )

```\$u = printf("test %f %v",[1,2,3],[4,5,6]);
```

```test 1 [4,5,6]
```
string sprintf ( string format, [double|string, double|string, …] )

## Color, Masking, and Remapping Functions (颜色、遮蔽、重映射函数)¶

float bias ( float x, float b)

float boxstep ( float x, float a )
float gaussstep ( float x, float a, float b )
float linearstep ( float x, float a, float b )
float smoothstep ( float x, float a, float b )

step (梯度) 函数在 `x < a` 时为 0，在 `x > b` (boxstep 正方插值的场合则是 `x > a` ) 时为 1。在 `a``b` 之间，数值从 0 到 1 连续过渡。 `gaussstep` (高斯梯度) 函数使用基于指数曲线的标准高斯钟形曲线。 `smoothstep` 函数则使用三次曲线 (立方曲线)。从直觉感受来说， `gaussstep` 在接近 1 时过渡陡峭，而在接近 0 时过渡平缓。 `smoothstep` 在 1 和 0 附近的过渡具有中等的柔和度。

float clamp ( float x, float lo, float hi )

`x` 限制在 `[lo, hi]` 范围内。

float compress ( float x, float lo, float hi )

float contrast ( float x, float c )

float expand ( float x, float lo, float hi )

float fit ( float x, float a1, float b1, float a2, float b2 )

`[a1..x..b1]` 线性重映射到 `[a2..x..b2]`

float gamma ( float x, float g)

`pow(x, 1/g)`

float invert ( float x )

color hsi ( color x, float h, float s, float i, float map=1 )

`hsi` 函数按 `h` (单位为度) 对色相进行 shift (偏移)，按 `s` 对饱和度进行 scale (按比例缩放)，按 `i` 对亮度进行缩放。可以提供 map (映射值) 来控制偏移量。map 为 1 时色相旋转一周；map 为 0 时色相不旋转；对于 0 到 1 之间的数值，偏移量将等比例缩放。

color hsltorgb ( color hsl )
color rgbtohsl ( color rgb )

RGB 到 HSL 色彩空间转换。HSL 代表 Hue (色相)、Saturation (饱和度)、Lightness (亮度) (这些数值的范围全部为 `[0, 1]` )。可扩展至支持在合理范围内超出 `[0, 1]` 的 RGB 和 HSL 数值。对于任意 RGB 或者 HSL 数值 (负值除外)，此转换操作是定义明确且可逆的。

color midhsi ( color x, float h, float s, float i, float map, float falloff=1, int interp=0 )

`midhsi` 函数和 `hsi` 函数类似，但它的控制映射按中间点对齐 (数值为 `0.5`)，且可以向两个方向按比例缩放色相偏移量。数值在中间点时色相不发生偏移。数值为 `1.0` 时色相顺时针旋转一周，数值为 `0.0` 时色相逆时针旋转一周。另外还可以使用 `falloff``interp` 来控制 `remap` 函数对映射进行调整。 `falloff``interp` 为默认值时不发生重映射。

float mix ( float a, float b, float alpha )

float remap ( float x, float source, float range, float falloff, int interp )

• int linear = 0 (线性)

• int smooth = 1 (平滑)

• int gaussian = 2 (高斯)

## Noise Functions (噪声函数)¶

float cellnoise ( vector v )
float cellnoise1 ( float x )
float cellnoise2 ( float x, float y )
float cellnoise3 ( float x, float y, float z )
color ccellnoise ( vector v )

`cellnoise` 会在一片区域中依据整数位置生成一片带有恒定颜色的方块。它和 PRMan cellnoise function 功能一致

`ccellnoise` 输出 color cellnoise (色块噪声)。

float fbm ( vector v, int octaves=6, float lacunarity=2, float gain=0.5 )
color cfbm ( vector v, int octaves=6, float lacunarity=2, float gain=0.5 )
vector vfbm ( vector v, int octaves=6, float lacunarity=2, float gain=0.5 )
float fbm4 ( vector v, float time, int octaves=6, float lacunarity=2, float gain=0.5 )
color cfbm4 ( vector v, float time, int octaves=6, float lacunarity=2, float gain=0.5 )
vector vfbm4 ( vector v, float time, int octaves=6, float lacunarity=2, float gain=0.5 )

`fbm` (Fractal Brownian Motion / 分形布朗运动) 是一个多频率噪声函数。它的基本频率和 `noise` 函数相同，频率总数通过 `octaves``控制。 ``lacunarity` 是频率之间的间隙，数值为 2 时代表每一 octave (八度) 的频率是前一八度的 2 倍。 `gain` 控制每个频率相对前一频率如何按比例缩放。

`cfbm``cfbm4` 输出颜色噪声。

`vfbm``vfbm4` 输出矢量噪声。

float hash ( float seed1, [float seed2, …] )

`rand` 类似，但不带有内部种子。可以指定任意数量的种子，结果为基于所有种子的随机函数。

float noise ( vector v )
float noise ( float x, float y )
float noise ( float x, float y, float z )
float noise ( float x, float y, float z, float w )
color cnoise ( vector v)
color cnoise4 ( vector v, float t)
float pnoise ( vector v, vector period )
float snoise ( vector v)
float snoise4 ( vector v, float t)
vector vnoise (vector v )
vector vnoise4 (vector v, float t )

`noise` 是一个随机函数，它会在整数位置平滑地混合样本。这也是 Ken Perlin 发明的原始噪声函数 (柏林噪声)。

`cnoise``cnoise4` 输出颜色噪声。

`noise4` 输出有正负之分的矢量噪声。

`pnoise` 输出周期噪声。

`snoise``snoise4` 输出有正负之分的噪声，范围为 `[-1, 1]`

`vnoise` 输出有正负之分的矢量噪声。

float rand ( [float min, float max], [float seed] )

`[min, max]` 范围内的随机数字 (如果不指定范围则是 `[0, 1]` )。如果提供了外部种子，内部种子将和外部种子一同被使用，可以用于编写各种效果独特的生成器。

float turbulence ( vector v, int octaves=6, float lacunarity=2, float gain=0.5 )
color cturbulence ( vector v, int octaves=6, float lacunarity=2, float gain=0.5 )
vector vturbulence ( vector v, int octaves=6, float lacunarity=2, float gain=0.5 )

`turbulence``fbm` 的变体，它会取每种噪声条件的绝对值，给出更加汹涌的视觉效果。

float voronoi ( vector v, int type=1, float jitter=0.5, float fbmScale=0, int fbmOctaves=4, float fbmLacunarity=2, float fbmGain=0.5)
color cvoronoi ( vector v, int type=1, float jitter=0.5, float fbmScale=0, int fbmOctaves=4, float fbmLacunarity=2, float fbmGain=0.5)
vector pvoronoi ( vector v, float jitter=0.5, float fbmScale=0, int fbmOctaves=4, float fbmLacunarity=2, float fbmGain=0.5)

`voronoi` 是一种蜂窝状噪声图案，也叫做泰森图。它是 `cellnoise` 的抖动变体。它的类型参数描述了不同的噪声函数变体。 `jitter` 参数控制蜂窝形状的不规则程度 (0 与一般 cellnoise 图案相同)。 `fbm...` 参数可被用于扭曲噪声场。当 `fbmScale` 为 0 (默认值) 时不发生扭曲。其余参数和 `fbm` 函数中的相同。

Voronoi 的类型，从 1 到 5：

`cvoronoi` 给蜂窝图案的每一格返回一种随机颜色， `pvoronoi` 返回蜂窝图案格子中心点位置。

## Selection Functions (选择函数)¶

float choose ( float index, float choice1, float choice2, […] )

int cycle ( int index, int loRange, int hiRange )

int pick ( float index, int loRange, int hiRange, [ float weights, … ] )

float wchoose ( float index, float choice1, float weight1, float choice2, float weight2, […] )

```pick(value, 1, 10)
```

```pick(value, 1, 10, 2, 2.5)
```

```This example returns 10, 11, and 13 through 20 (12 is skipped due to zero weight)::

dummy literal
```

## 一般数学常量和函数¶

float PI
```float PI = 3.14159...
```
float E
```float E = 2.71828...
```
float abs ( float x)

`x` 的绝对值。

float cbrt ( float x )

float ceil ( float x )

float exp ( float x )

`E``x` 次方。

float floor ( float x )

float fmod ( float x, float y )

`x / y` 的余数。

float log ( float x )

float log10 ( float x )

float max ( float a, float b )

`a``b` 的较大值。

float min ( float a, float b )

`a``b` 的较小值。

float pow ( float x, float y )

`x``y` 次方。

float round ( float x )

float sqrt ( float x )

float trunc ( float x )

## Trigonometry Functions (三角函数)¶

float acos ( float x )

float acosd ( float x )

float acosh ( float x )

float asin ( float x )

float asind ( float x )

float asinh ( float x )

float atan ( float x )

float atand ( float x )

float atan2 ( float y, float x)

`-PI``PI` 之间求 `y/x` 的反正切弧度。

float atan2d ( float y, float x )

`-180º``180º` 之间求 `y/x` 的反正切角度。

float atanh ( float x )

float cos ( float x )

float cosd ( float x )

float cosh ( float x )

float deg ( float x )

float hypot ( float x, float y )

float rad ( float x )

float sin ( float x )

float sind ( float x )

float sinh ( float x )

float tan ( float x )

float tand ( float x )

float tanh ( float x )

## Vector Functions (矢量函数)¶

float angle ( vector a, vector b )

vector cross ( vector a, vector b )

float dist ( vector a, vector b )

float dot ( vector a, vector b)

float length ( vector v )

vector norm ( vector v )

vector ortho ( vector a, vector b )

vector rotate ( vector v, vector axis, float angle )

vector up ( vector v, vector up )

## Vector Support (矢量功能支持)¶

** Vectors (矢量)** 包括矢量点、颜色矢量和三维矢量，有时也和 scalars (标量) (simple floating point values / 简单浮点数值) 混用。如果在矢量语境里面使用标量，它将会被复制到矢量的三个分量上，例如 `0.5` 将被转换为 `[0.5, 0.5, 0.5]`

## Curve Functions (曲线函数)¶

color ccurve ( float param, float pos0, color val0, int interp0, float pos1, color val1, int interp1, […] )

`param` 处给定的控制点对颜色梯度进行插值。控制点由三元参数 `pos_i``val_i``interp_i` 进行指定。

• 0 - none (无)

• 1 - linear (线性)

• 2 - smooth (平滑)

• 3 - spline (样条曲线)

• 4 - monotone (non-oscillating) spline (单调/非振动样条曲线)

float curve ( float param, float pos0, float val0, int interp0, float pos1, float val1, int interp1, […] )

`param` 处给定的控制点对一维梯度进行插值。控制点由三元参数 `pos_i``val_i``interp_i` 进行指定。

• 0 - none (无)

• 1 - linear (线性)

• 2 - smooth (平滑)

• 3 - spline (样条曲线)

• 4 - monotone (non-oscillating) spline (单调/非振动样条曲线)

float spline ( float param, float y1, float y2, float y3, float y4, […] )

Krita 不支持此功能。