# Учебная практика. Среда 20.06.2021. Федяева Евгения Игоревна
1. Присутствовала на лекции.
2. [Смешарик](https://www.shadertoy.com/view/7lfXzr)
```
float Circle(vec2 xy, float r, vec2 pos)
{
float d = length(xy-pos);
float cl = smoothstep(r, r-0.008, d);
return cl;
}
void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
vec2 xy = fragCoord.xy/iResolution.xy;
xy -= 0.5;
xy.x *= iResolution.x/iResolution.y;
float sm = Circle(xy, 0.23, vec2(0.0, -0.1)); //body
sm -= Circle(xy, 0.05, vec2(0.06, -0.06)); //eye
sm -= Circle(xy, 0.045, vec2(-0.06, -0.06)); //eye
sm -= Circle(xy, 0.03, vec2(0.0, -0.12)); //nose
sm += Circle(xy, 0.022, vec2(0.08, -0.06));
sm += Circle(xy, 0.02, vec2(-0.045, -0.06));
xy.x /= iResolution.y/(2.0*iResolution.x);
sm = max(sm, Circle(xy, 0.18, vec2(0.25, 0.28))); //ear
sm = max(sm, Circle(xy, 0.18, vec2(-0.25, 0.28))); //ear
sm = max(sm, Circle(xy, 0.08, vec2(0.87, -0.1))); //hand
sm = max(sm, Circle(xy, 0.08, vec2(-0.87, -0.1))); //hand
xy.x /= 4.0*iResolution.x/iResolution.y;
sm = max(sm, Circle(xy, 0.04, vec2(0.08, -0.3))); //leg
sm = max(sm, Circle(xy, 0.04, vec2(-0.08, -0.3))); //leg
vec3 pic = vec3(0.2, 0.7, 1.0)*sm;
fragColor = vec4(pic, 1.0);
}
```
За основу рисунка взят круг, как и в случае с чебурашкой. Смешарик создается сложением(вычитанием) различных кругов, а также с помощью операции `max`.
3. [Имя и фамилия](https://www.shadertoy.com/view/NlfXzr)
```
float Q(float x, float y, float r)
{
return max(abs(x),abs(y)) - r ;
}
mat2 rotate(float ang)
{
return mat2(cos(ang),-sin(ang),
sin(ang),cos(ang));
}
float E(vec2 p, float ax, float ay)
{
float c = Q((p.x - ax) / 2.0, p.y + ay, 0.035) * 100.0;
c = min(c, Q((p.x - ax) / 2.0, p.y + ay + 0.2, 0.035) * 100.0);
c = min(c, Q((p.x - ax) / 2.0, p.y + ay - 0.2, 0.035) * 100.0);
c = min(c, Q((p.x - ax - 0.06) * 1.5, (p.y + ay) / 7.0, 0.035) * 100.0);
return c;
}
float V(vec2 p, float ax1, float ay1, float ax2, float ay2)
{
vec2 pos = rotate(radians(-80.0)) * p;
float c = Q((pos.x + ax1) / 9.0, pos.y + ay1, 0.03) * 100.0;
pos = rotate(radians(80.0)) * p;
c = min(c, Q((pos.x + ax2) / 9.0, pos.y + ay2, 0.03) * 100.0);
return c;
}
float G(vec2 p, float ax, float ay)
{
float c = Q((p.x - ax + 0.06) / 1.4, p.y + ay, 0.035) * 100.0;
c = min(c, Q((p.x - ax) / 2.0, p.y + ay + 0.2, 0.035) * 100.0);
c = min(c, Q((p.x - ax) / 2.0, p.y + ay - 0.2, 0.035) * 100.0);
c = min(c, Q((p.x - ax - 0.06) * 1.5, (p.y + ay) / 7.0, 0.035) * 100.0);
c = min(c, Q((p.x - ax + 0.045) / 0.6, (p.y + ay + 0.15) / 2.0, 0.035) * 100.0);
c = min(c, Q((p.x - ax + 0.05) / 0.6, (p.y + ay - 0.1) / 3.0, 0.035) * 100.0);
return c;
}
float N(vec2 p, float ax, float ay)
{
float c = Q((p.x - ax - 0.06) * 1.5, (p.y + ay) / 7.5, 0.035) * 100.0;
c = min(c, Q((p.x - ax + 0.1) * 1.5, (p.y + ay) / 7.5, 0.035) * 100.0);
vec2 pos = rotate(radians(-76.0)) * p;
c = min(c, Q((pos.x -0.43) / 9.5, pos.y + 0.36, 0.03) * 100.0);
return c;
}
float I(vec2 p, float ax, float ay)
{
float c = Q((p.x - ax - 0.06) * 1.5, (p.y + ay) / 7.3, 0.035) * 100.0;
c = min(c, Q((p.x - ax - 0.06) * 1.5, (p.y + ay + 0.33) / 1.0, 0.035) * 100.0);
return c;
}
float A(vec2 p, float ax1, float ay1, float ax2, float ay2, float ax3, float ay3)
{
vec2 pos = rotate(radians(-80.0)) * p;
float c = Q((pos.x + ax1) / 9.0, pos.y + ay1, 0.03) * 100.0;
pos = rotate(radians(80.0)) * p;
c = min(c, Q((pos.x + ax2) / 9.0, pos.y + ay2, 0.03) * 100.0);
c = min(c, Q((p.x + ax3) / 1.8, p.y + ay3, 0.035) * 100.0);
return c;
}
float F(vec2 p, float ax, float ay)
{
float c = Q((p.x - ax) / 2.0, p.y + ay, 0.035) * 100.0;
c = min(c, Q((p.x - ax) / 2.0, p.y + ay + 0.2, 0.035) * 100.0);
c = min(c, Q((p.x - ax - 0.06) * 1.5, (p.y + ay) / 7.0, 0.035) * 100.0);
return c;
}
float D(vec2 p, float ax, float ay)
{
float c = Q((p.x - ax - 0.02) / 1.8, p.y + ay + 0.2, 0.035) * 100.0;
c = min(c, Q((p.x - ax - 0.02) / 1.8, p.y + ay - 0.2, 0.035) * 100.0);
c = min(c, Q((p.x - ax - 0.06) * 1.5, (p.y + ay) / 7.0, 0.035) * 100.0);
c = min(c, Q((p.x - ax + 0.04) * 1.5, (p.y + ay) / 6.0, 0.035) * 100.0);
return c;
}
void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
vec2 p = 1.0 - 2.0 * fragCoord/iResolution.xy;
float c = E(p, 0.7, 0.5);
c = min(c, V(p, -0.58, -0.43, 0.42, 0.52));
c = min(c, G(p, 0.24, 0.5));
c = min(c, E(p, 0.0, 0.5));
c = min(c, N(p, -0.22, 0.5));
c = min(c, I(p, -0.5, 0.5));
c = min(c, I(p, -0.62, 0.5));
c = min(c, A(p, -0.35, 0.9, 0.62, -0.62, 0.76, 0.5));
c = min(c, F(p, 0.85, -0.2));
c = min(c, E(p, 0.65, -0.2));
c = min(c, D(p, 0.45, -0.2));
c = min(c, I(p, 0.25, -0.2));
c = min(c, A(p, 0.17, -0.12, -0.22, 0.15, -0.15, -0.2));
c = min(c, I(p, -0.1, -0.2));
c = min(c, E(p, -0.2, -0.2));
c = min(c, V(p, 0.26, 0.34, -0.11, -0.49));
c = min(c, A(p, 0.325, 0.69, -0.09, -0.65, 0.68, -0.2));
vec3 pic = vec3(1.0, 1.0, 0.0)*(-c);
fragColor = vec4(pic, 1.0);
}
```
Основной фигурой является прямоугольник. Буква представляет собой композицию различных прямоугольников. Для каждой уникальной буквы описана своя функция, задающая её, для облегчения составления слов, так как некоторые буквы повторяются.
4. [Портрет](https://www.shadertoy.com/view/7lsSzr)
```
float max_of_three(float a, float b, float c)
{
return max(a,max(b,c));
}
float L(vec2 p, vec2 P0, vec2 P1)
{
float a = -(P1.y-P0.y);
float b = (P1.x-P0.x);
float d = P0.x*P1.y- P0.y*P1.x;
float x = p.x;
float y = p.y;
return a*x + b*y + d;
}
float T(vec2 p, vec2 P0, vec2 P1, vec2 P2)
{
return max_of_three(
L(p, P0, P1),
L(p, P1, P2),
L(p, P2, P0)
);
}
void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
// digitalized my profile
vec2 P[62];
P[ 0] = vec2(0.8966 , 0.90457);
P[ 1] = vec2(0.83835, 0.94749);
P[ 2] = vec2(0.74804, 0.97120);
P[ 3] = vec2(0.60602, 0.97572);
P[ 4] = vec2(0.4928 , 0.96725);
P[ 5] = vec2(0.4038 , 0.95144);
P[ 6] = vec2(0.38416, 0.92716);
P[ 7] = vec2(0.31806, 0.88481);
P[ 8] = vec2(0.25131, 0.83682);
P[ 9] = vec2(0.22448, 0.80632);
P[10] = vec2(0.20484, 0.76906);
P[11] = vec2(0.18194, 0.70920);
P[12] = vec2(0.17343, 0.67871);
P[13] = vec2(0.1623 , 0.67476);
P[14] = vec2(0.16492, 0.65951);
P[15] = vec2(0.17277, 0.64766);
P[16] = vec2(0.1695 , 0.60757);
P[17] = vec2(0.17147, 0.58837);
P[18] = vec2(0.17081, 0.57199);
P[19] = vec2(0.1538 , 0.55167);
P[20] = vec2(0.11453, 0.50536);
P[21] = vec2(0.098822, 0.48447);
P[22] = vec2(0.088351, 0.47149);
P[23] = vec2(0.085733, 0.45850);
P[24] = vec2(0.092277, 0.44212);
P[25] = vec2(0.11584, 0.42292);
P[26] = vec2(0.13809, 0.41728);
P[27] = vec2(0.14529, 0.40599);
P[28] = vec2(0.14725, 0.39074);
P[29] = vec2(0.13743, 0.38340);
P[30] = vec2(0.12696, 0.37719);
P[31] = vec2(0.13089, 0.36533);
P[32] = vec2(0.14202, 0.35347);
P[33] = vec2(0.14463, 0.34557);
P[34] = vec2(0.13874, 0.33540);
P[35] = vec2(0.13416, 0.31903);
P[36] = vec2(0.14332, 0.30491);
P[37] = vec2(0.15641, 0.29814);
P[38] = vec2(0.16099, 0.28176);
P[39] = vec2(0.15903, 0.25861);
P[40] = vec2(0.1538 , 0.24111);
P[41] = vec2(0.15641, 0.22021);
P[42] = vec2(0.1767 , 0.19989);
P[43] = vec2(0.20681, 0.18521);
P[44] = vec2(0.25785, 0.17956);
P[45] = vec2(0.31872, 0.18012);
P[46] = vec2(0.37435, 0.17335);
P[47] = vec2(0.41623, 0.13043);
P[48] = vec2(0.44372, 0.098814);
P[49] = vec2(0.45681, 0.061547);
P[50] = vec2(0.47055, 0.023151);
P[51] = vec2(0.48429, -0.0062112);
vec2 p = 1.0 - 2.0* fragCoord/iResolution.xy;
vec2 m = 1.0 - 2.0* iMouse.xy/iResolution.xy;
float x = p.x * iResolution.x/iResolution.y;
float y = p.y ;
float mx = m.x * iResolution.x/iResolution.y;
float my = m.y ;
x/=mx;
y/=my;
p.x=x;
p.y=y;
float z = 1.0e25;
for(int i=0;i<51-3;i++)
z = min(z, T(p, P[i],P[i+1], P[i+3]) );
float f = 1.25/z;
vec3 col = vec3(1.0, 1.0, 1.0);
if(f >= 0.0)col.g = sin(iTime/10.0);
else col.r = f;
fragColor = vec4(col,1.0);
}
```
Координаты точек получены с помощью ресурса https://open-graphics-service.glitch.me/ . Положение портрета менятеся в зависимости от положения мыши.