Maintenant, il ne reste plus que ce qui se passe à l'intérieur d'une boucle for imbriquée
Vous avez peut-être vu que r1sin θ et r1cos θ
Ceux-ci sont utilisés pour créer un cercle dans un graphique 2D
Et r2 pour garder la distance entre les cercles afin qu'ils ne se chevauchent pas
Donc, r2> r1 car r2 commence de l'origine au centre du cercle
Maintenant, pour multiplier cette matrice écrasante vue, nous allons créer une seule ligne
En C
singleRow circle = {2 + cos(theta), sin(theta), 0};
En Java
singleRow circle = new singleRow(2 + Math.cos(theta), Math.sin(theta), 0);
Réalisez maintenant 3 matrices Ry, Rx, Rz qui nous aideront dans la rotation du cercle et du beignet
En Java
// 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) );
En C
// 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}};
En utilisant la fonction de multiplication, que nous avons créée précédemment, nous obtiendrons les coordonnées du beignet en rotation
En C
singleRow donut = multiply(circle, Ry); singleRow rotateX = multiply(donut, Rx); // We will consider it as [Nx, Ny, Nz] singleRow spinningDonut = multiply(rotateX, Rz);
En Java
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);
Nous ferons un réciNz qui sera réciproque de Nz 5 (distance de la caméra)
float reciNz = 1 / (spinningDonut.a3 + 5);
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;
screen_height / 2 aurait dû être 11 mais nous irons avec 12 pour l'instant
que font 30 et 15 ? IDK
et multiplier recinz, pourquoi ? IDK
Le code Donut a trop de mystères non résolus
Maintenant, pour trouver le rendu 3D, nous avons besoin d'une partie lumineuse
Pour cela, il faut trouver
N = Ny - Nz
- 2 sinB cosϕ cosθ
- 2 sinB cosϕ
2 cosB sinA sinϕ
2 cosA sinϕ
N est compris entre 0 et √2
Maintenant, multipliez N par 8, ce qui sera au maximum 11
int L = N * 8
Pour l'imprimer avec luminosité, nous allons créer un tableau de caractères de la luminosité la plus basse à la plus élevée
char charOpts[] = ".,-~:;=!*#$@";
ou
char[] charOpts = {'.', ',', '-', '~', ':', ';', '=', '!', '*', '#', '$', '@'};
Maintenant la dernière partie
vérifiez si :
x &Lt ; largeur de l'écran
y &Lt ; hauteur de l'écran
reciNz > zBuffer[0]
Si oui, alors
if (zBuffer[o] < reciNz && y < screen_height && x < screen_width) { buffer[o] = charOpts[L > 0 ? L : 0]; zBuffer[o] = reciNz; }
Si L est négatif, utilisez charOpts[0]/ period(.)
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!