ホームページ >バックエンド開発 >C++ >昔の耳のようなドーナツを解説 その3

昔の耳のようなドーナツを解説 その3

Barbara Streisand
Barbara Streisandオリジナル
2024-12-22 15:47:11166ブラウズ

Explaining donut like ears old Part-3

あとは、ネストされた for ループ内で何が起こるかだけです
r1sin θ と r1cos θ

を見たことがあるかもしれません。

これらは 2D グラフで円を作成するために使用されます

円と円が重ならないように距離を保つための r2

それでは、r2 > r1 なぜなら、r2 は原点から円の中心まで始まるからです

ここで、圧倒的な行列の乗算を行うために、singleRow を作成します

C で

singleRow circle = {2 + cos(theta), sin(theta), 0};

Java の場合

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

次に、円とドーナツの回転に役立つ 3 つの行列 Ry、Rx、Rz を作成します

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

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

前に作成した乗算関数を使用すると、回転するドーナツ座標が得られます

C で

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

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

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

Nz 5 (カメラからの距離) の逆数となる reciNz を作成します

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 は 11 であるべきですが、今は 12 でいきます
30と15は何ですか? IDK
と reciNz を掛けます。なぜですか? IDK
ドーナツコードには未解決の謎が多すぎます

3D にするためには、一部を発光させる必要があります

そのためには、次のことを見つける必要があります
N = ニューヨーク - ニュージーランド
- 2 sinB cosϕ cosθ
- 2 sinB cosϕ
2 cosB sinA sinϕ
2 cosA sinϕ

N は 0 ~ √2 です
N に 8 を掛けると、最大 11 になります

int L = N * 8

輝度を指定して印刷するには、最低輝度から最高輝度までの文字の配列を作成します

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

または

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

いよいよ最後の部分です
次のことを確認してください:
×<画面幅
y レシピ> zBuffer[0]
「はい」の場合、

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

L が負の場合、charOpts[0]/period(.) を使用します

以上が昔の耳のようなドーナツを解説 その3の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。