あとは、ネストされた 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 サイトの他の関連記事を参照してください。