## mirror (`lygia`/`math`/`mirror`)

Transforms the input signal into a triangle wave. For instance, if x goes between 0 and 2, the returned value will go from 0 to 1, and then 1 to 0 in a triangle shape.

Use:

``````<float|vec2> mirror(<float|vec2> x)
``````

Check it on Github

``````
#ifndef FNC_MIRROR
#define FNC_MIRROR
float mirror(in float x) {
float f = fract(x);
float m = floor(mod(x, 2.));
float fm = f * m;
return f + m - fm * 2.;
}

vec2 mirror(in vec2 v) {
vec2 f = fract(v);
vec2 m = floor(mod(v, 2.));
vec2 fm = f * m;
return f + m - fm * 2.;
}
#endif

``````

Dependencies:

Use:

``````<float|float2> mirror(<float|float2> x)
``````

Check it on Github

``````

#ifndef FNC_MIRROR
#define FNC_MIRROR
float mirror(in float x) {
float f = frac(x);
float m = floor(mod(x, 2.));
float fm = f * m;
return f + m - fm * 2.;
}

float2 mirror(in float2 xy) {
float2 f = frac(xy);
float2 m = floor(mod(xy, 2.));
float2 fm = f * m;
return f + m - fm * 2.;
}
#endif

``````

Check it on Github

``````
fn mirror(x: f32) -> f32 {
let f = fract(x);
let m = floor(x % 2.0);
let fm = f * m;
return f + m - fm * 2.0;
}

fn mirror2(xy: vec2f) -> vec2f {
let f = fract(xy);
let m = floor(xy % 2.0);
let fm = f * m;
return f + m - fm * 2.0;
}
``````

Dependencies:

Use:

``````<float|float2> mirror(<float|float2> x)
``````

Check it on Github

``````

#ifndef FNC_MIRROR
#define FNC_MIRROR
inline __device__ __host__ float mirror(float x) {
float f = frac(x);
float m = floor(mod(x, 2.0f));
float fm = f * m;
return f + m - fm * 2.;
}

inline __device__ __host__ float2 mirror(float2 xy) {
float2 f = frac(xy);
float2 m = floor(mod(xy, 2.0f));
float2 fm = f * m;
return f + m - fm * 2.0f;
}
#endif

``````