AWin *w = aOpenWin(640, 480, "3dwave");
int r, x, y, gx[42][42], gy[42][42];
for (r = 0; AWin_isClose(w) == 0; r--) {
aFillRect(w, 640, 480, 0, 0, 0x000000);
for (y = -20; y <= 21; y++) {
for (x = -20; x <= 21; x++) {
float d = sqrt(x * x + y * y), z = sin(r * 0.1 + d) * 50 / (d + 5);
int x0 = x + 19, y0 = y + 19, x1 = x + 20, y1 = y + 20;
gx[y1][x1] = (x * 2 - y * 2 + z * 0) * 4 + 320;
gy[y1][x1] = (x * 2 + y * 2 + z * 1) * 2 + 240;
if (x0 >= 0 && y0 >= 0) {
aDrawLine(w, gx[y0][x0], gy[y0][x0], gx[y0][x1], gy[y0][x1], 0x00ffff);
aDrawLine(w, gx[y0][x0], gy[y0][x0], gx[y1][x0], gy[y1][x0], 0x00ffff); }}}
aWait(8); }

static int sqr[24] = { 7,6,2,3, 6,4,0,2, 1,0,4,5, 7,3,1,5, 3,2,0,1, 7,5,4,6 };
int vertx[8], verty[8], vertz[8], vx[8], vy[8], vz[8], sx[8], sy[8];
int centerz[7], buf0[160], buf1[160], thx, thy, thz, xp, xa, yp, ya, zp, za, xt, yt, zt, t;
AWin *w = aOpenWin(256, 160, "kcube-i"); int ymin, ymax, x, y, c, dx, *buf, y1;
for (i = 0; i < 8; i++) {
vertx[i] = ( (i >> 2) * 2 - 1) * 50;
verty[i] = (((i >> 1) & 1) * 2 - 1) * 50;
vertz[i] = (( i & 1) * 2 - 1) * 50; }
for (thx = thy = thz = 0; AWin_isClose(w) == 0; ) {
thx = thx + 182; xp = aFf16Cos(thx); xa = aFf16Sin(thx);
thy = thy + 273; yp = aFf16Cos(thy); ya = aFf16Sin(thy);
thz = thz + 364; zp = aFf16Cos(thz); za = aFf16Sin(thz);
for (i = 0; i < 8; i++) {
zt = vertz[i] * xp + verty[i] * xa; // x軸の周りに回す.
yt = verty[i] * xp - vertz[i] * xa;
xt = vertx[i] * yp + aMul64Shr(zt, ya, 16); // y軸の周りに回す.
vz[i] = aMul64Shr(zt, yp, 16) - vertx[i] * ya;
vx[i] = aMul64Shr(xt, zp, 16) - aMul64Shr(yt, za, 16); // z軸の周りに回す.
vy[i] = aMul64Shr(yt, zp, 16) + aMul64Shr(xt, za, 16);
t = 9830400 / ((vz[i] + 26214400) >> 16);
sx[i] = aMul64Shr(vx[i], t, 31) + 128;
sy[i] = aMul64Shr(vy[i], t, 31) + 80; }
for (l = 0; l < 6 * 4; l += 4) {
centerz[l / 4] = vz[sqr[l]] + vz[sqr[l+1]] + vz[sqr[l+2]] + vz[sqr[l+3]] + 0x70000000; }
aWait(50); aFillRect(w, 160, 160, 48, 0, 0x000000);
for (centerz[6] = 0; (i = aArgMaxLstInt(centerz, 0, 7)) < 6; centerz[i] = 0) {
ymin = 99999; ymax = 0; c = AWin_col16(i + 1);
for (l = 0; l < 4; l++) {
j = sqr[i * 4 + (l + 3) % 4]; k = sqr[i * 4 + l];
buf = buf0; AUpdateMinMax(ymin, ymax, sy[k]);
if (sy[j] == sy[k]) continue;
if (sy[j] > sy[k]) {
buf = buf1; m = j; j = k; k = m; }
y1 = sy[k]; dx = (sx[k] - sx[j]) * 65536 / (y1 - sy[j]); x = sx[j] * 65536 + 32768;
for (y = sy[j]; y <= y1; y++) {
buf[y] = x >> 16; x += dx; }}
for (y = ymin; y <= ymax; y++) {
aFillRect(w, buf1[y] - buf0[y] + 1, 1, buf0[y], y, c); }}}

static int sqr[24] = { 7,6,2,3, 6,4,0,2, 1,0,4,5, 7,3,1,5, 3,2,0,1, 7,5,4,6 };
int sx[8], sy[8], buf0[160], buf1[160], ymin, ymax, x, y, c, dx, *buf, y1;
AWin *w = aOpenWin(256, 160, "kcube"); AVec3 vert[8], v[8], th; double centerz[7];
for (i = 0; i < 8; i++) {
vert[i] = AVec3_mul(100, AVec3_new((i >> 2) - 0.5, ((i >> 1) & 1) - 0.5, (i & 1) - 0.5)); }
for (th = AVec3_new(0, 0, 0); AWin_isClose(w) == 0; ) {
th = AVec3_add(th, AVec3_mul(2 * 3.14159265358979323 / 65536, AVec3_new(182, 273, 364)));
AMat33 mat = AMat33_mul(AMat33_rotZ(th.z), AMat33_mul(AMat33_rotY(th.y), AMat33_rotX(th.x)));
for (i = 0; i < 8; i++) {
v[i] = AMat33Vec3_mul(mat, vert[i]);
sx[i] = v[i].x * 300 / (v[i].z + 400) + 128;
sy[i] = v[i].y * 300 / (v[i].z + 400) + 80; }
for (l = 0; l < 6 * 4; l += 4) {
centerz[l / 4] = v[sqr[l]].z + v[sqr[l+1]].z + v[sqr[l+2]].z + v[sqr[l+3]].z + 1e6; }
aWait(50); aFillRect(w, 160, 160, 48, 0, 0x000000);
for (centerz[6] = 0; (i = aArgMaxLstDbl(centerz, 0, 7)) < 6; centerz[i] = 0) {
ymin = 99999; ymax = 0; c = AWin_col16(i + 1);
for (l = 0; l < 4; l++) {
j = sqr[i * 4 + (l + 3) % 4]; k = sqr[i * 4 + l];
buf = buf0; AUpdateMinMax(ymin, ymax, sy[k]);
if (sy[j] == sy[k]) continue;
if (sy[j] > sy[k]) {
buf = buf1; m = j; j = k; k = m; }
y1 = sy[k]; dx = (sx[k] - sx[j]) * 65536 / (y1 - sy[j]); x = sx[j] * 65536 + 32768;
for (y = sy[j]; y <= y1; y++) {
buf[y] = x >> 16; x += dx; }}
for (y = ymin; y <= ymax; y++) {
aFillRect(w, buf1[y] - buf0[y] + 1, 1, buf0[y], y, c); }}}

| コメント | お名前 | NameLink | |