Now all that remains is what happens inside nested for-loop
You might have seen that r1sin θ and r1cos θ
These are used for making a circle in 2D graph
And r2 for keeping distance between circles so they don’t overlap
So, r2 > r1 because r2 starts from origin to centre of circle
Now, to do that overwhelming seen matrix multiply, we will create a singleRow
In C
singleRow circle = {2 + cos(theta), sin(theta), 0};singleRow circle = {2 + cos(theta), sin(theta), 0};singleRow circle = {2 + cos(theta), sin(theta), 0};
Enter fullscreen mode Exit fullscreen mode
In Java
<span>singleRow</span> <span>circle</span> <span>=</span> <span>new</span> <span>singleRow</span><span>(</span><span>2</span> <span>+</span> <span>Math</span><span>.</span><span>cos</span><span>(</span><span>theta</span><span>),</span> <span>Math</span><span>.</span><span>sin</span><span>(</span><span>theta</span><span>),</span> <span>0</span><span>);</span><span>singleRow</span> <span>circle</span> <span>=</span> <span>new</span> <span>singleRow</span><span>(</span><span>2</span> <span>+</span> <span>Math</span><span>.</span><span>cos</span><span>(</span><span>theta</span><span>),</span> <span>Math</span><span>.</span><span>sin</span><span>(</span><span>theta</span><span>),</span> <span>0</span><span>);</span>singleRow circle = new singleRow(2 + Math.cos(theta), Math.sin(theta), 0);
Enter fullscreen mode Exit fullscreen mode
Now make 3 matrix Ry, Rx, Rz that will help us in rotation of circle and donut
In Java
<span>// rotation on Y-axis</span><span>Matrix</span> <span>Ry</span> <span>=</span> <span>new</span> <span>Matrix</span><span>(</span><span>new</span> <span>singleRow</span><span>(</span><span>Math</span><span>.</span><span>cos</span><span>(</span><span>phi</span><span>),</span> <span>0</span><span>,</span> <span>Math</span><span>.</span><span>sin</span><span>(</span><span>phi</span><span>)),</span><span>new</span> <span>singleRow</span><span>(</span><span>0</span><span>,</span> <span>1</span><span>,</span> <span>0</span><span>),</span><span>new</span> <span>singleRow</span><span>(-</span><span>Math</span><span>.</span><span>sin</span><span>(</span><span>phi</span><span>),</span> <span>0</span><span>,</span> <span>Math</span><span>.</span><span>cos</span><span>(</span><span>phi</span><span>))</span><span>);</span><span>// rotation on X-axis</span><span>Matrix</span> <span>Rx</span> <span>=</span> <span>new</span> <span>Matrix</span><span>(</span><span>new</span> <span>singleRow</span><span>(</span><span>1</span><span>,</span> <span>0</span><span>,</span> <span>0</span><span>),</span><span>new</span> <span>singleRow</span><span>(</span><span>0</span><span>,</span> <span>Math</span><span>.</span><span>cos</span><span>(</span><span>A</span><span>),</span> <span>Math</span><span>.</span><span>sin</span><span>(</span><span>A</span><span>)),</span><span>new</span> <span>singleRow</span><span>(</span><span>0</span><span>,</span> <span>-</span><span>Math</span><span>.</span><span>sin</span><span>(</span><span>A</span><span>),</span> <span>Math</span><span>.</span><span>cos</span><span>(</span><span>A</span><span>))</span><span>);</span><span>// rotation on Z-axis</span><span>Matrix</span> <span>Rz</span> <span>=</span> <span>new</span> <span>Matrix</span><span>(</span><span>new</span> <span>singleRow</span><span>(</span><span>Math</span><span>.</span><span>cos</span><span>(</span><span>B</span><span>),</span> <span>Math</span><span>.</span><span>sin</span><span>(</span><span>B</span><span>),</span> <span>0</span><span>),</span><span>new</span> <span>singleRow</span><span>(-</span><span>Math</span><span>.</span><span>sin</span><span>(</span><span>B</span><span>),</span> <span>Math</span><span>.</span><span>cos</span><span>(</span><span>B</span><span>),</span> <span>0</span><span>),</span><span>new</span> <span>singleRow</span><span>(</span><span>0</span><span>,</span> <span>0</span><span>,</span> <span>1</span><span>)</span><span>);</span><span>// rotation on Y-axis</span> <span>Matrix</span> <span>Ry</span> <span>=</span> <span>new</span> <span>Matrix</span><span>(</span> <span>new</span> <span>singleRow</span><span>(</span><span>Math</span><span>.</span><span>cos</span><span>(</span><span>phi</span><span>),</span> <span>0</span><span>,</span> <span>Math</span><span>.</span><span>sin</span><span>(</span><span>phi</span><span>)),</span> <span>new</span> <span>singleRow</span><span>(</span><span>0</span><span>,</span> <span>1</span><span>,</span> <span>0</span><span>),</span> <span>new</span> <span>singleRow</span><span>(-</span><span>Math</span><span>.</span><span>sin</span><span>(</span><span>phi</span><span>),</span> <span>0</span><span>,</span> <span>Math</span><span>.</span><span>cos</span><span>(</span><span>phi</span><span>))</span> <span>);</span> <span>// rotation on X-axis</span> <span>Matrix</span> <span>Rx</span> <span>=</span> <span>new</span> <span>Matrix</span><span>(</span> <span>new</span> <span>singleRow</span><span>(</span><span>1</span><span>,</span> <span>0</span><span>,</span> <span>0</span><span>),</span> <span>new</span> <span>singleRow</span><span>(</span><span>0</span><span>,</span> <span>Math</span><span>.</span><span>cos</span><span>(</span><span>A</span><span>),</span> <span>Math</span><span>.</span><span>sin</span><span>(</span><span>A</span><span>)),</span> <span>new</span> <span>singleRow</span><span>(</span><span>0</span><span>,</span> <span>-</span><span>Math</span><span>.</span><span>sin</span><span>(</span><span>A</span><span>),</span> <span>Math</span><span>.</span><span>cos</span><span>(</span><span>A</span><span>))</span> <span>);</span> <span>// rotation on Z-axis</span> <span>Matrix</span> <span>Rz</span> <span>=</span> <span>new</span> <span>Matrix</span><span>(</span> <span>new</span> <span>singleRow</span><span>(</span><span>Math</span><span>.</span><span>cos</span><span>(</span><span>B</span><span>),</span> <span>Math</span><span>.</span><span>sin</span><span>(</span><span>B</span><span>),</span> <span>0</span><span>),</span> <span>new</span> <span>singleRow</span><span>(-</span><span>Math</span><span>.</span><span>sin</span><span>(</span><span>B</span><span>),</span> <span>Math</span><span>.</span><span>cos</span><span>(</span><span>B</span><span>),</span> <span>0</span><span>),</span> <span>new</span> <span>singleRow</span><span>(</span><span>0</span><span>,</span> <span>0</span><span>,</span> <span>1</span><span>)</span> <span>);</span>// rotation on Y-axis Matrix Ry = new Matrix( new singleRow(Math.cos(phi), 0, Math.sin(phi)), new singleRow(0, 1, 0), new singleRow(-Math.sin(phi), 0, Math.cos(phi)) ); // rotation on X-axis Matrix Rx = new Matrix( new singleRow(1, 0, 0), new singleRow(0, Math.cos(A), Math.sin(A)), new singleRow(0, -Math.sin(A), Math.cos(A)) ); // rotation on Z-axis Matrix Rz = new Matrix( new singleRow(Math.cos(B), Math.sin(B), 0), new singleRow(-Math.sin(B), Math.cos(B), 0), new singleRow(0, 0, 1) );
Enter fullscreen mode Exit fullscreen mode
In C
<span>// rotation on Y-axis</span><span>Matrix</span> <span>Ry</span> <span>=</span> <span>{{</span><span>cos</span><span>(</span><span>phi</span><span>),</span> <span>0</span><span>,</span> <span>sin</span><span>(</span><span>phi</span><span>)},</span> <span>{</span><span>0</span><span>,</span> <span>1</span><span>,</span> <span>0</span><span>},</span> <span>{</span><span>-</span><span>sin</span><span>(</span><span>phi</span><span>),</span> <span>0</span><span>,</span> <span>cos</span><span>(</span><span>phi</span><span>)}};</span><span>// rotation on X-axis</span><span>Matrix</span> <span>Rx</span> <span>=</span> <span>{{</span><span>1</span><span>,</span> <span>0</span><span>,</span> <span>0</span><span>},</span> <span>{</span><span>0</span><span>,</span> <span>cos</span><span>(</span><span>A</span><span>),</span> <span>sin</span><span>(</span><span>A</span><span>)},</span> <span>{</span><span>0</span><span>,</span> <span>-</span><span>sin</span><span>(</span><span>A</span><span>),</span> <span>cos</span><span>(</span><span>A</span><span>)}};</span><span>// rotation on Z-axis</span><span>Matrix</span> <span>Rz</span> <span>=</span> <span>{{</span><span>cos</span><span>(</span><span>B</span><span>),</span> <span>sin</span><span>(</span><span>B</span><span>),</span> <span>0</span><span>},</span> <span>{</span><span>-</span><span>sin</span><span>(</span><span>B</span><span>),</span> <span>cos</span><span>(</span><span>B</span><span>),</span> <span>0</span><span>},</span> <span>{</span><span>0</span><span>,</span> <span>0</span><span>,</span> <span>1</span><span>}};</span><span>// rotation on Y-axis</span> <span>Matrix</span> <span>Ry</span> <span>=</span> <span>{{</span><span>cos</span><span>(</span><span>phi</span><span>),</span> <span>0</span><span>,</span> <span>sin</span><span>(</span><span>phi</span><span>)},</span> <span>{</span><span>0</span><span>,</span> <span>1</span><span>,</span> <span>0</span><span>},</span> <span>{</span><span>-</span><span>sin</span><span>(</span><span>phi</span><span>),</span> <span>0</span><span>,</span> <span>cos</span><span>(</span><span>phi</span><span>)}};</span> <span>// rotation on X-axis</span> <span>Matrix</span> <span>Rx</span> <span>=</span> <span>{{</span><span>1</span><span>,</span> <span>0</span><span>,</span> <span>0</span><span>},</span> <span>{</span><span>0</span><span>,</span> <span>cos</span><span>(</span><span>A</span><span>),</span> <span>sin</span><span>(</span><span>A</span><span>)},</span> <span>{</span><span>0</span><span>,</span> <span>-</span><span>sin</span><span>(</span><span>A</span><span>),</span> <span>cos</span><span>(</span><span>A</span><span>)}};</span> <span>// rotation on Z-axis</span> <span>Matrix</span> <span>Rz</span> <span>=</span> <span>{{</span><span>cos</span><span>(</span><span>B</span><span>),</span> <span>sin</span><span>(</span><span>B</span><span>),</span> <span>0</span><span>},</span> <span>{</span><span>-</span><span>sin</span><span>(</span><span>B</span><span>),</span> <span>cos</span><span>(</span><span>B</span><span>),</span> <span>0</span><span>},</span> <span>{</span><span>0</span><span>,</span> <span>0</span><span>,</span> <span>1</span><span>}};</span>// rotation on Y-axis Matrix Ry = {{cos(phi), 0, sin(phi)}, {0, 1, 0}, {-sin(phi), 0, cos(phi)}}; // rotation on X-axis Matrix Rx = {{1, 0, 0}, {0, cos(A), sin(A)}, {0, -sin(A), cos(A)}}; // rotation on Z-axis Matrix Rz = {{cos(B), sin(B), 0}, {-sin(B), cos(B), 0}, {0, 0, 1}};
Enter fullscreen mode Exit fullscreen mode
On using multiply function, we created previously, we will get spinning donut coordinates
In C
<span>singleRow</span> <span>donut</span> <span>=</span> <span>multiply</span><span>(</span><span>circle</span><span>,</span> <span>Ry</span><span>);</span><span>singleRow</span> <span>rotateX</span> <span>=</span> <span>multiply</span><span>(</span><span>donut</span><span>,</span> <span>Rx</span><span>);</span><span>// We will consider it as [Nx, Ny, Nz]</span><span>singleRow</span> <span>spinningDonut</span> <span>=</span> <span>multiply</span><span>(</span><span>rotateX</span><span>,</span> <span>Rz</span><span>);</span><span>singleRow</span> <span>donut</span> <span>=</span> <span>multiply</span><span>(</span><span>circle</span><span>,</span> <span>Ry</span><span>);</span> <span>singleRow</span> <span>rotateX</span> <span>=</span> <span>multiply</span><span>(</span><span>donut</span><span>,</span> <span>Rx</span><span>);</span> <span>// We will consider it as [Nx, Ny, Nz]</span> <span>singleRow</span> <span>spinningDonut</span> <span>=</span> <span>multiply</span><span>(</span><span>rotateX</span><span>,</span> <span>Rz</span><span>);</span>singleRow donut = multiply(circle, Ry); singleRow rotateX = multiply(donut, Rx); // We will consider it as [Nx, Ny, Nz] singleRow spinningDonut = multiply(rotateX, Rz);
Enter fullscreen mode Exit fullscreen mode
In Java
<span>singleRow</span> <span>donut</span> <span>=</span> <span>Matrix</span><span>.</span><span>multiply</span><span>(</span><span>circle</span><span>,</span> <span>Ry</span><span>);</span><span>singleRow</span> <span>rotateX</span> <span>=</span> <span>Matrix</span><span>.</span><span>multiply</span><span>(</span><span>donut</span><span>,</span> <span>Rx</span><span>);</span><span>// We will consider it as [Nx, Ny, Nz]</span><span>singleRow</span> <span>spinningDonut</span> <span>=</span> <span>Matrix</span><span>.</span><span>multiply</span><span>(</span><span>rotateX</span><span>,</span> <span>Rz</span><span>);</span><span>singleRow</span> <span>donut</span> <span>=</span> <span>Matrix</span><span>.</span><span>multiply</span><span>(</span><span>circle</span><span>,</span> <span>Ry</span><span>);</span> <span>singleRow</span> <span>rotateX</span> <span>=</span> <span>Matrix</span><span>.</span><span>multiply</span><span>(</span><span>donut</span><span>,</span> <span>Rx</span><span>);</span> <span>// We will consider it as [Nx, Ny, Nz]</span> <span>singleRow</span> <span>spinningDonut</span> <span>=</span> <span>Matrix</span><span>.</span><span>multiply</span><span>(</span><span>rotateX</span><span>,</span> <span>Rz</span><span>);</span>singleRow donut = Matrix.multiply(circle, Ry); singleRow rotateX = Matrix.multiply(donut, Rx); // We will consider it as [Nx, Ny, Nz] singleRow spinningDonut = Matrix.multiply(rotateX, Rz);
Enter fullscreen mode Exit fullscreen mode
We will make reciNz which will be reciprocal of Nz + 5 (distance from camera)
<span>float</span> <span>reciNz</span> <span>=</span> <span>1</span> <span>/</span> <span>(</span><span>spinningDonut</span><span>.</span><span>a3</span> <span>+</span> <span>5</span><span>);</span><span>float</span> <span>reciNz</span> <span>=</span> <span>1</span> <span>/</span> <span>(</span><span>spinningDonut</span><span>.</span><span>a3</span> <span>+</span> <span>5</span><span>);</span>float reciNz = 1 / (spinningDonut.a3 + 5);
Enter fullscreen mode Exit fullscreen mode
int x = 40 + 30 * spinningDonut.a1 * reciNz;int y = 12 + 15 * spinningDonut.a2 * reciNz;// o is index of current bufferint o = x + screen_width * y;int x = 40 + 30 * spinningDonut.a1 * reciNz; int y = 12 + 15 * spinningDonut.a2 * reciNz; // o is index of current buffer int o = x + screen_width * y;int x = 40 + 30 * spinningDonut.a1 * reciNz; int y = 12 + 15 * spinningDonut.a2 * reciNz; // o is index of current buffer int o = x + screen_width * y;
Enter fullscreen mode Exit fullscreen mode
screen_height / 2 should have been 11 but we will go with 12 for Now
what are 30 and 15? IDK
and multiply reciNz, why? IDK
Donut code has too many unsolved mysteries
Now to find make it 3D, we need to some part luminous
For that, we need to find
N = Ny – Nz
– 2 sinB cosϕ cosθ
– 2 sinB cosϕ
+ 2 cosB sinA sinϕ
+ 2 cosA sinϕ
N is between 0 to √2
Now multiply N by 8 which will be to max 11
<span>int</span> <span>L</span> <span>=</span> <span>N</span> <span>*</span> <span>8</span><span>int</span> <span>L</span> <span>=</span> <span>N</span> <span>*</span> <span>8</span>int L = N * 8
Enter fullscreen mode Exit fullscreen mode
To print it with luminacity, we will create an array of character from lowest to highest luminacity
<span>char</span> <span>charOpts</span><span>[]</span> <span>=</span> <span>".,-~:;=!*#$@"</span><span>;</span><span>char</span> <span>charOpts</span><span>[]</span> <span>=</span> <span>".,-~:;=!*#$@"</span><span>;</span>char charOpts[] = ".,-~:;=!*#$@";
Enter fullscreen mode Exit fullscreen mode
or
<span>char</span><span>[]</span> <span>charOpts</span> <span>=</span> <span>{</span><span>'.'</span><span>,</span> <span>','</span><span>,</span> <span>'-'</span><span>,</span> <span>'~'</span><span>,</span> <span>':'</span><span>,</span> <span>';'</span><span>,</span> <span>'='</span><span>,</span> <span>'!'</span><span>,</span> <span>'*'</span><span>,</span> <span>'#'</span><span>,</span> <span>'$'</span><span>,</span> <span>'@'</span><span>};</span><span>char</span><span>[]</span> <span>charOpts</span> <span>=</span> <span>{</span><span>'.'</span><span>,</span> <span>','</span><span>,</span> <span>'-'</span><span>,</span> <span>'~'</span><span>,</span> <span>':'</span><span>,</span> <span>';'</span><span>,</span> <span>'='</span><span>,</span> <span>'!'</span><span>,</span> <span>'*'</span><span>,</span> <span>'#'</span><span>,</span> <span>'$'</span><span>,</span> <span>'@'</span><span>};</span>char[] charOpts = {'.', ',', '-', '~', ':', ';', '=', '!', '*', '#', '$', '@'};
Enter fullscreen mode Exit fullscreen mode
Now the last part
check if:
x < screen width
y < screen height
reciNz > zBuffer[0]
If yes, then
<span>if</span> <span>(</span><span>zBuffer</span><span>[</span><span>o</span><span>]</span> <span><</span> <span>reciNz</span> <span>&&</span> <span>y</span> <span><</span> <span>screen_height</span> <span>&&</span> <span>x</span> <span><</span> <span>screen_width</span><span>)</span> <span>{</span><span>buffer</span><span>[</span><span>o</span><span>]</span> <span>=</span> <span>charOpts</span><span>[</span><span>L</span> <span>></span> <span>0</span> <span>?</span> <span>L</span> <span>:</span> <span>0</span><span>];</span><span>zBuffer</span><span>[</span><span>o</span><span>]</span> <span>=</span> <span>reciNz</span><span>;</span><span>}</span><span>if</span> <span>(</span><span>zBuffer</span><span>[</span><span>o</span><span>]</span> <span><</span> <span>reciNz</span> <span>&&</span> <span>y</span> <span><</span> <span>screen_height</span> <span>&&</span> <span>x</span> <span><</span> <span>screen_width</span><span>)</span> <span>{</span> <span>buffer</span><span>[</span><span>o</span><span>]</span> <span>=</span> <span>charOpts</span><span>[</span><span>L</span> <span>></span> <span>0</span> <span>?</span> <span>L</span> <span>:</span> <span>0</span><span>];</span> <span>zBuffer</span><span>[</span><span>o</span><span>]</span> <span>=</span> <span>reciNz</span><span>;</span> <span>}</span>if (zBuffer[o] < reciNz && y < screen_height && x < screen_width) { buffer[o] = charOpts[L > 0 ? L : 0]; zBuffer[o] = reciNz; }
Enter fullscreen mode Exit fullscreen mode
If L is negative, use charOpts[0]/ period(.)
暂无评论内容