Heim > Backend-Entwicklung > C++ > Erklärung der Donut-ähnlichen Ohren, Teil 3

Erklärung der Donut-ähnlichen Ohren, Teil 3

Barbara Streisand
Freigeben: 2024-12-22 15:47:11
Original
169 Leute haben es durchsucht

Explaining donut like ears old Part-3

Jetzt bleibt nur noch, was in der verschachtelten for-Schleife passiert
Sie haben vielleicht gesehen, dass r1sin θ und r1cos θ

Diese werden zum Erstellen eines Kreises in einem 2D-Diagramm verwendet

Und r2 um den Abstand zwischen den Kreisen einzuhalten, damit sie sich nicht überlappen

Also, r2 > r1, weil r2 vom Ursprung zum Mittelpunkt des Kreises beginnt

Um nun die überwältigende sichtbare Matrix zu multiplizieren, erstellen wir eine einzelne Zeile

In C

singleRow circle = {2 + cos(theta), sin(theta), 0};
Nach dem Login kopieren

In Java

singleRow circle = new singleRow(2 + Math.cos(theta), Math.sin(theta), 0);
Nach dem Login kopieren

Erstellen Sie nun 3 Matrix-Ry, Rx, Rz, die uns bei der Rotation von Kreis und Donut helfen werden

In 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)
);
Nach dem Login kopieren

In 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}};
Nach dem Login kopieren

Durch die Verwendung der Multiplikationsfunktion, die wir zuvor erstellt haben, erhalten wir rotierende Donut-Koordinaten

In C

singleRow donut = multiply(circle, Ry);
singleRow rotateX = multiply(donut, Rx);

// We will consider it as [Nx, Ny, Nz]
singleRow spinningDonut = multiply(rotateX, Rz);
Nach dem Login kopieren

In 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);
Nach dem Login kopieren

Wir werden reciNz erstellen, das reziprok zu Nz 5 (Abstand von der Kamera) ist

float reciNz = 1 / (spinningDonut.a3 + 5);
Nach dem Login kopieren
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;
Nach dem Login kopieren

screen_height / 2 hätte 11 sein sollen, aber wir bleiben vorerst bei 12
Was sind 30 und 15? IDK
und reciNz multiplizieren, warum? IDK
Donut-Code birgt zu viele ungelöste Rätsel

Um es nun in 3D zu machen, müssen wir einen Teil leuchtend machen

Dazu müssen wir etwas finden
N = Ny - Nz
- 2 sinB cosϕ cosθ
- 2 sinB cosϕ
2 cosB sinA sinϕ
2 cosA sinϕ

N liegt zwischen 0 und √2
Multiplizieren Sie nun N mit 8, was maximal 11 ergibt

int L = N * 8
Nach dem Login kopieren

Um es mit Leuchtkraft zu drucken, erstellen wir eine Reihe von Zeichen von der niedrigsten bis zur höchsten Leuchtkraft

char charOpts[] = ".,-~:;=!*#$@";
Nach dem Login kopieren

oder

char[] charOpts = {'.', ',', '-', '~', ':', ';', '=', '!', '*', '#', '$', '@'};
Nach dem Login kopieren

Jetzt der letzte Teil
Überprüfen Sie, ob:
x < Bildschirmbreite
y < Bildschirmhöhe
reciNz > zBuffer[0]
Wenn ja, dann

if (zBuffer[o] < reciNz && y < screen_height && x < screen_width) {
  buffer[o] = charOpts[L > 0 ? L : 0];
  zBuffer[o] = reciNz;
}
Nach dem Login kopieren

Wenn L negativ ist, verwenden Sie charOpts[0]/period(.)

Das obige ist der detaillierte Inhalt vonErklärung der Donut-ähnlichen Ohren, Teil 3. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:dev.to
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage