AWin *w = aOpenWin(640, 480, "3dwave");
int t, x, y, gx[42][42], gy[42][42];
for (t = 0; AWin_isClose(w) == 0; t++) {
aWait(8); 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(d - 0.1 * t) * 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); }}}}

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], b0[160], b1[160], thx, thy, thz, xp, xa, yp, ya, zp, za, xt, yt, zt, t;
AWin *w = aOpenWin(256, 160, "kcube-i"); int y0, y1, x, y, c, dx, *b, yk;
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 = 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; ) {
y0 = 999; y1 = 0; c = AWin_col16(i + 1); centerz[i] = 0; i = i * 4;
for (l = 0; l < 4; l++) {
b = b0; j = sqr[i + l]; k = sqr[i + (l + 1) % 4]; AUpdateMinMax(y0, y1, sy[j]);
if (sy[j] == sy[k]) continue;
if (sy[j] > sy[k]) { b = b1; ASwapTmp(j, k, m); }
yk = sy[k]; dx = (sx[k] - sx[j]) * 65536 / (yk - sy[j]); x = sx[j] * 65536 + 32768;
for (y = sy[j]; y <= yk; y++) { b[y] = x >> 16; x = x + dx; }}
for (y = y0; y <= y1; y++) { aFillRect(w, b1[y] - b0[y] + 1, 1, b0[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], b0[160], b1[160], y0, y1, x, y, c, dx, *b, yk;
AWin *w = aOpenWin(256, 160, "kcube"); AVec3 vert[8], v[8], th; double centerz[7], t;
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(3.14159265358979323 / 180, AVec3_new(1.0, 1.5, 2.0)));
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]); t = 300.0 / (v[i].z + 400);
sx[i] = v[i].x * t + 128; sy[i] = v[i].y * t + 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; ) {
y0 = 999; y1 = 0; c = AWin_col16(i + 1); centerz[i] = 0; i = i * 4;
for (l = 0; l < 4; l++) {
b = b0; j = sqr[i + l]; k = sqr[i + (l + 1) % 4]; AUpdateMinMax(y0, y1, sy[j]);
if (sy[j] == sy[k]) continue;
if (sy[j] > sy[k]) { b = b1; ASwapTmp(j, k, m); }
yk = sy[k]; dx = (sx[k] - sx[j]) * 65536 / (yk - sy[j]); x = sx[j] * 65536 + 32768;
for (y = sy[j]; y <= yk; y++) { b[y] = x >> 16; x += dx; }}
for (y = y0; y <= y1; y++) { aFillRect(w, b1[y] - b0[y] + 1, 1, b0[y], y, c); }}}

#include <acl1.c>
AClass(Isect) { AVec3 hitPoint, nor, col; double distance; };
AClass(Object) { AVec3 pos, col, nor; double rad; /* radius */ }; // Sphere(pos, col, rad) or Plane(pos, col, nor).
AClass(Util) { AVec3 light; Object s1, s2, s3, p; };
AInt32 col256(double t) { return (AInt32) (255.99999 * aSaturateDbl(t, 0.0, 1.0)); }
void Sphere_intersect(Object s, AVec3 rayOrigin, AVec3 rayDir, AVec3 light, Isect *i) {
AVec3 rs = AVec3_sub(rayOrigin, s.pos);
double b = AVec3_dot(rs, rayDir), c = AVec3_dot(rs, rs) - s.rad * s.rad, d = b * b - c;
if (d < 0.0) return;
double t = - b - sqrt(d);
if (t < 1.0e-4 || t > i->distance) return;
i->hitPoint = AVec3_add(rayOrigin, AVec3_mul(t, rayDir)); i->distance = t;
i->nor = AVec3_normalize(AVec3_sub(i->hitPoint, s.pos));
i->col = AVec3_mul(aSaturateDbl(AVec3_dot(light, i->nor), 0.1, 1.0), s.col); }
void Plane_intersect(Object p, AVec3 rayOrigin, AVec3 rayDir, AVec3 light, Isect *i) {
double d = - AVec3_dot(p.pos, p.nor), v = AVec3_dot(rayDir, p.nor);
if (v * v < 1.0e-30) return;
double t = - (AVec3_dot(rayOrigin, p.nor) + d) / v;
if (t < 1.0e-4 || t > i->distance) return;
AVec3 hp = i->hitPoint = AVec3_add(rayOrigin, AVec3_mul(t, rayDir));
i->distance = t; i->nor = p.nor;
double d2 = aSaturateDbl(AVec3_dot(light, i->nor), 0.1, 1.0);
if ((aReminder1(hp.x, 2) - 1) * (aReminder1(hp.z, 2) - 1) > 0) { d2 = d2 / 2; }
i->col = AVec3_mul(d2 * (1.0 - aSaturateDbl(fabs(hp.z) * 0.04, 0.0, 1.0)), p.col); }
void Util_intersect(Util u, AVec3 rayOrigin, AVec3 rayDir, Isect *i) {
i->distance = 1.0e+30;
Sphere_intersect(u.s1, rayOrigin, rayDir, u.light, i);
Sphere_intersect(u.s2, rayOrigin, rayDir, u.light, i);
Sphere_intersect(u.s3, rayOrigin, rayDir, u.light, i);
Plane_intersect (u.p, rayOrigin, rayDir, u.light, i); }
void aMain(AComArg *aCA) {
Util u; Isect i; AInt16 ix, iy, j;
u.s1.rad = 0.5; u.s1.pos = AVec3_new( 0.0, -0.5, 0.0); u.s1.col = AVec3_new(1, 0, 0);
u.s2.rad = 1.0; u.s2.pos = AVec3_new( 2.0, 0.0, cos(6.66)); u.s2.col = AVec3_new(0, 1, 0);
u.s3.rad = 1.5; u.s3.pos = AVec3_new(-2.0, 0.5, cos(3.33)); u.s3.col = AVec3_new(0, 0, 1);
u.p.nor = AVec3_new(0, 1, 0); u.p.pos = AVec3_new(0, -1, 0); u.p. col = AVec3_new(1, 1, 1);
AWin *win = aOpenWin(512, 384, "kray"); u.light = AVec3_new(0.577, 0.577, 0.577);
for (iy = 0; iy < 384; iy++) {
for (ix = 0; ix < 512; ix++) {
AVec3 rayDir = AVec3_normalize(AVec3_new(ix / 256.0 - 1, (384 - iy) / 256.0 - 1, -1));
Util_intersect(u, AVec3_new(0.0, 2.0, 6.0), rayDir, &i);
AVec3 dstCol = AVec3_mul(rayDir.y, AVec3_new(1, 1, 1));
if (i.distance < 1.0e+30) {
AVec3 tmpCol = dstCol = i.col;
for (j = 1; j < 4; j++) {
rayDir = AVec3_add(rayDir, AVec3_mul(-2.0 * AVec3_dot(rayDir, i.nor), i.nor));
Util_intersect(u, i.hitPoint, rayDir, &i);
if (i.distance >= 1.0e+30) break;
tmpCol = AVec3_new(tmpCol.x * i.col.x, tmpCol.y * i.col.y, tmpCol.z * i.col.z);
dstCol = AVec3_add(dstCol, tmpCol); }}
aSetPix(win, ix, iy, aRgb8(col256(dstCol.x), col256(dstCol.y), col256(dstCol.z))); }}}

static int dx[4] = { 1, -1, 0, 0 }, dy[4] = { 0, 0, 1, -1 }, d[4];
AWin *w = aOpenWinEx(47, 31, "maze"); aEchBox(w, 47, 31, 0, 0, 1, 2, 0); aEch(w, 1, 1, 0, 0, 0);
for (i = 0; i < 1000000; i++) {
AInt x = aRnd(23) * 2 + 1, y = aRnd(15) * 2 + 1, xx, yy;
if (aGetEch(w, x, y) == 0) {
for (;;) {
for (j = 0; j < 4; j++) { // 四方の状態を調べる.
d[j] = 0; xx = x + dx[j]; yy = y + dy[j];
if (1 <= xx && xx <= 45 && 1 <= yy && yy <= 29) {
d[j] = aGetEch(w, xx, yy) * aGetEch(w, xx + dx[j], yy + dy[j]); }}
j = aArgMaxRndInt(d, 0, 4);
if (d[j] == 0) break;
aEch(w, x + dx[j], y + dy[j], 0, 0, 0);
x = x + dx[j] * 2; y = y + dy[j] * 2; aEch(w, x, y, 0, 0, 0); }}}

AWin *w = aOpenWin(640, 480, "3dwave-i");
int t, x, y, gx[42 * 42], gy[42 * 42];
for (t = 0; AWin_isClose(w) == 0; t++) {
aWait(8); aFillRect(w, 640, 480, 0, 0, 0x000000);
for (y = -20; y <= 21; y++) {
for (x = -20; x <= 21; x++) {
int d = aFf16Sqrt((x * x + y * y) * 65536);
int z = aFf16Sin(((d * 652) >> 12) - 1043 * t) * 50 / (d + 327680);
int x0 = x + 19, y0 = y + 19, x1 = x + 20, y1 = y + 20;
int y1x1 = y1 * 42 + x1, y0x0 = y0 * 42 + x0, y0x1 = y0 * 42 + x1, y1x0 = y1 * 42 + x0;
gx[y1x1] = (x * 2 - y * 2 + z * 0) * 4 + 320;
gy[y1x1] = (x * 2 + y * 2 + z * 1) * 2 + 240;
if (x0 >= 0 && y0 >= 0) {
aDrawLine(w, gx[y0x0], gy[y0x0], gx[y0x1], gy[y0x1], 0x00ffff);
aDrawLine(w, gx[y0x0], gy[y0x0], gx[y1x0], gy[y1x0], 0x00ffff); }}}}

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