Maison > développement back-end > C++ > Expliquer les beignets comme les oreilles, vieille partie 3

Expliquer les beignets comme les oreilles, vieille partie 3

Barbara Streisand
Libérer: 2024-12-22 15:47:11
original
271 Les gens l'ont consulté

Explaining donut like ears old Part-3

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};
Copier après la connexion

En Java

singleRow circle = new singleRow(2 + Math.cos(theta), Math.sin(theta), 0);
Copier après la connexion

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)
);
Copier après la connexion

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}};
Copier après la connexion

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);
Copier après la connexion

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);
Copier après la connexion

Nous ferons un réciNz qui sera réciproque de Nz 5 (distance de la caméra)

float reciNz = 1 / (spinningDonut.a3 + 5);
Copier après la connexion
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;
Copier après la connexion

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
Copier après la connexion

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[] = ".,-~:;=!*#$@";
Copier après la connexion

ou

char[] charOpts = {'.', ',', '-', '~', ':', ';', '=', '!', '*', '#', '$', '@'};
Copier après la connexion

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;
}
Copier après la connexion

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!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal