四次元物理方程式をプログラミングしてみた

「四次元とは何ぞや」と問うた時に「3次元xyz空間に時間tが進行する時空xyztのこと」を了承した上で話しを進めます。空間xyzと時間tは同じ次元で考えちゃダメだろうという意見も分かるのですが、プログラムの世界でどれも整数なり実数なりで数として表現できるので、xyzは1ピクセルとしてtは10ミリ秒くらいの感覚で、同心円がコサインカーブで時間の変化とともに波打つ、というようなことを四次元方程式で表して画面にレーダーのように投射するプログラムを書きました。

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.ImageIcon;
import java.awt.Container;
import java.awt.BorderLayout;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.Color;
import java.util.Calendar;

import java.awt.*;
import java.awt.event.*;

import java.lang.Math;

class DrawPanel extends JPanel implements Runnable {

    public void gameStart() {
    game_loop = new Thread(this);
    game_loop.start();
    }

    private Thread game_loop;
    private int t;
    public void run() {
        t = 0;
    while( true ) {
            try {
                Thread.sleep(10);
            } catch(InterruptedException e){
                e.printStackTrace();
            }
        t++;
        this.repaint();
    }
    }

    @Override
    public void paintComponent(Graphics g) {
    Graphics2D g2D = (Graphics2D) g;
        g.setColor(Color.black);
    double panelWidth = this.getWidth();
    double panelHeight = this.getHeight();
        int ymin[];
    int ymax[];
    int px;
        int py;
        int y;
    ymin = new int[640];
    ymax = new int[640];
        double Rd = 3.14159 / 180;
        for(int i = 0; i<= 639; i++){
            ymin[i] = 399; ymax[i] = 0;
        }
        for( int z = 200; z > -200; z -= 10){
            for( int x = -200; x < 200; x++ ){
            int buff = x * x + z * z;
        double h = 3 * Math.cos(t / 10 * Rd);
                y = (int)(30 * Math.cos(h * Math.sqrt(buff) * Rd));
                px = (int)(320 + x * Math.cos(-30 * Rd) + z * Math.sin(-30 * Rd));
                py = (int)(200 - (y * Math.cos(30 * Rd) - (-x * Math.sin(-30 * Rd) + z * Math.cos(-30 * Rd)) * Math.sin(30 * Rd)));
                if( py < ymin[px] ){
                    ymin[px] = py;
                    g.drawLine(px, py, px + 1, py + 1);
                }
                if( py > ymax[px] ) {
                    ymax[px] = py;
                    g.drawLine(px, py, px + 1, py + 1);
        }
            }
        }
    }
};

class Dimension extends JFrame{
    private DrawPanel FBI;
    public static void main(String args[]){
    Dimension frame = new Dimension();
    frame.setVisible(true);
    }

    Dimension(){
    setTitle("Dimension");
    setBounds(100, 100, 640, 480);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    Container contentPane = getContentPane();
    FBI = new DrawPanel();
    contentPane.add(FBI);
    
    FBI.gameStart();
    }

};

最終的には二次元投射なので、何か線がバタついているだけにしか見えないかも知れませんが、数学の授業で先生が黒板に線をフニャフニャ引いたのが立体に見えたりした人はコレが見えるかも。近頃ではもっと上手なというか綺麗な4DCGが「三次元」として売られているので、三次元は三次元だろと信じている人には時間tは感じられないのかも知れません。あまりアップするに際して良いイメージはないです。「ナニコレ」言われたりコピペで宿題に使われたりしそうなテーマだと思うんですけどね。その昔に催し物のスピーチで四次元CGに触れて「昔のアレは何だったんだ?」と思い出して、言ったことくらいは人から見える形に残しておいてやろうとね。
アニメーションをもっと滑らかにしました。方程式も少し変えました。古いバージョンはもういらないとコードを書き換えましたが、前のバージョンはギットハブに残しています。ホリエモンのロケット失敗のニュース残念!でも夢あるっていいよね。失敗しても次に向かって頑張ってこう。よく28号までカネが続いたな、鉄人。みたいな感じで。