kcubei.c[38行]
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); }}}