kcubei.c[61行]
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], scx[8], scy[8];
int centerz[6], buf0[160], buf1[160], thx, thy, thz, xp, xa, yp, ya, zp, za, xt, yt, zt, t;
int k0, k1, k2, e0x, e0y, e1x, e1y, l1, p0x, p0y, p1x, p1y, ymin, ymax, x, y, c, dx, *buf, y0, y1;
AWin *w = aOpenWin(256, 160, "kcube-i");
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) & 0xffff;
thy = (thy + 273) & 0xffff;
thz = (thz + 364) & 0xffff;
xp = aFf16Cos(thx); xa = aFf16Sin(thx);
yp = aFf16Cos(thy); ya = aFf16Sin(thy);
zp = aFf16Cos(thz); za = aFf16Sin(thz);
aFillRect(w, 160, 160, 48, 0, 0x000000);
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 = 4915200 / ((vz[i] + 13107200) >> 16);
scx[i] = aMul64Shr(vx[i], t, 31) + 128;
scy[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; }
for (;;) {
j = aArgMaxRndInt(centerz, 0, 6);
if (centerz[j] <= 0) break;
centerz[j] = 0; l = j * 4; l1 = l + 4;
k = sqr[l + 3]; p0x = scx[k]; p0y = scy[k];
ymin = 99999; ymax = 0;
for (; l < l1; l++) {
k = sqr[l];
p1x = scx[k]; p1y = scy[k];
if (ymin > p1y) { ymin = p1y; }
if (ymax < p1y) { ymax = p1y; }
if (p0y != p1y) {
if (p0y < p1y) {
buf = buf0; y0 = p0y; y1 = p1y; dx = p1x - p0x; x = p0x;
} else {
buf = buf1; y0 = p1y; y1 = p0y; dx = p0x - p1x; x = p1x; }
dx = dx * 65536 / (y1 - y0);
x = x * 65536 + 0x8000;
if (dx < 0) { x -= 0x10000; }
for (y = y0; y <= y1; y++) {
buf[y] = x >> 16;
x += dx; }}
p0x = p1x; p0y = p1y; }
c = AWin_col16(j + 1);
for (y = ymin; y <= ymax; y++) {
p0x = buf0[y];
p1x = buf1[y];
if (p0x <= p1x) {
aFillRect(w, p1x - p0x + 1, 1, p0x, y, c);
} else {
aFillRect(w, p0x - p1x + 1, 1, p1x, y, c); }}}
aWait(50); }