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
170 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!

source:dev.to
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