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

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

Barbara Streisand
Barbara StreisandOriginal
2024-12-22 15:47:11166Durchsuche

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};

In Java

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

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)
);

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}};

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);

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);

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

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

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

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

oder

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

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;
}

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!

Stellungnahme:
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