# 【GLSL】多角形を座標変換する

See the Pen coordinate transformation with polygons by aadebdeb (@aadebdeb) on CodePen.

```  #define PI 3.14159265359
#define TWO_PI PI * 2.0

precision mediump float;

uniform float u_time;
uniform vec2 u_mouse;
uniform vec2 u_resolution;

float polygon(vec2 center, vec2 st, float radius, int n) {
vec2 pos = st - center;
float a = atan(pos.x, pos.y) + PI;
float r = TWO_PI / float(n);

float d = cos(floor(.5 + a / r) * r - a) * length(pos);

}

void main(void) {
float m = min(u_resolution.x, u_resolution.y);
vec2 st = gl_FragCoord.xy / m;
st = st * 2.0 - u_resolution / m;

vec2 mouse = u_mouse / m;
mouse = mouse * 2.0 - u_resolution / m;

vec3 st3 = vec3(st, 1.0);
mat3 transMat= mat3(1.0, 0.0, 0.0,
0.0, 1.0, 0.0,
-mouse.x, -mouse.y, 1.0);
st3 = transMat * st3;

float theta = atan(mouse.y, mouse.x);
mat3 rotMat = mat3(cos(theta), sin(theta), 0.0,
-sin(theta), cos(theta), 0.0,
0.0, 0.0, 1.0);
st3 = rotMat * st3;

float scale = 1.0 + length(mouse);
mat3 scaleMat = mat3(scale, 0.0, 0.0,
0.0, scale, 0.0,
0.0, 0.0, 1.0);
st3 = scaleMat * st3;

// mat3 shearMat = mat3(1.0, mouse.x, 0.0,
//                      mouse.y, 1.0, 0.0,
//                      0.0, 0.0, 1.0);
// st3 = shearMat * st3;

st = st3.xy;

vec3 v = vec3(0.82, 0.945, 0.8);
v = mix(v, vec3(0.714, 0.098, 0.447),  polygon(vec2(-0.33, -0.33), st, 0.15, 3));
v = mix(v, vec3(0.714, 0.098, 0.447),  polygon(vec2(0.33, -0.33), st, 0.15, 4));
v = mix(v, vec3(0.714, 0.098, 0.447),  polygon(vec2(-0.33, 0.33), st, 0.15, 5));
v = mix(v, vec3(0.714, 0.098, 0.447),  polygon(vec2(0.33, 0.33), st, 0.15, 6));

gl_FragColor = vec4(v, 1.0);
}
```