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!