Rumah > pembangunan bahagian belakang > C++ > Menjelaskan donat seperti telinga Part-Last)

Menjelaskan donat seperti telinga Part-Last)

DDD
Lepaskan: 2024-12-24 00:26:14
asal
963 orang telah melayarinya

Explaining donut like ears old Part-Last)

Kod lengkap untuk C ialah

#include <math.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>

typedef struct {
    double a1;
    double a2;
    double a3;
} singleRow;

typedef struct {
    singleRow a1;
    singleRow a2;
    singleRow a3;
} Matrix;

singleRow multiply(singleRow m1, Matrix m2) {
    singleRow res;
    res.a1 = m1.a1 * m2.a1.a1 + m1.a2 * m2.a2.a1 + m1.a3 * m2.a3.a1;
    res.a2 = m1.a1 * m2.a1.a2 + m1.a2 * m2.a2.a2 + m1.a3 * m2.a3.a2;
    res.a3 = m1.a1 * m2.a1.a3 + m1.a2 * m2.a2.a3 + m1.a3 * m2.a3.a3;
    return res;
}

int main() {
  int screen_width = 80, height = 22;
  char buffer[1760];
  float zBuffer[1760];
  float A = 0, B = 0;
  int R2 = 2, R1 = 1;
  printf("\x1b[2J");
  while (1) {
    memset(buffer, ' ', 1760);
    memset(zBuffer, 0, 7040);
      for (float theta = 0; theta < 6.28; theta += 0.07) {
        for (float phi = 0; phi < 6.28; phi += 0.02) {
          singleRow circle = {2 + cos(theta), sin(theta), 0};
          // 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}};

          singleRow donut = multiply(circle, Ry);
          singleRow rotateX = multiply(donut, Rx);
          // We will consider it as [Nx, Ny, Nz]
          singleRow spinningDonut = multiply(rotateX, Rz);
          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;

          int L = 8 * (spinningDonut.a2 - spinningDonut.a3 + 2 * cos(B) * sin(A) * sin(phi)
            - 2 * cos(phi) * cos(theta) * sin(B)
            - 2 * cos(phi) * sin(B)
            + 2 * cos(A) * sin(phi)
          );

          // donut luminicity will be seen by these characters
          // these 12
          char charOut[] = ".,-~:;=!*#$@";

          if (x < screen_width && y < height && zBuffer[o] < reciNz) {
            zBuffer[o] = reciNz;
            // If L < 0, . will be buffer
            buffer[o] = charOut[L > 0 ? L : 0];
          }
        }
      }
    // Clear screen
    printf("\x1b[H");
    for (int i = 0; i <1761; i++) {
      // On every 80th character, new line will be printed
      // If there's a reminder then buffer printed
      putchar(i % 80 ? buffer[i] : 10);
      A += 0.00004;
      B += 0.00002;
    }
    // Timer to slow down speed a bit
    usleep(10000);
  }
  return 0;
}
Salin selepas log masuk

Kod lengkap untuk Java ialah

import java.util.Arrays;

class singleRow {
  public double a1;
  public double a2;
  public double a3;
  public singleRow(double a1, double a2, double a3) {
    this.a1 = a1;
    this.a2 = a2;
    this.a3 = a3;
  }
}
class Matrix {
  public singleRow a1;
  public singleRow a2;
  public singleRow a3;
  public Matrix(singleRow a1, singleRow a2, singleRow a3) {
    this.a1 = new singleRow(a1.a1, a1.a2, a1.a3);
    this.a2 = new singleRow(a2.a1, a2.a2, a2.a3);
    this.a3 = new singleRow(a3.a1, a3.a2, a3.a3);
  }
  public static singleRow multiply(singleRow m1, Matrix m2) {
    singleRow res = new singleRow(0, 0, 0);
    res.a1 = (m1.a1 * m2.a1.a1) + (m1.a2 * m2.a2.a1) + (m1.a3 * m2.a3.a1);
    res.a2 = (m1.a1 * m2.a1.a2) + (m1.a2 * m2.a2.a2) + (m1.a3 * m2.a3.a2);
    res.a3 = (m1.a1 * m2.a1.a3) + (m1.a2 * m2.a2.a3) + (m1.a3 * m2.a3.a3);
    return res;
  }
}


public class Main {
public static void main() {
  int screen_width = 80, height = 22;
  char[] buffer = new char[1760];
  double[] zBuffer = new double[1760];
  double A = 0, B = 0;
  int R2 = 2, R1 = 1;
  System.out.print("\u001b[2J");
  while (true) {
    Arrays.fill(buffer, 0, 1760, ' ');
    Arrays.fill(zBuffer, 0, 1760, 0);
      for (float theta = 0; theta < 6.28; theta += 0.07) {
        for (float phi = 0; phi < 6.28; phi += 0.02) {
          singleRow circle = {2 + Math.cos(theta), Math.sin(theta), 0};
          // 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)
        );

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

          int L = 8 * (spinningDonut.a2 - spinningDonut.a3 
            + 2 * Math.cos(B) * Math.sin(A) * Math.sin(phi)
            - 2 * Math.cos(phi) * Math.cos(theta) * Math.sin(B)
            - 2 * Math.cos(phi) * Math.sin(B)
            + 2 * Math.cos(A) * Math.sin(phi)
          );

          // donut luminicity will be seen by these characters
          // these 12
          char[] charOpts = {'.', ',', '-', '~', ':', ';', '=', '!', '*', '#', '$', '@'};

          if (x < screen_width && y < height && zBuffer[o] < reciNz) {
            zBuffer[o] = reciNz;
            // If L < 0, . will be buffer
            buffer[o] = charOut[L > 0 ? L : 0];
          }
        }
      }
    // Clear screen
    System.out.print("\u001b[H");
    for (int i = 0; i <1761; i++) {
      // On every 80th character, new line will be printed
      // If there's a reminder then buffer printed
      System.out.print(i % 80 ? buffer[i] : 10);
      A += 0.00004;
      B += 0.00002;
    }
  }
}
}
Salin selepas log masuk

Atas ialah kandungan terperinci Menjelaskan donat seperti telinga Part-Last). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan