# **Учебная практика 2022. Четверг 30.06** Мулярчук Владислава Сергеевна [TOC] # Отчет проделанной роботы: # Присутствовала конференции # *Задание №1* «canvas Графики f(x)» Создать хостинге replit.com html приложение, в котором реализовать на языке javascript класс Graph1D, предназначенный для расчета и отрисовки на канве (canvas) графиков вещественных функции ## Cсылка на роботу https://replit.com/@Vladislava-Sier/HighlevelWetInstance#script.js ## Код к роботе к странице javascript ```javascript= var ctx = my_canvas.getContext('2d'); var x = -10; var x_min = -10 var x_max = 10; var y_min = -10; var y_max = 10; var X = 0, Y = 0; var W = 256; var H = 256; function drawGraph() { draw(); for(X=0; X<W; X+=0.05) { x = x_min + (x_max-x_min)*X/W; let str = formula.value; y = eval(str); Y = H*(y-y_max)/(y_min-y_max); ctx.fillRect(X, Y, 1,1); } } function draw() { for(i = 1;i < Math.abs(y_min)+Math.abs(y_max);i++) { //горизонтальные линии ctx.moveTo(0, H*(Math.abs(i)/(Math.abs(y_min) + Math.abs(y_max)))); ctx.lineTo(W, H*(Math.abs(i)/(Math.abs(y_min) + Math.abs(y_max)))); ctx.stroke(); ctx.strokeStyle = "lightgreen"; } for(i = 1;i < Math.abs(x_min)+Math.abs(x_max);i++) { //вертикальные линии ctx.moveTo(W*(Math.abs(i)/(Math.abs(x_min) + Math.abs(x_max))), 0); ctx.lineTo(W*(Math.abs(i)/(Math.abs(x_min) + Math.abs(x_max))), H); ctx.stroke(); ctx.strokeStyle = "lightgreen"; } } ``` # *Задание №5 из файла 1 * математической визуализацией Автопортрета в профиль (автопортрет должен быть узнаваем - будет сравниваться с Вашим фото) ## Ссылка на роботу https://www.shadertoy.com/view/fsdfD7 ## Код к роботе ```glsl=1 float udSegment( in vec2 p, in vec2 a, in vec2 b ) { vec2 pa = p-a; vec2 ba = b-a; //ограниченое значение между двумя значениями которое считает скалярное произведение двух векторов и делит на другое скалярное произведение float h = clamp(dot(pa,ba) / dot(ba,ba), 0.0, 1.0 ); return length(pa-h*ba); } //из двух точек создаем линию float lineSegment(in vec2 p1, in vec2 p2, in vec2 sc) { //размер линий vec2 relocate = vec2(100., -100.); vec2 v1 = vec2( 80.* p1.x, -80. * p1.y); v1 += relocate; vec2 v2 = vec2(80. * p2.x, -80.0 * p2.y); v2 += relocate; return udSegment( sc, v2, v1 ); } void mainImage( out vec4 fragColor, in vec2 fragCoord ) //вывод и ввод { // массив из точок координаты которых взяли с помощью сайта vec2 points[24]; points[0] = vec2(2.4,0.77000); points[1] = vec2(3.03, 0.47000); points[2] = vec2(3.35, 0.16700); points[3] = vec2(3.38 ,-0.40000); points[4] = vec2(3.34 ,-0.62000); points[5] = vec2(3.46 ,-0.92000); points[6] = vec2(3.47 ,-0.99000); points[7] = vec2(3.33, -0.97000); points[8] = vec2(3.34 ,-1.1600); points[9] = vec2(3.28 , -1.1900); points[10] = vec2(3.29 ,-1.2600); points[11] = vec2(3.22 ,-1.3100); points[12] = vec2(3.17, -1.4700); points[13] = vec2(3.1 , -1.5300); points[14] = vec2(2.67 ,-1.5300); points[15] = vec2(2.48, -2.0400); points[16] = vec2(1.99 , -1.9700); points[17] = vec2(1.4 ,-2.1700); points [18] = vec2(1.15 , -2.5700); points[19] = vec2(0.94 , -2.5500); points [20] = vec2( 1.07 ,-2.0000); points [21] = vec2(1.58 , 0.17000); points [22] = vec2(2.04 , 0.65000); points [23] = vec2(2.4 , 0.73000); vec2 sc = vec2(fragCoord.x, iResolution.y - 2.*fragCoord.y); vec3 col = vec3(0,0,0); //толщина линии float thick = 3.; // соединяем точки в линии for(int i = 1; i < points.length(); ++i){ float d = lineSegment(points[i-1], points[i], sc) - thick; col += smoothstep(2.5,0.,d); //находим неизвестные промежуточные значения- интерполяция } fragColor = vec4(col,1.0); } ``` ## Результат и оригинал ![](https://i.imgur.com/3eT470Z.jpg) ![](https://i.imgur.com/jHNwOyv.png)