Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <html>
- <head>
- <meta charset="utf-8">
- <title>7 Лаба</title>
- </head>
- <body>
- <style>
- body
- {
- background: #C5D0E6
- }
- canvas
- {
- display: block;
- margin: auto auto;
- border: 1px solid #04112F;
- background: #CBB6CE;
- }
- </style>
- <canvas id='canvas' width='500' height='500'></canvas>
- <script>
- let c = document.getElementById("canvas");
- let ctx = c.getContext('2d');
- var vertices = [];
- var vertices1 = [];
- var a = [];
- var context, imData;
- const Point = function (x, y, z) {
- this.x = x;
- this.y = y;
- this.z = z;
- };
- function Pixel(color)
- {
- imgData = ctx.createImageData(1, 1);
- imgData.data[0] = color.r;
- imgData.data[1] = color.g;
- imgData.data[2] = color.b;
- imgData.data[3] = color.a;
- }
- let pyramid = [ [200, 40, 500], //A
- [390, 240, 500], //B
- [150, 184, 500], //C
- [350, 181, 550]]; //D
- let octahedron = [[200, 150, 100], //A
- [100, 275, 0], //B
- [230, 275, 0], //C
- [300, 275, 150], //D
- [100, 275, 150], //E
- [200, 400, 100]]; //F
- function Grafic() {
- // Pyramid
- vertices.push(new Point(...pyramid[0]));//A
- vertices.push(new Point(...pyramid[1]));//B
- vertices.push(new Point(...pyramid[2]));//C
- vertices.push(new Point(...pyramid[3]));//D
- //(ABC)
- Z_buf(vertices[0], vertices[1], vertices[2], {r: 165, g: 12, b: 15, a: 250});
- //(ACD)
- Z_buf(vertices[0], vertices[2], vertices[3], {r: 255, g: 25, b: 9, a: 255});
- //(ABD)
- Z_buf(vertices[0], vertices[1], vertices[3], {r: 2, g: 2, b: 5, a: 255});
- //(BCD)
- Z_buf(vertices[1], vertices[2], vertices[3], {r: 229, g: 102, b: 153, a: 255});
- //Octahedron
- vertices1.push(new Point(...octahedron[0]));//A
- vertices1.push(new Point(...octahedron[1]));//B
- vertices1.push(new Point(...octahedron[2]));//C
- vertices1.push(new Point(...octahedron[3]));//D
- vertices1.push(new Point(...octahedron[4]));//E
- vertices1.push(new Point(...octahedron[5]));//F
- //(ABC)
- Z_buf(vertices1[0], vertices1[1], vertices1[2], {r: 0, g: 0, b: 0, a: 250});
- //(ACD)
- Z_buf(vertices1[0], vertices1[2], vertices1[3], {r: 51, g: 47, b: 44, a: 255});
- //(ADE)
- Z_buf(vertices1[0], vertices1[3], vertices1[4], {r: 0, g: 255, b: 0, a: 255});
- //(AEB)
- Z_buf(vertices1[0], vertices1[4], vertices1[1], {r: 0, g: 255, b: 255, a: 255});
- //(FBC)
- Z_buf(vertices1[5], vertices1[1], vertices1[2], {r: 255, g: 0, b: 0, a: 250});
- //(FCD)
- Z_buf(vertices1[5], vertices1[2], vertices1[3], {r: 155, g: 45, b: 48, a: 255});
- //(FDE)
- Z_buf(vertices1[5], vertices1[3], vertices1[4], {r: 255, g: 255, b: 0, a: 255});
- //(FEB)
- Z_buf(vertices1[5], vertices1[4], vertices1[1], {r: 251, g: 215, b: 155, a: 255});
- }
- // алгоритм Z-буфера реализую с помощью растеризации треугольника
- function Z_buf(b1, b2, b3, color)
- {
- var foc = 500000;
- var dx13, dx12, dx23;
- var dz13, dz12, dz23;
- var kz, bz;
- // упорядочиваем координаты по значению y
- if (b2.y < b1.y)
- {
- [b1.y, b2.y] = [b2.y, b1.y];
- [b1.x, b2.x] = [b2.x, b1.x];
- [b1.z, b2.z] = [b2.z, b1.z];
- }
- if (b3.y < b1.y)
- {
- [b1.y, b3.y] = [b3.y, b1.y];
- [b1.x, b3.x] = [b3.x, b1.x];
- [b1.z, b3.z] = [b3.z, b1.z];
- }
- if (b3.y < b2.y)
- {
- [b2.y, b3.y] = [b3.y, b2.y];
- [b2.x, b3.x] = [b3.x, b2.x];
- [b2.z, b3.z] = [b3.z, b2.z];
- }
- // нахождение приращения
- if (b3.y != b1.y)
- {
- dx13 = Math.trunc(b3.x - b1.x);
- dx13 /= (b3.y - b1.y);
- dz13 = Math.trunc(b3.z - b1.z);
- dz13 /= (b3.y - b1.y);
- }
- else
- {
- dx13 = 0;
- dz13 = 0;
- }
- if (b2.y != b1.y)
- {
- dx12 = Math.trunc(b2.x - b1.x);
- dx12 /= (b2.y - b1.y);
- dz12 = Math.trunc(b2.z - b1.z);
- dz12 /= (b2.y - b1.y);
- }
- else
- {
- dx12 = 0;
- dz12 = 0;
- }
- if (b3.y != b2.y)
- {
- dx23 = Math.trunc(b3.x - b2.x);
- dx23 /= (b3.y - b2.y);
- dz23 = Math.trunc(b3.z - b2.z);
- dz23 /= (b3.y - b2.y);
- }
- else
- {
- dx23 = 0;
- dz23 = 0;
- }
- var wx1 = Math.trunc(b1.x);
- var wx2 = wx1;
- var _dx13 = dx13;
- var wz1 = Math.trunc(b1.z);
- var wz2 = wz1;
- var _dz13 = dz13;
- // упорядочиваем приращения
- if (dx13 > dx12)
- [dx13, dx12] = [dx12, dx13];
- if (dz13 > dz12)
- [dz13, dz12] = [dz12, dz13];
- // первый полутреугольник
- for (var i = b1.y; i < b2.y; i++)
- {
- kz =(wz1 - wz2) / (wx1 - wx2);
- bz = wz2 - (kz * wx2);
- for (var j = Math.trunc(wx1); j <= Math.trunc(wx2); j++)
- {
- z_gr = j * kz + bz; // находим значения z через уравнение прямой z=kz*x+bz
- //алгоритм z-буфера
- if (a[i][j] > z_gr)
- {
- a[i][j] = z_gr;
- //x_gr y_gr - перспективная проекция получится при очень большом foc
- x_gr = Math.round(foc * j / (z_gr + foc));
- y_gr = Math.round(foc * i / (z_gr + foc));
- Pixel(color);
- ctx.putImageData(imgData, x_gr, y_gr);
- }
- }
- wx1 += dx13;
- wx2 += dx12;
- wz1 += dz13;
- wz2 += dz12;
- }
- //случай когда верхнего треугольника нет
- if (b1.y == b2.y)
- {
- wx1 = Math.trunc(b1.x);
- wx2 = Math.trunc(b2.x);
- wz1 = Math.trunc(b1.z);
- wz2 = Math.trunc(b2.z);
- }
- // упорядочиваем приращения
- if (_dx13 < dx23)
- [_dx13, dx23] = [dx23, _dx13];
- if (_dz13 < dz23)
- [_dz13, dz23] = [dz23, _dz13];
- //(второй полутреугольник) совершаем те же действия, что и для первого полутреугольника
- for (var i = b2.y; i <= b3.y; i++)
- {
- kz =(wz1 - wz2) / (wx1 - wx2);
- bz = wz2 - (kz * wx2);
- for (var j = Math.trunc(wx1); j <= Math.trunc(wx2); j++)
- {
- z_gr = j * kz + bz;
- if (a[i][j] > z_gr)
- {
- a[i][j] = z_gr;
- x_gr = Math.round(foc * j / (z_gr + foc));
- y_gr = Math.round(foc * i / (z_gr + foc));
- Pixel(color);
- ctx.putImageData(imgData, x_gr, y_gr);
- }
- }
- wx1 += _dx13;
- wx2 += dx23;
- wz1 += _dz13;
- wz2 += dz23;
- }
- }
- ctx.strokeStyle = "#4682B4";
- ctx.strokeRect(0, 0, 500, 500);
- for (var i = 0; i < 1500; i++)
- {
- a[i] = [];
- for (var j = 0; j < 1500; j++)
- a[i][j] = 10000000;
- }
- Grafic();
- </script>
- </body>
- </html>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement